36

I want to add a custom attribute / property into the manifest file, and be able to read it at run time. I want to do this so I can customize the app's behavior via these manifest properties. How can this be done?

Jonik
  • 80,077
  • 70
  • 264
  • 372
inor
  • 2,781
  • 2
  • 32
  • 42

2 Answers2

78

You can add meta-data to your AndroidManifest.xml file and then read that in your application.

Write the data like so:

<meta-data android:value="bar" android:name="foo"></meta-data>

And read the data like so:

ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
Object value = (Object)ai.metaData.get("foo");

See http://developer.android.com/guide/topics/manifest/meta-data-element.html

1615903
  • 32,635
  • 12
  • 70
  • 99
P.Melch
  • 8,066
  • 43
  • 40
  • 2
    The calls here work perfectly. One thing worth mentioning if other users come across this is that you'll want to wrap this with try/catch PackageManager.NameNotFoundException (especially in Android Studio, this won't even compile without wrapping it). – Wes Winn Dec 03 '14 at 20:56
10

You can create an empty resource file in res/values and add strings and items (for bool or integer values) to it.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="foo">bar</string">
    <item name="testint" type="integer">33</item>
    <item name="testbool" type="bool">true</item>
</resources>

Alternatively you could simply use a Constants object in which you define your properties as final static variables.

nanoquack
  • 949
  • 2
  • 9
  • 26
  • 1
    thanks, would you please show the code needed to read the value of foo from the resource file – inor Oct 30 '11 at 03:47
  • 4
    should be getResources().getString(R.string.foo) getResources().getInteger(R.integer.testint) getResources.getBoolean(R.bool.testbool) see http://developer.android.com/guide/topics/resources/more-resources.html for more details – nanoquack Oct 30 '11 at 23:24
  • Like the idea, easy to get value without any parser – fifth Aug 13 '14 at 09:16
  • yes this is an alternative but if you have multi values folder like values-en, values-jp you must define your constants to all strings.xml files. same data in multiple files, I think this is disadvantage in many ways. – Phd. Burak Öztürk Feb 22 '16 at 01:12
  • I believe the drawback in the comment above can be relieved by using a base "values" folder with no localization suffix – ItsJason Mar 12 '19 at 00:13