1

我的应用程序接受某些文件以使用该应用程序打开,但我最近看到几次崩溃说

java.lang.RuntimeException: Unable to start activity  java.lang.SecurityException: Permission Denial: opening provider com.yahoo.mobile.client.android.mail.provider.MailProvider from ProcessRecord{42cb5ff0 7953:com.my.package/u0a10163} (pid=7953, uid=10163) that is not exported from uid 10147

在我的 AndroidManifest.XML 我有以下权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.android.setting.permission.ALLSHARE_CAST_SERVICE" />
<uses-permission android:name="com.android.vending.BILLING" />

对于雅虎,我可能缺少任何许可吗?我感觉它被特别阻止了。如果是这样,有什么办法可以阻止雅虎中的附件被我的应用程序打开?谢谢

4

2 回答 2

1

对于雅虎,我可能缺少任何许可吗?

不是基于那个错误。该错误表明雅虎创建了一个ContentProvider( com.yahoo.mobile.client.android.mail.provider.MailProvider) 并搞砸了他们的安全性。他们应该FLAG_GRANT_READ_URI_PERMISSION与他们的, 一起使用ACTION_VIEW Intent,以允许其其他未导出的提供程序为您提供文件内容。

如果是这样,有什么办法可以阻止雅虎中的附件被我的应用程序打开?

捕获异常并向用户指出启动您的应用程序已损坏。

您可以在清单中放入任何内容以说明“...但不是 Yahoo Mail”。

于 2015-02-22T00:22:27.607 回答
0

我同意 CommonsWare 的观点,即 yahoo 的应用程序数据提供程序配置不正确,他们应该执行以下操作之一:

  • 声明 android:exported=true (不声明任何特定权限)这将使内容提供者可以免费访问外部应用程序。

  • 在清单中的提供程序标记上声明临时权限,指定
    android:grantUriPermissions=true 并在操作意图上设置 FLAG_GRANT_READ_URI_PERMISSION 标志。

但就我而言,我发现了另一个解决方案:

Context.grantUriPermission((String toPackage, Uri uri, int modeFlags)

通常应该从提供程序应用程序调用这个方法来授予对另一个包的访问权限,但在我们的例子中,从我们的应用程序调用这个方法:

grantUriPermission(BuildConfig.APPLICATION_ID, fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);​ 

获得了对指定文件的访问权限,并且我们能够打开雅虎附件。

于 2015-06-15T12:32:08.660 回答