将单个布尔共享首选项公开给其他应用

时间:2018-09-20 10:41:37

标签: android sharedpreferences

App A依赖于已安装并正确配置的AppB。 如果未安装App B,则App A将拒绝工作,并且不会报告其已正确配置。

使用PackageManager遍历所有已安装的应用程序并检查与软件包名称的匹配情况,很容易就能确定是否已安装App B。

App B要求用户执行各种活动,然后将共享首选项的值设置为true。我需要App A才能访问此布尔值。完成搜索后,我唯一能找到的就是不得不编写一个内容提供程序,该内容提供程序似乎需要数据库后端和查询管理。在我看来,这似乎是使用大锤打碎核桃的一种情况。没有简单的方法可以使App A访问存储在App B数据中的一个值吗?

其他应用程序也不能访问布尔值的值,因此没有安全性问题,但是他们必须不能更改它。

1 个答案:

答案 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();
    }