Предоставление единого логического общего предпочтения другим приложениям - PullRequest
0 голосов
/ 20 сентября 2018

Приложение A зависит от того, установлено ли приложение B и правильно ли оно настроено.Приложение A откажется работать, если приложение B не установлено, и не сообщит, что оно было правильно настроено.

Узнать, установлено ли приложение B, достаточно просто, используя PackageManager для циклического просмотра всех установленных приложений.и проверьте соответствие имени пакета.

Приложение B требует от пользователя выполнения различных действий, прежде чем оно установит значение общего предпочтения в значение true.Мне нужно приложение А, чтобы иметь доступ к этому логическому значению.После выполнения поиска единственное, что я могу найти, - это написать контент-провайдера, для которого требуется база данных и управление запросами.Мне кажется, это очень большой случай использования кувалды, чтобы расколоть грецкий орех.Нет ли более простого способа дать приложению A доступ к этому единственному значению, хранящемуся в данных приложения B?

Нет проблем с безопасностью, так как другие приложения также могут получить доступ к значению логического значения, но онине должно быть в состоянии изменить его.

1 Ответ

0 голосов
/ 20 сентября 2018

Кажется, это должно быть сделано с помощью ContentResolver, но, используя информацию, полученную в ответе на на этот вопрос , я смог реализовать ее, не прибегая к поддержке базы данных.В приложении B (то, на которое опирается приложение A) я создал следующий Resolver Content:

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>

А вот пример кода для доступа к настройке из приложения 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...