Android的 - 在应用项目,有供应商授权(Android - Having Provider

2019-06-24 22:18发布

一个Android库项目包含了一些供应商的权威定义就像在合同类如下:

public static final String CONTENT_AUTHORITY = "my.com.library.providers.tester";
private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);

现在有很多的应用程序项目使用这个库项目。 我目前遇到的问题是,对于每一个应用程序的项目,我需要在图书馆项目每一个应用程序的独立分支只是有独特的内容授权。 这是创建一些版本管理问题(如传播特性/ bug修复从一个分支到所有分支等)。 相反,我想委托定义内容授权到应用程序项目的责任。 有没有办法做到这一点?

Answer 1:

该应用程序是绝对需要知道的权力,因为这是声明的一个唯一一个<provider>在清单与android:authorities属性。

因此,原则上,应该“只是工作”,只要你从供应商,如删除所有特定权力逻辑:

  • 那些静态数据成员(现在移动到托管应用程序)
  • UriMatcher (滚动自己的东西是不检查的权限,但侧重于其余Uri

如果由于某种原因,你有绝对的把握,你的供应商需要知道它的权威性,那么应用程序将被用于实际工作中的提供者之前以供应给供应商。 可能的方式来做到这一点包括:

  • 由于ContentProvider是一种天然的单,将其分配给一个静态数据成员,并随后通过从自定义的自定义方法提供权威串给它Application类(如供应商首先被初始化,所以这应该工作)

  • 如果你只支持API级别11+,有自定义的Application类使用call()ContentResolver对权力提供给ContentProvider

  • 假设只有真正的呼叫(例如,以query() insert()是有效的,并且只是懒惰初始化基于什么来在你的第一个权威Uri你看



Answer 2:

我知道这是一个老话题,但今天碰到这个问题,我们已经开发了相当长的一段时间,所以还没有准备好要经过我们的内容提供商合同的所有静态和改变他们,也是因为我们的内容提供商和DB是其产生该Mechanoid Eclipse插件 (是的,我也是作者!:))

我想出了解决的办法是静态初始化程序添加到使用反射来查找类,如果它存在于使用静态CONTENT_AUTHORITY场,如果没有回落到我们的默认生成的合同:

public class QuxContract  {
    public static final String CONTENT_AUTHORITY = initAuthority();

    private static String initAuthority() {
        String authority = "com.example.app.data.qux";

        try {

            ClassLoader loader = QuxContract.class.getClassLoader();

            Class<?> clz = loader.loadClass("com.example.app.data.QuxContentProviderAuthority");
            Field declaredField = clz.getDeclaredField("CONTENT_AUTHORITY");

            authority = declaredField.get(null).toString();
        } catch (ClassNotFoundException e) {} 
        catch (NoSuchFieldException e) {} 
        catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }

        return authority;
    }

    private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
// ...

现在,在链接到库项目可以提供自己的权威每一个项目:

package com.example.app.data;

public class QuxContentProviderAuthority {
    public static final String CONTENT_AUTHORITY = "com.example.app.data.baz";
}

另外,不要忘记改变权力在你的清单还



文章来源: Android - Having Provider authority in the app project