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

Java Android 10-文件提供程序-权限拒绝:读取Android.support.v4.content.FileProvider uri,java,android,android-fileprovider,Java,Android,Android Fileprovider,我试图生成一个CSV文件(加速度计),将其保存到我的上下文.getFilesDir(),然后使用FileProvider将其共享到Google Drive 问题是当我尝试共享它时,错误将异常写入包,java.lang.SecurityException:权限拒绝:读取android.support.v4.content.FileProvider uricontent://...csv 要求导出提供程序,否则grantUriPermission()将继续发生 我有 按照其他人的建议,添加了gran

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

问题是当我尝试共享它时,错误
将异常写入包
java.lang.SecurityException:权限拒绝:读取android.support.v4.content.FileProvider uricontent://...csv 要求导出提供程序,否则grantUriPermission()将继续发生

我有

  • 按照其他人的建议,添加了
    grantUriPermission()
    Intent.addFlags(Intent.FLAG\u GRANT\u READ\u URI\u PERMISSION)
  • 我试图写入
    环境。getExternalStorageDirectory()
    ,但由于我的手机没有外部存储器,因此无法工作
  • 我无法导出提供程序,因为它也会引发错误
  • 那我该怎么办?或者这是生成和共享CSV文件的更好方法?如有任何建议,将不胜感激。谢谢大家

    现在的代码片段

    在AndroidManifest.xml中:

    
    ...
    
    在provider_path.xml中

    
    
    在mainActivity.java中

    private void onShareCSV(){
    uripath=FileProvider.getUriForFile(这是“com.example.FileProvider”,新文件(filePath+fileName));
    Log.d(标记“onShareCSV:+路径);
    Intent shareIntent=newintent(“com.example.FileProvider”).setData(路径);
    List resinfo List=getPackageManager().queryInputActivities(仅限shareIntent、PackageManager.MATCH_DEFAULT_);
    对于(ResolveInfo ResolveInfo:ResInfo列表){
    字符串packageName=resolveInfo.activityInfo.packageName;
    getApplicationContext().grantUriPermission(packageName、path、Intent.FLAG\u GRANT\u READ\u URI\u PERMISSION);
    }
    addFlags(Intent.FLAG\授予\读取\ URI\权限);
    shareIntent.setAction(Intent.ACTION\u SEND);
    putExtra(Intent.EXTRA_文本,“这是我正在共享的CSV”);
    shareIntent.putExtra(Intent.EXTRA_流,路径);
    shareIntent.setType(“文本/csv”);
    startActivity(Intent.createChooser(shareIntent,“共享…”);
    此.setResult(结果_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)
    

    我终于解决了。调出我的URI构造有一些问题。我把它改成了

    Context-Context=getApplicationContext();
    File filelocation=新文件(getFilesDir(),fileName);
    uripath=FileProvider.getUriForFile(上下文“com.example.charleschung.mci_pa1”,filelocation);
    

    它是有效的。希望有帮助:)

    首先,您应该检查生成版本代码

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

    我希望它能帮上忙

    我也有这个问题,但它和你的有点不同,我试图将文件保存在一个文件夹中。我缺少的是android 10的权限,所以我在清单中添加了这一行

    还有一行吗
    android:requestLegacyExternalStorage=“true”

    同时添加运行时权限


    Manifest.permission.ACCESS\u MEDIA\u LOCATION
    Uri path=FileProvider.getUriForFile(此……。
    。请告诉
    path.toString()的值
    @blackapps感谢您的回复,我已经重新格式化了代码段。路径值为'content://com.example.FileProvider/files/sensor-1582271002304.csv'.
    List resinfo List=getPackageManager().queryInputActivities(仅限shareIntent、PackageManager.MATCH_DEFAULT_);for(ResolveInfo ResolveInfo:Resinfo列表){String packageName=resolveInfo.activityInfo.packageName;getApplicationContext().grantUriPermission(packageName,path,Intent.FLAG\u GRANT\u READ\u URI\u PERMISSION);}
    请删除该代码。您不需要它。谢谢,但删除该代码后没有任何更改。我还能做什么?