1

Я пытаюсь сохранить изображение в папке с именем «appFolder» с помощью камеры Android. Мой целевой sdk - это 25. Мое устройство работает на Android нуги. Однако, когда я нажимаю изображение, используя «dispatchTakePictureIntent()». Изображение не сохраняется в appFolder. Оно сохраняется в папке DCIM/камера. Почему это происходит и как сохранить это в моей пользовательской папке?Изображение на Android, снятое с помощью камеры, не сохраняется в указанной пользовательской папке на android nougat

private void dispatchTakePictureIntent() { 
       Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       // Ensure that there's a camera activity to handle the intent 
       if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
        // Create the File where the photo should go 
        File photoFile = null; 
        try { 
         photoFile = createImageFile(); 
        } catch (IOException ex) { 
         // Error occurred while creating the File 
         Log.i("imageCaptutreError", ex.getMessage()); 

        } 
        // Continue only if the File was successfully created 
        if (photoFile != null) { 
         Uri photoURI = FileProvider.getUriForFile(this, 
           "com.abc.def", 
           photoFile); 
         takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
         startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
        } 
       } 
      } 

    private File createImageFile() throws IOException { 
      File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "appFolder"); 
      if (!folder.exists()) { 
       folder.mkdir(); 
      } 
      File tempFile = new File(folder, "temp_image.png"); 
        /*new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "appFolder" + File.separator + "temp_image.png");*/ 

      mCurrentPhotoPath = tempFile.getAbsolutePath(); 
      return tempFile; 
     } 

Provider в Mainifest

<provider 
       android:name="android.support.v4.content.FileProvider" 
       android:authorities="com.abc.def" 
       android:exported="false" 
       android:grantUriPermissions="true"> 
       <meta-data 
        android:name="android.support.FILE_PROVIDER_PATHS" 
        android:resource="@xml/file_paths"></meta-data> 
      </provider> 

@ XML/file_paths

<?xml version="1.0" encoding="utf-8"?> 
    <paths xmlns:android="http://schemas.android.com/apk/res/android"> 
     <external-path name="my_images" path="appFolder/" /> 
    </paths> 

ответ

2

Отчасти это происходит потому, что вы не называли addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) на Intent. В остальном, у другого приложения нет доступа на запись к местоположению, указанному вашим Uri.

Однако имейте в виду, что приложения сторонних приложений имеют ошибки. В идеале они чтят EXTRA_OUTPUT. Некоторые из них, однако, не будет:

  • ... потому что они игнорируют EXTRA_OUTPUT в целом, или
  • ... потому что они не знают, как бороться с content схеме на Uri в EXTRA_OUTPUT (даже Google, собственное приложение камеры была эта проблема до середины 2016 года)

FWIW, this sample app шоу с использованием ACTION_IMAGE_CAPTURE вместе с FileProvider.

+0

добавлена ​​строка takePictureIntent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); .... но не было полезно –

+0

@PrateekRatnaker: Тогда приложение камеры решает сохранить изображение там, где оно хочет, вне зависимости от 'EXTRA_OUTPUT'. Вы ничего не можете сделать по этому поводу. – CommonsWare

+0

Могу ли я получить путь к сохраненному изображению в результате действия и скопировать его в нужное место? –