打开附件时如何解决 Yahoo Mail Provider 的权限拒绝问题?

How to fix Permission Denial from Yahoo Mail Provider when opening an attachment?

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

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

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

Is there any permission that I might be missing for specifically Yahoo?

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

If so is there any way I can block attachments in Yahoo from being opened with my app?

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

您不能在清单中添加任何内容来表示“...但不是 Yahoo Mail”。

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

  • 声明 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);​ 

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