Камера не работает / сохраняется при использовании Cache Uri в качестве MediaStore.EXTRA_OUTPUT

Я пытаюсь получить полное изображение после снимка из Fragment .

Если я использую Uri из файла ( Uri.fromFile(file) ), камера не выйдет после съемки и нажав кнопку «ok» (похоже, не может писать в Uri или кто знает, что) ,

Используя File String в форме '/data/data/com.package.bla/cache/img198346262jpg' , он не работает (файл там, но он пуст, потому что камера ничего не сохраняет на нем) ,

То, что я пробовал до сих пор:

  • Удаление файла после его создания, как показано в этом примере . Тем не менее, файл не существует после выхода камеры.
  • Добавлено разрешение на чтение с помощью внешнего хранилища, на всякий случай

Поэтому я понятия не имею, почему изображение не сохраняется и уже потрачено / потрачено много времени на тестирование и выясняется, почему он не работает.

Фрагмент:

 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 байтов внутри).

Объяснение : Проблема связана с сохранением в каталоге кеша. Может быть, это ошибка, у меня отсутствует разрешение или приложение для камеры просто не может сохранить в вашем личном каталоге данных вашего приложения. Добавление разрешения FLAG_GRANT_WRITE_URI_PERMISSION не решило его. Связанные должности: Сохранение изображения с камеры в каталог частного кэша приложений. Сохранение данных камеры в кеш при запуске с помощью намерения

ОБНОВЛЕНИЕ Начиная с 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; }