仅在权限不存在时注册ContentProvider

时间:2014-10-05 11:32:09

标签: android android-contentprovider

我正在开发一个自定义主屏幕启动器。作为其功能的一部分,我希望能够显示未读的通知徽章。

我没有为此实现自己的API,而是希望与现有标准挂钩。最常用的是三星的TouchWiz发射器。

它通过具有权限com.sec.badge的ContentProvider工作。现在,在三星设备上,我可以轻松使用ContentObserver来观察对Samsung的ContentProvider的更改,并且它可以完美运行。但是,在没有现有ContentProvider的设备(即非三星设备)上,我想为此提供我自己的ContentProvider。这也非常适合捕获其他应用程序的插入内容。

但是,当我滚动自己的ContentProvider时,我尝试在三星设备上安装时自然会出现INSTALL_FAILED_CONFLICTING_PROVIDER错误。

我完全理解为什么这种情况正在发生,因为Android希望避免在提供商中出现冲突。

我想要的帮助是一种解决方法。有可能以某种方式动态注册我的ContentProvider而不是在AndroidManifest.xml中声明它吗?这样,我首先可以检查权限是否已经被采用,如果是,请使用Observer。否则,请注册我自己的ContentProvider并继续使用它。

我意识到这可能是不好的做法,但我真的没有看到任何其他方式。一些应用程序(例如Facebook)也实现了索尼的徽章API,它通过广播来避免冲突,但现有的应用程序并没有使用这个过程。

我试过这个:

ContentProvider test = new SamsungContentProviderSpoof();
ProviderInfo providerInfo = new ProviderInfo();
providerInfo.authority = "com.sec.badge";
providerInfo.enabled = true;
providerInfo.exported = true;
test.attachInfo(this, providerInfo);

但显然失败了。我想我需要以某种方式访问​​一些系统ContentResolver并在那里注册,但我不知道如何。

1 个答案:

答案 0 :(得分:0)

  

我想借鉴现有标准

没有现行标准。一些供应商做了他们自己的事情,就是这样。

  

最广泛使用的是三星的TouchWiz发射器。

请注意,此机制未记录(AFAICT)且不受支持(在选定的三星合作伙伴之外)。

  

是否有可能以某种方式动态注册我的ContentProvider而不是在AndroidManifest.xml中声明它?这样,我首先可以检查权限是否已经被采用,如果是,请使用Observer。否则,请注册我自己的ContentProvider并继续使用它。

我们欢迎您在清单中将其停用(android:enabled="false"),然后使用PackageManagersetComponentEnabledSetting()有条件地启用它。您可能知道您需要通过尝试与现有提供程序通信(例如,注册您的观察者)并获得预期错误,或者通过询问PackageManager以查看提供程序是否存在来执行此操作。

但是,您不仅要在提供商方面声称自己是三星,还要在自定义权限方面声称自己是三星。 将在“L”开发者预览版上中断,并可能继续前进,原因与您遇到冲突提供商的原因大致相同。目前,我没有找到解决方法。