2015-02-20 4 views
0

Я работаю над установщиком с системными правами, в которых мне нужно решить имя пакета APK, который еще не установлен.Получение пакета не установленного apk в приложении для Android

Просто, чтобы быть ясным, я говорю об этом в приложении для Android. Я уже знаю, как это сделать на рабочем столе.

Я уже пробовал обрабатывать APK как ZipFile и вытаскивать его из AndroidManifest.xml, но это не работает, потому что текст зашифрован.

Есть ли другие способы сделать это в рамках Android?

Спасибо за любую помощь.

+0

Эта проблема была устранена здесь, в этой ссылке. http://stackoverflow.com/questions/4470139/how-to-get-application-or-package-info-from-the-apk-file-in-the-android-applicat –

+1

Как я уже сказал, я это пробовал. Это не сработало, потому что текст в AndroidManifest.xml искажен. Если есть способ сделать его доступным для чтения, я не могу этого сделать. – TomB

ответ

1

Я нашел решение. Я вошел в источник 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; 
} 
+0

«Я вошел в источник AOSP». Поделитесь ссылкой на этот файл с помощью онлайн git repo. Откуда вы это взяли? –

+0

@JaredBurrows - это не выдержка из AOSP, скорее это вызов через отражение кода, уже присутствующего на устройстве. Поиск через AOSP - это просто то, как автор выяснил, что делать. –

Смежные вопросы