別アプリが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;
}