Android: получение общих настроек другого приложения

#android #preferences #shared

#Android #настройки #общие

Вопрос:

У меня есть приложение настроек, из которого я должен получить настройки других приложений, но у меня нет сведений о ключах в них, как я могу получить все доступные ключи и значения в этом предпочтении?

Спасибо, Swathi

Ответ №1:

Хорошо! использование этого кода в приложении 1 (с именем пакета «com.sharedpref1») для хранения данных с общими настройками.

 SharedPreferences prefs = getSharedPreferences("demopref",
                    Context.MODE_WORLD_READABLE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString("demostring", strShareValue);
            editor.commit();
  

И использование этого кода в приложении 2 для получения данных из общих настроек в приложении 1. Мы можем получить это, потому что мы используем MODE_WORLD_READABLE в приложении 1:

     try {
                con = createPackageContext("com.sharedpref1", 0);
                SharedPreferences pref = con.getSharedPreferences(
                        "demopref", Context.MODE_PRIVATE);
                String data = pref.getString("demostring", "No Value");
                displaySharedValue.setText(data);

            } catch (NameNotFoundException e) {
                Log.e("Not data shared", e.toString());
            }
  

Для получения дополнительной информации, пожалуйста, посетите этот URL:
http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

Комментарии:

1. это хороший код: в моем случае сначала я не использовал ввод имени пакета из первого приложения. но теперь это работает. Вместо «Context.MODE_WORLD_READABLE» в App1 я попробовал использовать «Context.MODE_PRIVATE» в сочетании с «android: sharedUserId» и «android: sharedUserLabel» в обоих AndroidManifest.xml Приложения. Причина, по которой я использовал эту комбинацию, заключалась в том, что мне нужны права доступа только для моих собственных приложений. С «MODE_WORLD_READABLE» был бы также доступ к другим приложениям, которые мне не нужны. Возможно, эта информация также полезна для некоторых.

2. Это отличный ответ, и дополнение @KingAlex1985 позволяет моему платному приложению считывать общие настройки своего бесплатного собрата, не открывая их миру. Также работает с ‘PreferenceManager.getDefaultSharedPreferences(con)’. Я добавил ‘android: sharedUserId’ и ‘android: sharedUserLabel’ к обоим приложениям.

3. @danhnn.uit Почему ты вставил 0 в createPackageContext ?

4. Кроме того, с точки зрения безопасности вы можете использовать алгоритм шифрования в приложении 1, затем сохранить его в общих настройках, а затем использовать расшифровку в приложении 2 для доступа к данным. Это гарантирует вам, что если в любом случае какое-либо другое приложение имеет доступ к общим данным предпочтений, то и это приложение не сможет увидеть ваши конфиденциальные данные.

Ответ №2:

Предполагая, что предпочтения являются WORLD_READABLE, это может сработать:

 final ArrayList<HashMap<String,String>> LIST = new ArrayList<HashMap<String,String>>();
// where com.example is the owning  app containing the preferences
Context myContext = createPackageContext("com.example", Context.MODE_WORLD_WRITEABLE); 
SharedPreferences testPrefs = myContext.getSharedPreferences("test_prefs", Context.MODE_WORLD_READABLE); 
Map<String, ?> items = testPrefs .getAll();
for(String s : items.keySet()) {
  // do something like String value = items.get(s).toString());
}
  

Комментарии:

1. Вы делаете это в другом приложении (приложении, которому принадлежат настройки). К какому из ваших вопросов, похоже, у вас нет доступа, поскольку, если бы вы это сделали, вы бы знали доступные ключи. Но вы делаете это аналогично описанному выше с помощью mode_world_readable. это действительно очень плохой способ ведения дел, и если вы хотите поделиться данными, вы должны следовать предложению commonsware

2. приложение должно иметь режим WORLD_READABLE — может быть, вы это имели в виду и неправильно ввели его? WOLRD_WRITABLE означает, что любой может писать в него.

3. Я пробовал, но не могу прочитать значение из другого приложения

4. как бы вы обновили значение в настройках, загруженных из другого приложения …?

5. Режимы MODE_WORLD_READABLE и MODE_WORLD_WRITEABLE устарели с 17-го уровня API. Начиная с 24-го уровня API, это вызовет исключение SecurityException: developer.android.com/training/data-storage / …

Ответ №3:

Кроме того, вы должны добавить тот же android: sharedUserId в файл манифеста обоих приложений.

Комментарии:

1. Как мы можем использовать файлы манифеста в обоих приложениях. Не могли бы вы, пожалуйста, привести пример для того же?

Ответ №4:

К сожалению, документы теперь даже не объясняют MODE_WORLD_READABLE и MODE_WORLD_WRITEABLE, вместо этого говоря:

Эта константа была снижена на уровне API 17. Создание файлов, доступных для чтения во всем мире, очень опасно и может привести к дырам в безопасности приложений. Это настоятельно не рекомендуется; вместо этого …. и т. Д

После снижения стоимости реализация совместного использования файлов между приложениями с sharedpreferences может быть слишком рискованной, хотя это было просто. Меня не слишком беспокоят дыры в безопасности из-за режима MODE_WORLD_READABLE в игровых приложениях, где я просто хочу иметь возможность переносить персонажей из одного приложения в другое. Очень жаль, что они обесценили оба режима совместного использования.

Ответ №5:

Это может сработать, если мы хотим прочитать значение perference из другого приложения / pkg / process. но в ответе jkhouw1 что-то не так:

 Context myContext = createPackageContext("com.example", 
            Context.MODE_WORLD_WRITEABLE);
  

Это должно быть :

 Context myContext = createPackageContext("com.example", 
            Context.CONTEXT_IGNORE_SECURITY);
  

хотя CONTEXT_IGNORE_SECURITY и MODE_WORLD_WRITEABLE имеют одинаковое значение «int 2»
В целом, спасибо за этот вопрос и ответы.

Ответ №6:

Легко получить данные общих настроек хранилища из одного приложения в другое приложение.

Шаг 1: добавьте одно и то же android:sharedUserId="android.uid.shared" в файлы манифеста обоих приложений.

Шаг 2: Приложение для сохранения значений1

  SharedPreferences preferences = context.getSharedPreferences("token_id",    Context.MODE_WORLD_READABLE);
        Editor editor = preferences.edit();
        editor.putString("shared_token", encryptedValue);
        Log.e("aaa *** shared_token : ", encryptedValue.toString());
        editor.commit();
  

Шаг 3: Получаем значение из application2

 Context con = null;
        try {
            con = createPackageContext("application2 package name", Context.CONTEXT_IGNORE_SECURITY);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        try {
            if (con != null) {
                SharedPreferences pref = con.getSharedPreferences(
                        "token_id", Context.MODE_WORLD_READABLE);

                String data = pref.getString("shared_token", "");
                Log.d("msg", "Other App Data: "   data);
            } else {
                Log.d("msg", "Other App Data: Context null");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }