Изменить значение метаданных Android программно

как изменить значение метаданных программно в манифесте или строковом ресурсе в строковом значении

Возможный дубликат Программно изменить значение R.string

TheWanderer 17.09.2018 19:07

Я хочу изменить одно из них значение метаданных или строковый ресурс

Ahmed Wahdan 17.09.2018 19:09
3
2
3 446
3

Ответы 3

Вы не можете изменить ресурс, когда вы предоставляете информацию в качестве ресурса (в папке res), его нельзя изменить программно, Вы не можете писать в этом каталоге. То же самое и для Android Manifest, метаданные манифеста не могут быть изменены во время выполнения.

Не лучше иметь две строки, например, первое значение и вторую, поэтому вы можете просто использовать это:

Джава:

thing.setText(getResources.getString(R.id.variablename2)) 

Котлин:

thing.text = resources.getString(R.id.variablename2) 

проблема в том, что у меня есть значение метаданных в манифесте, я хочу его изменить

Ahmed Wahdan 17.09.2018 19:19

Вы не можете изменить метаданные во время выполнения, но вы можете настроить несколько вариантов и настроить свою сборку для сборки в соответствии с каждой разновидностью приложения. Если вы ищете более надежное решение, я бы порекомендовал настроить службу настройки, которая позволила бы вам задавать настройки для каждого клиента / организации.

Randy 17.09.2018 19:41

Изменить метаданные можно, добавив метаданные в файл AndroidManifest.xml. Позже вы можете получить к нему доступ с помощью Bundle из своей активности. Вот пример.

AndroidManifest.xml

 <?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
  package = "com.example.readmetadata"
  android:versionCode = "1"
  android:versionName = "1.0">
    <application android:icon = "@drawable/icon" android:label = "@string/app_name">
        <activity android:name = ".MainMenu" android:label = "@string/app_name">
            <intent-filter>
                <action android:name = "android.intent.action.MAIN" />
                <category android:name = "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data android:name = "my_api_key" android:value = "mykey123" />
    </application>
    <uses-sdk android:minSdkVersion = "3" android:targetSdkVersion = "8" />
</manifest>

Для чтения этих метаданных требуется всего несколько строк Java.

try {
ApplicationInfo ai = getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String myApiKey = bundle.getString("my_api_key");
} catch (NameNotFoundException e) {
Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage());
} catch (NullPointerException e) {
Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage());         
}

Activity расширяет ContextWrapper, у которого есть метод getPackageManager (). Этот метод возвращает PackageManager, который используется для получения ApplicationInfo, передавая имя пакета и флаг метаданных. Возвращенный ApplicationInfo содержит поле metaData, которое на самом деле является Bundle, содержащим все метаданные. Строка 4 извлекает строку, которая совпадает с параметром «android: name» в XML. Надеюсь, это поможет!

Йой не показал, как их редактировать на Java или менять

Idris Stack 13.08.2020 14:32

Могу ли я программно применить / изменить значение метаданных действия?

Hardik Paranjape 14.01.2021 22:40

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

В build.gradle

defaultConfig {
        manifestPlaceholders = [ senderid:"12345"]
    }

buildTypes {
        release {
            manifestPlaceholders = [ senderid:"56789"]
        }
    }

В файле манифеста

<meta-data
            android:name = "SENDER_ID"
              android:value = "${senderid}" />

Ссылка на ссылку: https://developer.android.com/studio/build/manifest-build-variables.html

Другие вопросы по теме