gpt4 book ai didi

android - Intent FLAG_GRANT_READ_URI_PERMISSION 在 Gingerbread 中使用 FileProvider

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:55 28 4
gpt4 key购买 nike

我有一个问题,我试图通过使用我的 list 中声明的​​ FileProvider 提供它们并授予读取 uri 权限,将我的内部存储中的多个文件附加到电子邮件 Intent 。这是我的代码。

list

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

Intent 创建

        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);

问题

这在运行 Jelly Bean 的两台设备上运行良好,但不适用于运行 Gingerbread 的两台设备。

我得到的异常如下。

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

我的想法

所以在某处,我添加到 Intent 中的 FLAG_GRANT_READ_URI_PERMISSION 标志不起作用?

我也相信这个问题可能是因为我将 uris 作为 EXTRA_STREAM 附加到 intent 并且出于某种原因,旧的 Android 版本不接受这个? (尚未找到关于此的任何文档)。

感谢任何帮助。

最佳答案

context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

//revoke permisions
context.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

作为最后的手段,如果您不能提供包名称,您可以将权限授予所有可以处理特定 Intent 的应用:

//grant permisions for all apps that can handle given intent
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
...
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}

关于android - Intent FLAG_GRANT_READ_URI_PERMISSION 在 Gingerbread 中使用 FileProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21680905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com