小编LR8*_*R89的帖子

android库项目中的ContentProvider

对于许多不同应用程序使用的库项目,是否可以使用private(exported = false)ContentProvider?

问题是,即使不导出CP,它也必须具有唯一的权限.如果它不是唯一的,那么您无法在同一部手机上安装具有相同库的多个应用程序(INSTALL_FAILED_CONFLICTING_PROVIDER).

我知道我可以使用应用程序ID在AndroidManifest中定义提供程序,如下所示:

<provider
    android:authorities="${applicationId}.provider.test"
    android:name=".storage.db.MyContentProvider"
    android:exported="false" />
Run Code Online (Sandbox Code Playgroud)

但我找不到一个解决方案来在运行时生成代码中的权限来正确初始化UriMatcher.

BuildConfig.APPLICATION_ID返回库项目的ID,而不是应用程序.我可以尝试从应用程序的上下文中获取packageId,但如果应用程序使用具有不同appIds的flavor,则不是最佳解决方案.

所以我的想法是:

  • 在运行时在我的库代码中找到合适的appplicationId(当使用具有不同应用程序ID的flavor时)
  • 找到一种方法来正确匹配我的UriMatcher中的URI,而无需了解权限.

android android-contentprovider

8
推荐指数
1
解决办法
1431
查看次数

用其他Observable过滤RxJava Observable

我正在使用RxAndroid 2.0.1和RxJava 2.0.6。

我有两个观察值:一个Maybe<MyObject>基于某些字符串(ID)的返回。当返回可选对象时,我必须调用第二个对象,该对象采用MyObject实例,并Single<Boolean>在对象满足某些条件时返回。然后,我可以对对象实例进行进一步的操作。

我当前的实现如下:

objectDAO.getById(objectId)
    .subscribe(
        myObject -> checkCondition(myObject),
        throwable -> /* Fallback */,
        () -> /* Fallback */
    );

private void checkCondition(final MyObject myObject) {
  otherDAO.checkCondition(myObject)
    .subscribe(
        isTrue -> {
          if (isTrue) {
            // yay! now I can do what I need with myObject instance
          } else {
            /* Fallback */
          }
        },
        throwable -> /* Fallback */
    );
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何简化我的代码。我的想法:

  1. 尝试使用zip-我不能这样做,因为直到第一个Observable返回MyObject之前,第二个Observable才能被订阅

  2. 尝试使用filter-现在的问题是,我需要使用阻塞获取来调用第二个可观察的对象。它可以正常工作,但看起来像代码气味:

    objectDAO.getById(objectId)
      .filter(myObject ->
        otherDAO.checkCondition(myObject).blockingGet()
      )
      .subscribe(
          myObject …
    Run Code Online (Sandbox Code Playgroud)

java android rx-java rx-android rx-java2

5
推荐指数
1
解决办法
970
查看次数