android - 安卓新手问题,调用系统照相功能,在调用裁剪功能,然后显示图片。
高洛峰
高洛峰 2017-04-17 16:51:50
0
4
320

运行环境是SDK:23。
一个简单的拍照DEMO,拍完照,跳转到系统裁剪界面,裁剪保存完毕后,并显示。
但是,我在SD卡目录下,发现该文件“output_image.jpg”是0字节
**我简单的测试了一下,就是,当我不去调用系统的裁剪功能,照片确实是存在的。
但是一旦调用系统裁剪功能,却发现变成了0字节。**
不知道是不是逻辑代码错了,麻烦大神看一下。
权限
变量:private Uri imageUri;

//跳转到拍照,逻辑代码如下: takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { File outputImage = new File(Environment.getExternalStorageDirectory(), "output_image.jpg"); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } imageUri = Uri.fromFile(outputImage); Intent i = new Intent("android.media.action.IMAGE_CAPTURE"); i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(i, TAKE_PHOTO); } });
//回调函数,先是拍完照后,返回TAKE_PHOTO。 //然后再跳转到裁剪界面,返回CROP_PHOTO,并显示图片 switch (requestCode) { case TAKE_PHOTO: if (resultCode == RESULT_OK) { Intent i = new Intent("com.android.camera.action.CROP"); i.setDataAndType(imageUri, "image/*"); i.putExtra("scale", true); i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(i, CROP_PHOTO); } break; case CROP_PHOTO: if (resultCode == RESULT_OK) { try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); photo.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break; }


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信 (4)
伊谢尔伦

我尝试了下,你的代码在4.4的机器是运行正常,但是在5.0以上会出现你所说的问题。
既然在拍照时能保存正确的图片,那么问题就肯定出现在裁切的地方。这点上面两个答案都注意到了,但是问题的关键是,裁切时返回的resultCode==0也就是说裁切没有正常执行。你可以断点看看,你在resultCode == RESULT_OK里的代码是没有走的。
我注意到你在拍照和裁切这整个过程中只使用了一个uri,我觉得这是问题的关键。
在裁切时,你必须指定一个图片的uri,这点你做到了;但是你必须为裁切应用指定一个空的文件uri,裁切后的图片将保存到这里空的uri里。5.0之前没有这个要求,但是在5.0之后,这是必须的。你的代码中给的uri是要裁切的图片,所以裁切失败,返回的resultCode==0
我给你改了改,按照如下的代码,能够解决问题。你看看内存卡中,应该是由裁切后的图片的:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Uri croUri; switch (requestCode) { case TAKE_PHOTO: if (resultCode == RESULT_OK) { File cropImage = new File(Environment.getExternalStorageDirectory(), "o_crop_image.jpg"); try { if (cropImage.exists()) { cropImage.delete(); } cropImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } cropUri = Uri.fromFile(cropImage); Intent i = new Intent("com.android.camera.action.CROP"); i.setDataAndType(imageUri, "image/*"); i.putExtra("scale", true); i.putExtra(MediaStore.EXTRA_OUTPUT, cropUri); startActivityForResult(i, CROP_PHOTO); } break; case CROP_PHOTO: if (resultCode == RESULT_OK) { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); photo.setImageBitmap(bitmap); } break; }

我测试了下,在SD中能找到裁切后的图片的。

いいねを押す+0
    洪涛

    我的做法是:先生成目录,然后直接new file指定到拍照的输出Uri,并没有在拍照前创建一个空文件
    使用的action是MediaStore.ACTION_IMAGE_CAPTURE

    你拍完照片后可以去SD卡看下目录文件是否正常,然后再调用裁剪,因为我这边不是使用的系统自带的裁剪库,所以可能不能回答你清楚后面裁剪是否有问题,不过你可以试着裁剪输出的文件使用另一个文件看是否能成功,另外推荐下UCrop这个裁剪库,功能比较不错。

    いいねを押す+0
      伊谢尔伦

      你将i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
      改成i.putExtra("return-data",true);
      注意裁剪的代码段

      いいねを押す+0
        小葫芦

        魅族4.4测试没有问题

        いいねを押す+0
          最新のダウンロード
          詳細>
          ウェブエフェクト
          公式サイト
          サイト素材
          フロントエンドテンプレート
          私たちについて 免責事項 Sitemap
          PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!