我知道这是一个老话题,但今天遇到了这个问题,我们已经开发了很长一段时间,所以还没有准备好检查我们的内容提供者合同中的所有静态并更改它们,也因为我们的内容提供者和数据库是由生成的Eclipse的Mechanoid 插件(是的,我也是作者!:))
我想出的解决方案是向我们生成的合约添加一个静态初始化程序,该合约使用反射来查找一个类,并在其存在时使用静态 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";
}
另外,不要忘记更改清单中的权限