1

Je suis en train d'enregistrer une image dans un dossier nommé "appFolder" en utilisant caméra android.Mon cible sdk est 25.Mon appareil fonctionne sur android nougat. Cependant, quand je clique sur l'image en utilisant "dispatchTakePictureIntent()". L'image n'est pas enregistrée dans appFolder. Elle est enregistrée dans le dossier DCIM/camera. Pourquoi cela se passe-t-il et comment l'enregistrer dans mon dossier personnalisé?Android image capturée en utilisant l'appareil photo ne sont pas enregistrés dans le dossier personnalisé spécifié sur 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; 
     } 

Fournisseur de 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> 

Répondre

2

, il est en partie parce que vous n'avez pas appelé addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) sur le Intent. En l'état, l'autre application n'a pas accès en écriture à l'emplacement identifié par votre Uri. Cependant, gardez à l'esprit que les applications de caméras tierces ont des bogues. Idéalement, ils honorent EXTRA_OUTPUT. Certains, cependant, ne sera pas:

  • ... parce qu'ils ne tiennent pas compte EXTRA_OUTPUT en général, ou
  • ... parce qu'ils ne savent pas comment faire face au régime content sur le Uri dans EXTRA_OUTPUT (même Google propre application de la caméra a eu ce problème jusqu'à la mi-2016)

FWIW, this sample app montre en utilisant ACTION_IMAGE_CAPTURE avec FileProvider.

+0

a ajouté la ligne takePictureIntent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); .... mais n'était pas utile –

+0

@PrateekRatnaker: Ensuite, l'application de la caméra décide de stocker l'image où elle veut, indépendamment de «EXTRA_OUTPUT». Il n'y a rien que vous puissiez faire à ce sujet. – CommonsWare

+0

Puis-je obtenir le chemin de l'image enregistrée sur le résultat de l'activité et le copier à l'emplacement souhaité? –