4

我已阅读有关 Android ContentResolver的文档

我也搜索了一个合适的例子,但无济于事。

根据文档,call当标准内容提供程序方法不足时,可以使用一种方法来访问自定义提供程序方法:

final Bundle     call(Uri uri, String method, String arg, Bundle extras)
Call a provider-defined method.

所以在我的代码中我执行:

getContentResolver().call(uri, method, arg, extras);

但它总是返回 null bundle。事实上,提供程序中的方法永远不会被调用。

进一步的研究指出了合同的(感知​​的)差异,其中RESOLVER具有uri 参数而没有等效的PROVIDER参数:

Bundle   call(String method, String arg, Bundle extras)
Call a provider-defined method.

我显然不明白一些事情。谁能指出我正确的方向?

4

2 回答 2

6

进一步的研究指出了合同的差异,其中 RESOLVER 具有 uri 参数而没有等效的 PROVIDER 参数

他们就是这样写的。Uri只是简单地识别ContentProvider-知道它ContentProvider是谁,因此不需要Uri

提供者方法不允许 @Override 注释

是的,确实如此,正如您在此示例ContentProvider中看到的那样:

  @Override
  public Bundle call(String method, String arg, Bundle extras) {
    if (SET_KEY_METHOD.equals(method) && arg != null) {
      key=arg;
    }

    return(null);
  }

但是,您的构建目标(例如,在 Eclipse 中,项目 > 属性 > Android)必须设置为 API 级别 11 或更高。

call()来自客户端的对应如下所示:

getContentResolver().call(Provider.Constants.CONTENT_URI,
                          Provider.SET_KEY_METHOD, "sekrit", null);

是的。我在提供程序中有一个方法被声明为“public”,该方法被传递到 contentresolver 参数“method”中。

这不是它的工作原理。call()ContentResolvercall()ContentProvider.

于 2013-06-20T22:52:41.550 回答
2

为了回答你的第二个问题,我的猜测是ContentProvider版本call()不需要Uri参数,因为与 a 不同ContentResolver,它不需要找到 a ContentProvider; 它自己调用该方法。

于 2013-06-20T22:51:18.413 回答