XMLの読み込み

設定値を扱うためにXMLを利用したい場合、
どのように扱うのだろうか。

  1. Parserを利用する。
    1. DOM
    2. XmlPullParser

androidにおけるリソースファイルの読み込み

リソースファイルは、XMLで記述されており、これを読み込むためのフレームワークが存在するはず。
これを流用することはできないか。

以下の手順でAttributeSetが取れる。これをどうやって使うのか分からない、、、。
AttributeSet attrs = Xml.asAttributeSet(parser);

androidのアプリがXMLデータを読み込む処理

/data/system以下には、以下のXMLデータがあるので、これらを読み込む処理について調べてみる。

  1. appwidges.xml
  2. wallpaper_info.xml
  3. packages.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();
	}

    }
}