如何在自定义内容提供程序中命名列

时间:2014-04-06 10:04:20

标签: android android-contentprovider android-cursor

我应该如何调用我从自定义ContentProvider返回的Cursor中的列,以允许其他应用从中读取数据。

我在ProviderContract中声明了所有列,但第3个应用程序不知道。 这有记录吗?

我特别想做的是让用户从我的应用程序共享数据(文件 - 图像和pdf)到其他应用程序。 由于安全性,所有数据都在外部sd存储上加密。所以我需要通过我的应用程序代理它们来解密它们。 Android安全系统应该处理在用户选择共享文件后仅允许其他应用从内容提供商读取的问题。多数民众赞成,但我有其他应用程序不知道如何从我的光标读取数据的问题。

我只是觉得Android会有一些机制来做到这一点:)通过标准化的列名或某些适配器机制。

这是我查询方法的代码..

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    MatrixCursor c = new MatrixCursor(SecuredFileContract.Files.PROJECTION_ALL);
    String name = uri.getLastPathSegment();
    File file = new File(name);
    byte[] fileContents = mStorageProxy.getFileContents(file);
    c.addRow(new Object[]{1, uri.getLastPathSegment(), fileContents, 0});
    return c;
}

1 个答案:

答案 0 :(得分:1)

  

让第三方应用知道如何从我的合同类中获取它们的标准。

这称为"网页"或其他形式的文档。

例如,您知道SDK提供的提供程序的列名的原因是因为JavaDocs中记录了(有些)。

您需要记录:

  • 您期望的Uri模式,尤其是关键Uri值(例如,查询的CONTENT_URI值)

  • 投影中可以请求的列名

  • "游戏规则"如何将selectionselectionArgssortOrder参数解释为query(例如,使用您的列名称可以将它们视为普通SQL吗?)

您是否以网页,PDF文件,培训视频或其他形式提供此文档,由您自己决定。


更新基于编辑:

  

我特别想做的是让用户从我的应用程序共享数据(文件 - 图像和pdf)到其他应用程序

然后您需要ContentProvider支持openFile()openAssetFile()。理想情况下,它还支持query(),但专门针对the OpenableColumns projection,而不是任意内容。

This sample project演示了ContentProvider需要做什么,尽管您需要将read-the-file-from-assets逻辑替换为read-the-encrypted-file-and-解密逻辑。