Sometimes you have the need to set up some app-wide configuration
information in an Android app or need to create a class that can be used
in multiple projects with a generic way of setting configuration
values. This is particularly useful for things like API keys that will
probably be different across apps but should be accessible in the same
way. There are several ways to do it, but the one I’ve come to prefer
is adding a Meta-Data to the AndroidManifest.xml file.
This field can be used to store a boolean, float, int, or String and is later accessed by the Bundle method for your data type (e.g., getInt()). Here is an example of how to define a value in your AndroidManifest.xml:
This field can be used to store a boolean, float, int, or String and is later accessed by the Bundle method for your data type (e.g., getInt()). Here is an example of how to define a value in your AndroidManifest.xml:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
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
>
Reading this meta-data takes just a few lines of 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 extends ContextWrapper which has a getPackageManager() method. That method returns the PackageManager, which is used to fetch the ApplicationInfo,
passing the package name and the meta-data flag. The returned
ApplicationInfo contains a field, metaData, which is actually a Bundle
containing all the meta data. Line 4 fetches a String that is the same
as the “android:name” parameter in the XML.
That sounds more complicated than it really is. Basically, if you
have an Activity, you can fetch the Bundle that has all your meta-data
from the AndroidManifest and use it throughout the app.