Подтвердить что ты не робот

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

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

Спасибо, Swathi

4b9b3361

Ответ 1

Предполагая, что предпочтение - 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());
}

Ответ 2

Хорошо! используя этот код в приложении 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());
            }

Более подробную информацию можно найти по этому адресу: http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Он может работать, если мы хотим прочитать значение переносимости из другого приложения /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: Хранить значение application1

 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: Получить значение из приложения2

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