XMLの読み込み
設定値を扱うためにXMLを利用したい場合、
どのように扱うのだろうか。
- Parserを利用する。
- DOM
- XmlPullParser
androidにおけるリソースファイルの読み込み
リソースファイルは、XMLで記述されており、これを読み込むためのフレームワークが存在するはず。
これを流用することはできないか。
以下の手順でAttributeSetが取れる。これをどうやって使うのか分からない、、、。
AttributeSet attrs = Xml.asAttributeSet(parser);
androidのアプリがXMLデータを読み込む処理
/data/system以下には、以下のXMLデータがあるので、これらを読み込む処理について調べてみる。
appwidges.xml
AppWidgetService::void readStateFromFileLocked(File file); で読み出し処理
// XmlPullParserを生成 stream = new FileInputStream(file); XmlPullParser parser = Xml.newPullParser(); parser.setInput(stream, null); int type; int providerIndex = 0; HashMap<Integer,Provider> loadedProviders = new HashMap<Integer, Provider>(); do { type = parser.next(); if (type == XmlPullParser.START_TAG) { // START_TAGならば、タグ名を取得 String tag = parser.getName(); if ("p".equals(tag)) { // 目的のタグが見つかれば、getAttributeValue()で属性値を取得する。 // TODO: do we need to check that this package has the same signature // as before? String pkg = parser.getAttributeValue(null, "pkg"); String cl = parser.getAttributeValue(null, "cl");
wallpaper_info.xml
WallpaperManagerService::loadSettingsLocked()で読み出し。
手順的には上記と同様
packages.xml
PackageManagerService::readLP()で読み出し。
手順は同上
XMLからのデータ読み出し
どうやら、XmlPullParserを利用するのが一般的なのかしら。
楽な方法があれば知りたい。
蛇足
アプリケーションのAndroidManifest.xml にユーザの独自定義のパラメータを追加したい事がある。
(※frameworkをいじっている人たち?)
以下の方法でアクティビティに定義したメタデータを取得可能なので、
このパーサを解析する処理をかけば、独自定義を得られるっぽい?(未確認)
XmlResourceParser parser = null;
parser = activityInfo.loadXmlMetaData(mPackageManager,
AppWidgetManager.META_DATA_APPWIDGET_PROVIDER);
アプリケーション独自定義データの取得
AndroidManifest.xml に定義した値を取得する方法
AndroidManifest.xmlに、
ApplicationInfo/ActivityInfoなりの metaData(Bundleクラス)から getString(hogehoge)として取得するだけ。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.misetu.test.metadata" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" 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="com.misetu.test.metadata.collabo_app_name" android:value="test_app" /> </application> </manifest>
MainActivity.java
package com.misetu.test.metadata; import android.app.Activity; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { ApplicationInfo info = this.getPackageManager().getApplicationInfo(this.getPackageName(), PackageManager.GET_META_DATA ); String appname = info.metaData.getString("com.misetu.test.metadata.collabo_app_name"); Log.d("TestMetaData", appname); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }