コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

Androidアプリ入門 No.42 Preferenceの基本 ほかのアプリケーションのデータを読み取る

Preferenceの基本

ほかのアプリケーションのデータを読み取る

ここでは、ほかのアプリケーションのデータを読み取る例を示す。まず、sample.at.MainActivityのプロジェクトから作成する。先ほどの例のMainActirivy.javaのみ以下のように変更する。MODE_WORLD_READABLEに指定することでほかのアプリケーションからでもPreferenceを読めるようにする。

package sample.at;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    private EditText editText;
    private Button button;
    private SharedPreferences pref;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        editText = (EditText) findViewById(R.id.editText);
        pref = getPreferences(MODE_WORLD_READABLE);
        editText.setText(pref.getString("test", ""));

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Editor editor = pref.edit();
                editor.putString("test", editText.getText().toString());
                editor.commit();

                Toast.makeText(getApplicationContext(), "保存しました",
                    Toast.LENGTH_SHORT).show();
            }
        });
    }
}

次に、以下の条件で別のプロジェクトを作成する。

項目 内容
Project name PreferenceTest
Build Target Android 1.6
Application name PreferenceTest
Package name sample.test
Create Activity PreferenceActivity
Min SDK Version 4

まず、main.xmlを以下のように編集する。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView  
        android:id="@+id/readData"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        />
</LinearLayout>

次に、PreferenceActivityを以下のようにする。

package sample.test;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class PreferenceActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView readData = (TextView) findViewById(R.id.readData);
        try {
            Context context = createPackageContext("sample.at", CONTEXT_IGNORE_SECURITY);
            SharedPreferences pref = context.getSharedPreferences("MainActivity",
                    MODE_WORLD_READABLE);
            readData.setText(pref.getString("test", "NO_DATA"));
            Log.i(pref.getString("test", "NO_DATA"), pref.getString("test", "NO_DATA"));
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}

まず、MainActivity.javaを実行して適当な文字列を保管する。

次に、PreferenceActivity.javaを実行し、保存した文字列が表示されるかを確認する。

保存操作はすでに確認済みなので、PreferenceActivityでどのようにファイルを呼んでいるかを確認する。
まず、ActivityTestで保管したデータを読み出すため、そのパッケージを指定してContextを作成する。それにはActivityのスーパークラスのContext#createPackageContextを用いる。定義は以下。

public abstract Context createPackageContext(String packageName, int flags)

引数はそれぞれ以下。

引数 内容
packageName 読み出すデータのアプリケーションのパッケージ。今回の場合、sample.at
flag CONTEXT_INCLUDE_CODEもしくは、CONTEXT_IGNORE_SECURITYを指定する。今回は、別のアプリケーションのデータを読み取るためCONTEXT_IGNORE_SECURITYを使用する。

Context取得後そこから、getSharedPreferencesでSharedPreferencesを取得する。getSharedPreferencesの定義は以下。

public abstract SharedPreferences getSharedPreferences(String name, int mode)

引数はそれぞれ以下。

引数 内容
name 読み出すアプリケーションファイルの名前。今回の場合、MainActivity。
mode Preferenceの操作モードの決定。getPreferencesと同じモードが指定できる。