【问题标题】:SecurityException: Permission Denial: opening provider using FileProviderSecurityException:权限拒绝:使用 FileProvider 打开提供程序
【发布时间】:2014-07-30 11:03:35
【问题描述】:

我有一个应用程序,它会将文件发送到其他已安装的应用程序。我正在使用 FileProvider 来做到这一点。

它在 4.2 中运行良好,但真正的问题是在 2.3 手机中。

这是我的提供者。

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

通过设置exported="true",我在stackoverflow 中几乎没有什么建议。但是 FileProvider 不允许附加提供者,如果是这样的话。

当其他应用程序访问Uri时,应用程序崩溃并显示以下消息。

java.lang.SecurityException: Permission Denial: opening provider com.example.sample.FileProvider from ProcessRecord{4079bd68 5637:com.google.android.apps.docs/10060} (pid=5637, uid=10060) requires null or null

Intent 是:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);

请帮帮我。

编辑 1: 我正在尝试通过形成 uri 发送文本文件:content://com.example.sample.provider/my_docs/sample.txt 到谷歌云端硬盘应用程序。

驱动器应用程序崩溃如下:

E/AndroidRuntime( 6502): Caused by: java.lang.SecurityException: Permission Denial: opening provider com.example.sample.FileProvider from ProcessRecord{406e05a8 6502:com.google.android.apps.docs/10060} (pid=6502, uid=10060) requires null or null
E/AndroidRuntime( 6502):    at android.os.Parcel.readException(Parcel.java:1322)
E/AndroidRuntime( 6502):    at android.os.Parcel.readException(Parcel.java:1276)
E/AndroidRuntime( 6502):    at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:1882)
E/AndroidRuntime( 6502):    at android.app.ActivityThread.getProvider(ActivityThread.java:3499)
E/AndroidRuntime( 6502):    at android.app.ActivityThread.acquireProvider(ActivityThread.java:3524)
E/AndroidRuntime( 6502):    at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1712)
E/AndroidRuntime( 6502):    at android.content.ContentResolver.acquireProvider(ContentResolver.java:757)
E/AndroidRuntime( 6502):    at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:488)
E/AndroidRuntime( 6502):    at android.content.ContentResolver.openInputStream(ContentResolver.java:328)
E/AndroidRuntime( 6502):    at rL.a(UriDataSource.java:40)
E/AndroidRuntime( 6502):    at rE.a(ItemToUpload.java:267)
E/AndroidRuntime( 6502):    at aDW.a(ExtraStreamDataSource.java:125)
E/AndroidRuntime( 6502):    at com.google.android.apps.docs.shareitem.UploadSharedItemActivityDelegate.a(UploadSharedItemActivityDelegate.java:109)
E/AndroidRuntime( 6502):    at aEk.a(UploadSharedItemActivityDelegate.java:811)
E/AndroidRuntime( 6502):    at aEk.doInBackground(UploadSharedItemActivityDelegate.java:791)
E/AndroidRuntime( 6502):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
E/AndroidRuntime( 6502):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
E/AndroidRuntime( 6502):    ... 4 more

谢谢,

嘘声。

【问题讨论】:

  • 请发布完整的堆栈跟踪。
  • 您在 paths.xml 文件中定义了哪些路径?

标签: android android-intent android-contentprovider


【解决方案1】:

我在 Android 2.3 设备上遇到了同样的问题。唯一的解决方案是在 Android 2.3 上将 android:exported 属性设置为“true”,实现我们自己的 FileProvider 类(将 FileProvider 的源代码复制到您的包中)并禁用导出标志检查,在运行时检查 FileProvider.attachInfo()安卓2.3

【讨论】:

    【解决方案2】:

    您是否尝试使用支持库中的 FileProvider?

    <provider android:name="android.support.v4.content.FileProvider" ... />
    

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多