SharedPreferencesについての質問

920 views
Skip to first unread message

Hideo KINAMI

unread,
Feb 6, 2009, 8:33:44 PM2/6/09
to Android-SDK-Japan
木南です。
前回のSDK-WGの集まりの最後に、安生さんから
「データをシェアするのには、コンテントプロバイダー以外に、SharedPreferencesもあるよ」
という紹介があったのでちょっと質問です。

現在のr2のSDKのリファレンスを読むと、SharedPreferencesを使っても、アプリケーションパッケージやプロセスをまたがって、デー
タの共有はできないように読めるのですが、この認識は正しいですか?

すなわち、SharedPreferencesを使って、二つのアプリケーション間で設定データを共有したければ、同じアプリケーションパッケージ
(apk)内に二つのアプリケーションを定義して、同じプロセスで動かすした場合だけということですよね?

android.app.Activity
- you can use the underlying Context.getSharedPreferences() method to
retrieve a preferences object stored under a specific name. (Note that
it is not possible to share settings data across application packages
-- for that you will need a content provider.)

android.content.SharedPreferences
- Note: currently this class does not support use across multiple
processes. This will be added later.


で、質問なのですが、ここで言っているパッケージって、apk内のマニフェストに定義してあるpackage属性ののことですか?それとも、別の単位で
すかね?(たとえば、同じ証明書で署名してあるアプリケーションのこととか、、、)

あと、SharedPreferencesのNoteに書いてある、「後で、マルチプロセスも対応するよ」というのは、一つのパッケージ内の複数のアプ
リを、別々のプロセスで動かしたときの話ですかね?

ちょっと試してみても、やっぱり、別のアプリケーションで同じ名前のSharedPreferencesを取り出してみても、読めなかったです。なに
か、SharedPreferencesでデータを共有する簡単なサンプルって、どこかにありませんか?

よろしくお願いいたします!
--
Hideo

[API Exp]Makoto Anjo

unread,
Feb 7, 2009, 3:37:42 AM2/7/09
to Android-SDK-Japan
安生です。

木南さん、こんにちは。

> 前回のSDK-WGの集まりの最後に、安生さんから
> 「データをシェアするのには、コンテントプロバイダー以外に、SharedPreferencesもあるよ」
> という紹介があったのでちょっと質問です。

はい、日本Androidの会(JAG)のワーキンググループですね。
結論から言いますと、今でも異なるパッケージ間でデータ共有はできます。少なくとも私の環境ではできてます。

サンプルも弊社(Cave)のリポジトリにはあるのですが、公開はちょっとお待ちください。
たぶん少し手を加えないと、そのままというのは微妙かもしれないので(とはいえ作ったのは私ですが)。

とりあえず、月曜日のJAGの定例会でお見せすることは可能です。

Hideo KINAMI

unread,
Feb 7, 2009, 3:42:46 PM2/7/09
to Android-SDK-Japan
木南です。

> 結論から言いますと、今でも異なるパッケージ間でデータ共有はできます。少なくとも私の環境ではできてます。
> とりあえず、月曜日のJAGの定例会でお見せすることは可能です。

それは、楽しみです!
見せていただければ、私のほうで、少し調査して、日本Androidの会のページなどで公開できるかもしれません。
よろしくお願いいたします!
--
Hideo

egg

unread,
Mar 25, 2009, 7:28:22 AM3/25/09
to android-...@googlegroups.com
安生さん、木南さん

江川です。
遅ればせながら僕も試してみたんですが、うまく出来ないです。

例えば、「foo.bar」パッケージのActivityなどで
SharedPreferences.Editor editor = getSharedPreferences("SHARED_PREF",
MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE).edit();
editor.putInt("value", 10);
editor.commit();
とした場合、
/data/data/foo.bar/shared_prefs/SHARED_PREF.xml
に保存され、ファイルのパーミッションは
-rw-rw-rw- (666)
になりますよね。

このプリファレンスを、「baz.qux」パッケージのActivityなどから
getSharedPreferencesメソッドを使って読みたいのですが、
第1パラメータに何を設定すればいいのかわかりませんでした。普通に書くと
自分のパッケージ内を見ちゃうし、かといって"../"とか相対で書いてみたら、
セパレータ(/)を指定するな、と例外が出てしまいます。

もちろん、パーミッションが666なので、
File file = new File("/data/data/foo.bar/shared_prefs/SHARED_PREF.xml");
などとすれば、「baz.qux」パッケージからでもファイルI/O出来るのですが、
ダサいので、多分、もっといい方法があるような気がしています。
もしよろしければ教えてもらえないでしょうか。

------------------------------------------
EGAWA Takashi



2009/02/08 5:42 Hideo KINAMI <hki...@gmail.com>:

Makoto Anjo

unread,
Mar 25, 2009, 8:34:11 AM3/25/09
to Android-SDK-Japan
江川さん

安生です。
...
Context otherAppContext = null;
try {
otherAppContext = this.createPackageContext("foo.bar",
Context.MODE_WORLD_WRITEABLE);
} catch (NameNotFoundException e) {
Log.e("hogehoge", e.getLocalizedMessage());
}

this.prefsWorldRead = otherAppContext.getSharedPreferences
("PREFS_WORLD_READABLE", 0);
...

これでいけませんかね?
> 2009/02/08 5:42 Hideo KINAMI <hkin...@gmail.com>:

gaku

unread,
Mar 25, 2009, 8:34:48 AM3/25/09
to Android-SDK-Japan
がくです。

こんにちは
私もSharedPrefrencesについて少し調べていたのですが、ダサくない方法はない気がします。
SharedPrefrenceの実際のファイルのディレクトリ位置を決めているのは、
ApplicationContext.getSharedPrefrencesで、ここでパッケージディレクトリを
指定しています。この辺をオーバーライドして、ほげほげする方法もありますが、これはもっとすっきりしません。

SharedPrefrencesは、PreferenceActivityとの連携はうまくできていますが、現状ではファイル名指定の
getSharedPrefrencesの存在意義は微妙だなぁと思えてきてます。


On 3月25日, 午後8:28, egg <t.eg...@gmail.com> wrote:
> 2009/02/08 5:42 Hideo KINAMI <hkin...@gmail.com>:

gaku

unread,
Mar 25, 2009, 8:40:43 AM3/25/09
to Android-SDK-Japan
がくです。

安西さんと完全に行き違いしたので連投です。

他人のApplicationContextってとれるんですね。
知りませんでした。
これならいけますね(試してませんが...)

egg

unread,
Mar 25, 2009, 9:58:11 PM3/25/09
to android-...@googlegroups.com
安生さん
出来ました。このメソッド便利ですね、
ご教示下さりありがとうございました。

がくさん

メールありがとうございました。
PreferenceActivityは便利ですよね、設定画面を
作ろうという気になります。

------------------------------------------
EGAWA Takashi


2009/3/25 gaku <androi...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages