当前位置: 首页 > 知识库问答 >
问题:

Android 10-文件提供程序-权限拒绝:读取Android.support.v4.content.FileProvider uri

谷梁嘉运
2023-03-14

我尝试生成一个CSV文件(加速度计的),将其保存到我的context.getFilesDir(),然后使用FileProvider将其共享到Google Drive。

  1. 根据其他人的建议添加了granturipermission()intent.addflags(intent.flag_grant_read_uri_permission)
  2. 我尝试写入Environment.GetExternalStorageDirectory(),但由于我的电话没有外部存储,因此无法运行。
  3. 我无法导出提供程序,因为它也会引发错误。

那我能做什么呢?或者这是生成和共享CSV文件的更好方法吗?如有任何建议,我将不胜感激。谢谢你们,伙计们。

当前代码段

在AndroidManifest.xml中:

    <application...>
        ...

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

    </application>

在provider_path.xml中

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

在mainactivity.java中

    private void onShareCSV() {

        Uri path = FileProvider.getUriForFile(this, "com.example.FileProvider", new File(filePath + fileName));

        Log.d(TAG, "onShareCSV: " + path);
        Intent shareIntent = new Intent("com.example.FileProvider").setData(path);

        List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(shareIntent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            getApplicationContext().grantUriPermission(packageName, path, Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }

        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, "This is a CSV I'm sharing.");
        shareIntent.putExtra(Intent.EXTRA_STREAM, path);
        shareIntent.setType("text/csv");
        startActivity(Intent.createChooser(shareIntent, "Share..."));
        this.setResult(RESULT_OK, shareIntent);
    }

这里有个错误

2020-02-20 23:45:02.751 21484-21503/com.example.charleschung.mci_pa1 E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://com.example.FileProvider/files/sensor-1582260302226.csv from pid=21581, uid=1000 requires the provider be exported, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:729)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:602)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:231)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:104)
        at android.os.Binder.execTransactInternal(Binder.java:1021)
        at android.os.Binder.execTransact(Binder.java:994)

共有1个答案

上官景铄
2023-03-14

首先,您应该检查构建版本代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        Uri path = FileProvider.getUriForFile(this,getApplicationContext().getPackageName() +  ".FileProvider", new File(filePath + fileName)); 

                    } else{
                        Uri path =Uri.fromFile(new File(filePath + fileName)) 
                    }

我希望这是有用的

 类似资料:
  • 我有两个app:app1和app2。 App2具有: paths.xml: App2在其活动中从App1接收获取映像URI的请求。确定URI后,App2活动执行以下操作: 从App2接收回结果后,App1执行以下操作: 在App1中,从App2返回时,我得到以下异常: java.lang.SecurityException:权限拒绝:从ProcessRecord{52a99eb0 3493:com

  • 我已经创建了一个自定义内容提供者,它将被更多的应用程序访问。我已经在我的提供者AndroidManifest中包含了权限标记。xml文件,在第二个应用程序中,我包含了uses-permissions标记,但没有成功。Logcat向我展示: 我也搜索过类似的问题,但似乎一切都是正确的。有什么想法吗?谢谢 这是我的提供者AndroidManifest。xml文件: 这是我的第二个应用程序Android

  • 并且我在App2清单中添加了权限: 但我得到了这个错误: java.lang.SecurityException:拒绝权限:从ProcessRecord{46a1928 24678:com.x.x.myApplication11/U0a165}(PID=24678,UID=10165)打开提供程序com.x.x.adminapp.read_database或com.x.x.adminapp.wri

  • 我在尝试在Android emulator中执行应用程序升级时遇到了一些问题。该场景的流程来自一个活动,我将执行打开片段A的AsyncTask A,然后在AsyncTask A中,我将检查版本升级是否可用。 如果可用并且用户从片段A中选择了“OK”,我将转到AsyncTask B打开片段B,它向用户显示一条消息,说明正在进行升级。在AsyncTask B doInbackground()中,我将执

  • java.lang.SecurityException:权限拒绝:从ProcessRecord{932688f 12849:mobi.hubbler.app/U0A158}(PID=12849,uid=10158)打开提供程序com.miui.gallery.provider.GalleryOpenProvider,而该提供程序不是从uid 10034导出的 试图从URI获取位图。这个问题只发生在

  • 我开始图像拾取器的意图使用: 在中,我获取所有选中图像的URI,启动在后台运行的作业并上传这些图像(https://github.com/yigit/android-priority-jobqueue)。但如果按下“后退”按钮并退出活动,则任何未启动的作业在运行并抛出异常时都无法访问选定的映像: java.lang.SecurityException:拒绝权限:从ProcessRecord{...