0

J'utilise l'API FileProvider pour partager du contenu stocké dans le stockage interne. Voici la configuration de mon xml qui est liée au fournisseur configuré dans le fichier Manifest.Partager un fichier audio à partir du répertoire/data/user/0/à l'aide de FileProvider

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <cache-path name="xs_audio" path="/audio/records"/> 
</paths> 

et le code que j'utilise pour partager suit:

private final static String FILE_PROVIDER = BuildConfig.APPLICATION_ID + ".fileprovider"; 

    private String testPackageAppHaveAccess = "com.whats"; 
      public static void shareDocument(Activity activity, CallRecordData data) { 
       Intent intent = new Intent(); 
       intent.setAction(Intent.ACTION_SEND_MULTIPLE); 
       intent.putExtra(Intent.EXTRA_SUBJECT, "Record File"); 
       intent.setType("audio/*"); 

       ArrayList<Uri> files = new ArrayList<>(); 
       //for (AudioModelObj image : data.getDocuments()) { 
        files.add(getImageUri(activity, data.getFile())); 
       //} 

       activity.grantUriPermission(testPackageAppHaveAccess, files.get(0), Intent.FLAG_GRANT_READ_URI_PERMISSION); 
       intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, files); 
       activity.startActivity(Intent.createChooser(intent, "Share Audio File.")); 
      } 

      private static Uri getImageUri(Activity activity, String audioURI) { 
       if (Build.VERSION.SDK_INT < 24) { 
        return Uri.parse(audioURI); 
       } else { 
        URI uri = URI.create(audioURI); 
        File file = new File(uri); 
        return FileProvider.getUriForFile(activity, FILE_PROVIDER, file); 
       } 
      } 
} 

mais en lançant avec application ce n'est pas fixer quoi que ce soit. Dans le cas de gmail, il est dit "impossible de joindre un fichier vide". Le fichier est valablement disponible car j'affiche la liste des fichiers et joue.

Pour référence: générer à partir de Uri getImageUri (..) est

/data/user/0/com.xl.cl.debug/cache/audio/records/17-10-17_170728_abc_.wav

Une suggestion de ce que je fais mal?

Répondre

2
  • <files-path> pointe déjà à ce que certains appareils seront /data/user/0/com.xl.cl.debug

  • <cache-path> est ce que vous devez utiliser, remplacer path avec juste le sous-répertoire d'intérêt (audio/records), éliminant ainsi le /data/user/0/com.xl.cl.debug/cache bit

  • Vous appelez grantUriPermission(), où le premier paramètre n'est pas un package

  • Vous appelez grantUriPermission(), où le premier paramètre est pas un package identifiant l'application à laquelle vous essayez d'accorder la permission

  • Vous n'êtes pas ajouterez FLAG_GRANT_READ_URI_PERMISSION au Intent, ce qui est la manière typique de dire « Uri dans ce Intent doit être lisible par le destinataire de ce Intent "(mais il est possible que ACTION_SEND_MULTIPLE exige plus de travail ici, comme je l'ai pas joué avec beaucoup)

  • Aucun chemin du système de fichiers dans l'histoire humaine a commencé avec content:/, alors débarrassez-vous de cela

  • Appel new File() et fournir une valeur qui n'est pas un chemin de système de fichiers ne va pas bien fonctionner

Il peut y avoir plus de problèmes que ceux-ci, mais que vous devriez aider à démarrer

+0

AFAIK, comme par [** doc développeur **] (https://developer.android.com/reference/android/support/v4/content/FileProvider.html#Permissions) _activity.grantUriPermission_ est correct, il doit appeler avec l'objet Context. Et ajouter le nom du paquet d'applications à qui il devrait permettre le partage n'est pas quelque chose qui sera un code rigide, alors que l'utilisateur peut avoir plusieurs applications. Veuillez vérifier que j'ai mis à jour la question. – CoDe

+0

Aussi je voulais partager un fichier audio, est-ce une bonne approche? – CoDe

+0

@code: Débarrassez-vous de l'URI et créez simplement le fichier.Utilisez un type MIME spécifique, pas un caractère générique. Et vous pouvez commencer avec un simple ACTION_SEND et un seul Uri pour commencer. – CommonsWare