2012-03-22 28 views
4

私はこれを解決するために何かを探してきましたが、成功しませんでした。Android:他のアプリのSharedPreferenceにアクセスできない

古いアプリから共有設定を取得し、それを新しいアプリに追加したいとします。 セキュリティ上の問題が発生しました(疑わしい)。

私のコード:好みにファイル/data/data/my.app.pkg/shared_prefs/my.appを読むため

試み:私はこれを与えて上記のコードを実行する

Context c = createPackageContext("my.app.pkg", Context.CONTEXT_IGNORE_SECURITY);    
SharedPreferences sp = c.getSharedPreferences("my.app.pkg", Context.CONTEXT_IGNORE_SECURITY); 

。許可なくpkg_preferences.xml

でも、オブジェクトspがnullではないと思っていましたが、私の古いアプリから何も検索されません。

ほとんどの人が上記のコードをエラーなしで実行できるようになりました。 私が逃したことはありますか?

+0

これは間違っています。私の答えを見てください。 – Matthias

答えて

3

を私たちは、Androidの書籍Android in Practiceのために正確にこれをやりました。キーは、両方のアプリケーションに同じプロセスとユーザーIDを使用することです。サンプルコードとサンプルアプリケーションはGoogle Code(SharedProcessApp1とSharedProcessApp2)にあります。そこから行くことができます。

+0

これが可能な解決策の1つです。それはそれが動作するように私の古いアプリと新しいアプリの両方をアップグレードする必要があります。それはアップグレードのためのあまりにも多くの手順です。しかし、将来の使用のための良い方法。ありがとう! –

+0

はい、それが唯一可能な方法です。前述のように、Androidアプリはサンドボックス化されており、独自のLinuxユーザーIDが割り当てられています。彼らが同じIDを共有していない限り、あなたは達成しようとしていることを、少なくともルートにないデバイスではできません。 – Matthias

-1

Android APPLICATIONはそれぞれのサンドボックス内で実行されるため、1つのアプリケーションは他のアクティビティのデータにアクセスできません。 BUtアプリケーションがデータの一部を共有したい場合、これはContentProviderによって実現できます。

は、コンテンツプロバイダ参照:http://developer.android.com/guide/topics/providers/content-providers.html

+3

それは単に真実ではありません。 – Matthias

1

実際にアプリケーション間で環境設定を共有できます。それがSharedPreferencesと呼ばれる理由です。

あなたがする必要があるのは、両方のアプリケーションが同じ証明書で署名されており、両方がAndroidManifest.xmlファイルの同じSharedUserIdを共有していることを確認することです。read here。 SharedPreferencesはあなたが

PreferenceManager.getDefaultSharedPreferences(context) 

から取得するためです

は常にMODE_PRIVATEを持っています。

は、しかし、あなたもSharedPreferencesは、以下でコンテキスト内のオブジェクトを取得することができるアプリケーションで:

あなたが自由に、以下に他のアプリから盗んでき
SharedPreferences prefs = getSharedPreferences("my_public_shared_prefs", MODE_WORLD_READABLE); 

Context context = createPackageContext("my_target_app_package", Context.CONTEXT_IGNORE_SECURITY);    
SharedPreferences prefs = context.getSharedPreferences("my_public_shared_prefs", MODE_WORLD_READABLE); 

ていることを確認しますあなたと他の誰もがそのデータを読むことができるということを意味します。

古いアプリケーションのSharedPreferencesを取得するには、ManifestファイルのSharedUserIdで古いアプリケーションを更新する必要があります。

+0

詳細をありがとう!私はちょうど両方のマニフェストに共有ユーザーIDを追加することであなたのソリューションを試しました、それはすぐには動作しません、私は現在の古いアプリをアンインストールし、共有ユーザーIDで1をインストールする必要があります。このようにしないと、それ自身のshared_prefフォルダを読む権限もない。 –

+0

いいえもちろんです。それがLinuxファイルのアクセス権の仕組みです。 1人のユーザーによって作成されたファイルはそのユーザーに属します。あなたがそれをchmodまたはchownしない限り、唯一のオプションはそれを削除し、再作成することです(つまり、それはアプリケーションの再インストールが何をするかです)。 – Matthias

+1

1つのこと:ここに掲載された回答は、 。セキュリティの悪夢?あなたがコントロールするアプリケーションにのみ共有したいので、AIPサンプルアプリケーションで使用しているアプローチを使用することを強くお勧めします。 – Matthias

関連する問題