Я нашел решение. Я вошел в источник AOSP и нашел некоторые скрытые методы в AssetManager, которые делают трюк при вызове через отражение. Системные разрешения не нужны.
public static String extractPackageName(Context ctx, String apkPath) {
try {
AssetManager assmgr = ctx.getAssets();
Method addAssetPathMethod = assmgr.getClass().getMethod("addAssetPath", String.class);
Method setConfigurationMethod = assmgr.getClass().getMethod("setConfiguration",
int.class, int.class, String.class, int.class, int.class,
int.class,int.class, int.class, int.class, int.class, int.class,
int.class, int.class, int.class, int.class, int.class, int.class);
int cookie = ((Integer) addAssetPathMethod.invoke(assmgr, apkPath)).intValue();
if (cookie != 0) {
final DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
setConfigurationMethod.invoke(assmgr, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Build.VERSION.SDK_INT);
XmlResourceParser parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT) {}
String packageName = parser.getAttributeValue(null, "package");
return packageName;
}
} catch (Exception e) {
}
return null;
}
Эта проблема была устранена здесь, в этой ссылке. http://stackoverflow.com/questions/4470139/how-to-get-application-or-package-info-from-the-apk-file-in-the-android-applicat –
Как я уже сказал, я это пробовал. Это не сработало, потому что текст в AndroidManifest.xml искажен. Если есть способ сделать его доступным для чтения, я не могу этого сделать. – TomB