AndroidManifest.mxl内の情報を取得する

別アプリがSDへ移動できるか調べる方法で手間取ったため、方法をメモ
以下のコードでパッケージ内のinstallLocationの値を取得できる。
別の値がほしければinstallLocationの所を書き換えれば良い。
ただし、rootじゃなきゃ読めない所にあるアプリとか存在しないパッケージとかだと
初期値のままの値が帰ってくる。

      

  /**
   * AndroidManifest.xmlのInstallLocationの値を取得する関数です
   * @param packageName 
* String : Package Name * @return int
* 0 is "auto"
* 1 is "internalOnly"
* 2 is "preferExternal"
* 4 is Outlier
* 5 NameNotFoundException
* 6 IOException
* 7 XmlPullParserException
* 8 is Not get
*/ private int getPacageInstallLocation( String packageName ) { AssetManager am; XmlResourceParser xml; int eventType; int ret = 8; try { am = context.createPackageContext( packageName, 0 ).getAssets(); xml = am.openXmlResourceParser("AndroidManifest.xml"); eventType = xml.getEventType(); xmlloop: while ( eventType != XmlPullParser.END_DOCUMENT ) { if ( eventType == XmlPullParser.START_TAG ) { if (! xml.getName().matches("manifest")) { break xmlloop; } else { attrloop: for (int j = 0; j < xml.getAttributeCount(); j++) { if (xml.getAttributeName(j).matches("installLocation")) { ret = Integer.parseInt(xml.getAttributeValue(j)); if( ret >= 3 || ret < 0 ){ ret = 4; } break attrloop; } } } break; } eventType = xml.nextToken(); } } catch (NameNotFoundException e) { ret = 5; } catch (IOException e) { ret = 6; } catch (XmlPullParserException e) { ret = 7; } return ret; }

戻る