App A依赖于已安装并正确配置的AppB。 如果未安装App B,则App A将拒绝工作,并且不会报告其已正确配置。
使用PackageManager遍历所有已安装的应用程序并检查与软件包名称的匹配情况,很容易就能确定是否已安装App B。
App B要求用户执行各种活动,然后将共享首选项的值设置为true。我需要App A才能访问此布尔值。完成搜索后,我唯一能找到的就是不得不编写一个内容提供程序,该内容提供程序似乎需要数据库后端和查询管理。在我看来,这似乎是使用大锤打碎核桃的一种情况。没有简单的方法可以使App A访问存储在App B数据中的一个值吗?
其他应用程序也不能访问布尔值的值,因此没有安全性问题,但是他们必须不能更改它。
答案 0 :(得分:0)
这似乎必须使用ContentResolver来完成,但是使用在this question的答案中获得的信息,我能够实现一个而无需求助于数据库后端。在App B(App A所依赖的那个)中,我创建了以下内容解析器:
public class ConfigProvider extends ContentProvider
{
public ConfigProvider() { }
@Override public int delete(Uri uri, String selection, String[] selectionArgs){ throw new UnsupportedOperationException("Not yet implemented"); }
@Override public String getType(Uri uri) { throw new UnsupportedOperationException("Not yet implemented"); }
@Override public Uri insert(Uri uri, ContentValues values) { throw new UnsupportedOperationException("Not yet implemented"); }
@Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { throw new UnsupportedOperationException("Not yet implemented"); }
@Override public boolean onCreate() { return false; }
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
{
//never mind the details of the query; we always just want to
//return the same set of data
return getConfig();
}
private Cursor getConfig()
{
//create a cursor from a predefined set of key/value pairs
MatrixCursor mc = new MatrixCursor(new String[] {"key","value"}, 1);
mc.addRow(new Object[] {"enabled", getEnabled()});
return mc;
}
private String getEnabled()
{
//access your shared preference or whatever else you're using here
}
}
然后确保ConntentProvider已在清单中注册...
<provider
android:name=".ConfigProvider"
android:authorities="com.abcxyz.ConfigProvider" <!--[yourpackagename].ConfigProvider-->
android:enabled="true"
android:exported="true">
</provider>
下面是一些示例代码,可从App A中访问设置:
Cursor c = getContentResolver().query(Uri.parse("content://com.abcxyz.ConfigProvider/anytype"), null, null, null, null);
HashMap<String, String> allValues = new HashMap<>();
while (c.moveToNext())
{
allValues.put(c.getString(0), c.getString(1));
}
if(allValues.containsKey("enabled"))
{
Toast.makeText(this, "enabled state: " + allValues.get("enabled"), Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(this, "value not found in cursor", Toast.LENGTH_LONG).show();
}