内容提供商权限

时间:2014-05-15 15:47:30

标签: android

我继承了一个代码库,需要与之前的版本保持公平同步,以便在通过git推送更改时尽可能轻松地更新到新版本。我所做的更改与重新设计和添加新功能有关。

在最新版本中,我尝试将此应用程序的原始版本与此自定义版本一起安装并出现此错误:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]

我浏览了我的源代码控件,发现在之前的版本中我使用了相同的authoritiesname作为父应用,但我不记得有这个问题,但也许我只是从未测试过两个应用程序同时安装的情况?

在清单的原始版本中,这是提供者元素:

<provider
    android:name="com.foo.mobile.android.provider.Provider"
    android:authorities="com.foo.android.mobile.contentprovider"
    android:exported="false" />

我尝试将权限更改为:

<provider
    android:name="com.foo.mobile.android.provider.Provider"
    android:authorities="com.bar.android.mobile.contentprovider"
    android:exported="false" />

但是现在应用程序在发布后不久就崩溃了SecurityException

  

java.lang.SecurityException:Permission Denial:打开来自ProcessRecord的提供者com.foo.mobile.android.provider.Provider {42cbc998 2462:com.bar/u0a191}(pid = 2462,uid = 10191)来自uid 10189

我看过SO并看到关于此主题的couple questions并且还查看了the documentation这一切都说我需要这个authorities不同,但是如何在保持与基本代码的协同作用的同时保持这种不同呢?

1 个答案:

答案 0 :(得分:1)

  

也许我从未测试过两个应用程序同时安装的情况?

我认为情况就是如此。您不能同时安装支持同一权限的提供商的两个应用程序。

  

但现在应用程序在使用SecurityException启动后不久崩溃:

我的猜测是您更改了清单,但未更改用于访问提供程序的Uri。因此,您的com.bar应用仍在尝试与com.foo提供商进行通信,并且不会导出该提供商。

  

如何在保持与基本代码的协同作用的同时保持这种差异?

这是相同的应用程序,或者不是。

如果它是同一个应用程序,您的第一步是切换回原始包名称。获得Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]的唯一方法是因为您更改了包名并且没有更改提供者的权限。更改包名称意味着,从您和您的团队以外的所有人的角度来看,它是一个完全不同的应用程序。一旦您切换回原始软件包名称(并回滚到原始提供程序授权),一切都应该没问题,除非您无法在同一设备上同时拥有发行版本和开发版本时间。

如果您确实打算让此应用程序具有单独的程序包名称(因此现有应用程序的现有用户无法升级到此新应用程序),则需要更改所有相关位置的权限字符串。我假设您可以使用字符串资源执行此操作,其中您具有不同版本的字符串资源。或者,如果这是免费与付费的应用场景,请转到使用Gradle for Android进行构建,并设置单独的freepaid产品风格,这可以修补您的软件包名称和权限数据作为构建的一部分,而不必调整源代码。