<< Android-Note
他アプリのContextの取得
他アプリの情報を調る場合の手段の1つとしてアプリのContextを直接作る方法があります。
取得方法は簡単でActivityクラスなどでcreatePackageContextを呼び出すだけです。
public abstract Context createPackageContext([パッケージ名],[フラグ])
フラグには3種類あり、それぞれ次の意味を持ちます。
- CONTEXT_INCLUDE_CODE
- CONTEXT_INCLUDE_CODE
- CONTEXT_RESTRICTED
パッケージ内のクラスをインスタンス化できる状態でContextを作成する。
どのようなセキュリティ制限も無視してContextを作成する。
特定の機能を制限してContextを作成する。
例えば"com.example.xxx"というパッケージのContextを作りたければ次のコードを書きます。
Context otherAppContext = createPackageContext("com.example.xxx", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
では、これが何の役に立つかというと次のような利用方法が考えられます。
- 別々のアプリでSharedPreferencesを共有できる
- 他アプリのリソース(画像やテキスト)にアクセスできる
- 他アプリのクラスをインスタンス化できる
利用例1 : アプリ設定の共有
SharedPreferencesで保存されたアプリ設定をアプリ間で共有するには、まずあるアプリ(com.example.xxx)でMODE_WORLD_READABLEでSharedPreferencesを作成します。
SharedPreferences prefs = getSharedPreferences("xxx", MODE_WORLD_READABLE); Editor prefsEditor = prefs.edit(); prefsEditor.putString("userName", "guest"); prefsEditor.commit();
これを別アプリで読み出すには次のようにします。
Context context = createPackageContext( "com.example.xxx", CONTEXT_RESTRICTED); SharedPreferences prefs = context.getSharedPreferences( "xxx", Context.MODE_PRIVATE); String userName = prefs.getString("userName", "guest");
利用例2 : リソースの読み込み
Contextが取得できればその中にある画像やテキストなどのリソースも取得できます。
具体的にはまずContext内のRクラスをリフレクションで読み込み、そこからリソースIDを探してリソースを取得できます。
try { Context otherAppContext = getActivity().createPackageContext( "com.example.xxx", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); Resources resources = context.getResources(); /** Rクラスの読み込み */ Class<?> externalR = context.getClassLoader().loadClass( "com.example.xxx.R"); /**Rないに含まれる全ての内部クラスの読み込み */ Class<?>[] resourceTypes = externalR.getDeclaredClasses(); int id; for(Class<?> resourceType : resourceTypes){ String reosurceTypeName = resourceType.getName(); ///リソースの識別名(drawableなど) for(Field field : resourceType.getFields()){ /** 画像リソースの取得 */ if(resourceTypeName.contains("drawable")){ try { id = field.getInt(resourceType); Drawable drawable = resources.getDrawable(id); } catch (IllegalAccessException | IllegalArgumentException e) { e.printStackTrace(); } } /** テキストリソースの取得 */ if(resourceTypeName.contains("string")){ try { id = field.getInt(resourceType); String text = resources.getDString(id); } catch (IllegalAccessException | IllegalArgumentException e) { e.printStackTrace(); } } } } } catch ( NameNotFoundException | ClassNotFoundException e) { e.printStackTrace(); }
この例では画像とテキストをリソースを読み込んでいます。
Rクラス内にはリソースIDを持つ内部クラスがあるので、その中でdrawable(画像)またはstring(テキスト)に属するリソースIDから画像やテキストをResourcesクラスのメソッドを使って取得しています。
もちろんrawフォルダなどの組み込み済みでないリソースも読み込み可能です。
以上、他アプリのContextを取得する方法でした。
関連項目
© Kaz