使用Cache Uri作为MediaStore.EXTRA_OUTPUT时,相机不能正常工作/保存

我想从Fragment拍摄照片后得到完整的图像。

如果我使用文件( Uri.fromFile(file) )中的Uri,拍照并点击“确定”button后摄像机不会退出(看起来不能写入Uri或谁知道什么) 。

使用File String ,以'/data/data/com.package.bla/cache/img198346262jpg'的forms,它不工作(文件在那里,但它是空的,因为相机没有保存任何东西) 。

我到目前为止所尝试的是:

  • 创build后删除文件,如本例所示 。 但是,相机退出后文件不存在。
  • 以防万一,增加了外部存储读取权限

所以我不知道为什么这个图像没有被保存,而且已经浪费了大量的时间来testing和判断它不工作的原因。

分段:

 private void launchCamera() { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); File outputDir = getActivity().getCacheDir(); File file = null; try { file = File.createTempFile("img", "jpg", outputDir); } catch (IOException e) { e.printStackTrace(); } if (file != null) { mImageUri = Uri.fromFile(file); //using Uri is not even exiting the camera //mImageUri = File.toString(); //If I use String instead of an Uri, it works better (ie, can accept camera photo) cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(cameraIntent, RESULT_TAKE_IMAGE); } } public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { Bitmap original = BitmapFactory.decodeFile(mImageUri.toString(), bounds); } } 

编辑的代码,mImageUri。 正如所解释的,如果我使用Uri,我甚至不能接受相机应用程序中的照片。 使用string将让我接受照片,虽然照片不是实际保存(即文件中有0字节)。

说明 :问题与保存到caching目录有关。 也许这是一个错误,我缺less一个权限或相机应用程序不能保存到您的应用程序的私人数据目录。 添加权限FLAG_GRANT_WRITE_URI_PERMISSION没有解决它。 相关文章:将相机中的图像存储到私人应用程序caching目录中 , 并在通过意图启动时将相机数据保存到caching中

更新从Android 2.2开始,可以使用getExternalCacheDir()方法代替getCacheDir()

Solutions Collecting From Web of "使用Cache Uri作为MediaStore.EXTRA_OUTPUT时,相机不能正常工作/保存"

为什么不把它保存在一个新的文件

  final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator); root.mkdirs(); final String fname = "img_"+ System.currentTimeMillis() + ".jpg"; final File sdImageMainDirectory = new File(root, fname); mImageUri = Uri.fromFile(sdImageMainDirectory); 

然后把这个uri传给意图

  cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); 

试试这个和我一样的魅力

 private String selectedImagePath = ""; final private int PICK_IMAGE = 1; final private int CAPTURE_IMAGE = 2; public Uri setImageUri() { // Store image in dcim File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png"); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath(); return imgUri; } public String getImagePath() { return imgPath; } btnGallery.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE); } }); btnCapture.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri()); startActivityForResult(intent, CAPTURE_IMAGE); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_CANCELED) { if (requestCode == PICK_IMAGE) { selectedImagePath = getAbsolutePath(data.getData()); imgUser.setImageBitmap(decodeFile(selectedImagePath)); } else if (requestCode == CAPTURE_IMAGE) { selectedImagePath = getImagePath(); imgUser.setImageBitmap(decodeFile(selectedImagePath)); } else { super.onActivityResult(requestCode, resultCode, data); } } } public Bitmap decodeFile(String path) { try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, o); // The new size we want to scale to final int REQUIRED_SIZE = 70; // Find the correct scale value. It should be the power of 2. int scale = 1; while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE) scale *= 2; // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeFile(path, o2); } catch (Throwable e) { e.printStackTrace(); } return null; } public String getAbsolutePath(Uri uri) { String[] projection = { MediaColumns.DATA }; @SuppressWarnings("deprecation") Cursor cursor = managedQuery(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } else return null; }