L'intention FLAG_GRANT_READ_URI_PERMISSION à l'Aide de FileProvider en pain d'épice
J'ai un problème lorsque j'essaie de joindre plusieurs fichiers à partir de mon espace de stockage interne à un e-mail intention en leur fournissant l'aide d'un FileProvider déclaré dans mon manifeste et l'octroi de le lire uri autorisations. Voici mon code.
Manifeste
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.company.example.logprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
Intention De Création
emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,new String[] {"randomemailaddress"});
ArrayList<Uri> uris = new ArrayList<Uri>();
File directory = getFilesDir();
File[] list = directory.listFiles();
for (File f : list) {
if (f.getName().contains("log") && f.getName().contains(".txt"))
uris.add(FileProvider.getUriForFile(this, "com.company.example.logprovider",f));
}
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
La Question
Cela fonctionne bien sur les deux appareils fonctionnant Jelly Bean toutefois, il ne fonctionne pas pour les deux appareils fonctionnant en pain d'épice.
L'exception que je reçois est comme suit.
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.google.android.gm/com.google.android.gm.ComposeActivity}: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{40b2db08 3885:com.google.android.gm/10110} (pid=3885, uid=10110) requires null or null
E/AndroidRuntime( 3885): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
E/AndroidRuntime( 3885): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
E/AndroidRuntime( 3885): at android.app.ActivityThread.access$1500(ActivityThread.java:121)
E/AndroidRuntime( 3885): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
E/AndroidRuntime( 3885): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3885): at android.os.Looper.loop(Looper.java:138)
E/AndroidRuntime( 3885): at android.app.ActivityThread.main(ActivityThread.java:3701)
E/AndroidRuntime( 3885): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3885): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 3885): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
E/AndroidRuntime( 3885): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
E/AndroidRuntime( 3885): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 3885): Caused by: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{40b2db08 3885:com.google.android.gm/10110} (pid=3885, uid=10110) requires null or null
E/AndroidRuntime( 3885): at android.os.Parcel.readException(Parcel.java:1322)
E/AndroidRuntime( 3885): at android.os.Parcel.readException(Parcel.java:1276)
E/AndroidRuntime( 3885): at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:1882)
E/AndroidRuntime( 3885): at android.app.ActivityThread.getProvider(ActivityThread.java:3365)
E/AndroidRuntime( 3885): at android.app.ActivityThread.acquireProvider(ActivityThread.java:3390)
E/AndroidRuntime( 3885): at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1728)
E/AndroidRuntime( 3885): at android.content.ContentResolver.acquireProvider(ContentResolver.java:754)
E/AndroidRuntime( 3885): at android.content.ContentResolver.query(ContentResolver.java:262)
E/AndroidRuntime( 3885): at com.google.android.gm.ComposeArea.addAttachment(ComposeArea.java:736)
E/AndroidRuntime( 3885): at com.google.android.gm.ComposeArea.initFromExtras(ComposeArea.java:699)
E/AndroidRuntime( 3885): at com.google.android.gm.ComposeActivity.initFromExtras(ComposeActivity.java:1482)
E/AndroidRuntime( 3885): at com.google.android.gm.ComposeActivity.finishOnCreateAfterAccountSelected(ComposeActivity.java:1020)
E/AndroidRuntime( 3885): at com.google.android.gm.ComposeActivity.onCreate(ComposeActivity.java:259)
E/AndroidRuntime( 3885): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 3885): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
E/AndroidRuntime( 3885): ... 11 more
Mes Pensées
Donc quelque part en bas de la ligne, la FLAG_GRANT_READ_URI_PERMISSION drapeau j'ajoute à l'intention n'est pas de travail?
Je crois aussi que le problème est peut-être parce que je suis fixation de l'uri de l'intention comme EXTRA_STREAM
et pour une raison quelconque, les anciennes versions d'Android n'est pas de prendre cette place? (n'avons pas trouvé aucune documentation sur ce encore).
Toute aide est appréciée.
Oui je l'ai fait, cependant
grantUriPermission
permet uniquement des forfaits spécifiques pour être en mesure d'accéder à l'uriQue diriez - stackoverflow.com/questions/21275898/...?
OriginalL'auteur StuStirling | 2014-02-10
Vous devez vous connecter pour publier un commentaire.
Comme un dernier recours, si vous ne pouvez pas fournir de nom de package que vous pouvez accorder l'autorisation à toutes les applications qui peuvent gérer l'intention spécifique:
il n'y a rien de pire qu'une bonne réponse, avec un lien mort. Je dirais que le copier, et de donner du crédit d'où il vient, ce serait une meilleure option.
Bon point! Linkrot est effectivement un problème. Toutefois, de donner crédit ne peut pas être d'une grande utilité si nous ne pouvons pas trouver le post original... et puis, pourquoi ne pas lier + résumer + crédit?
OriginalL'auteur Digvesh Patel