Acceso al atributo de manifiesto android: installLocation

Estoy tratando de escribir una aplicación Android 2.2 que encontrará aplicaciones instaladas que se pueden mover a la tarjeta SD. El permiso para hacerlo está codificado en el archivo AndroidManifest.xml como el atributo de nivel raíz " android: installLocation ". PackageInfo parece tener una interfaz para todo menos este atributo. Puedo abrir el apk instalado y extraer el archivo AndroidManifest.xml, pero parece estar en algún formato de codificación binaria, que algunos usuarios de Internet al azar han escrito un decodificador para, pero que parece una gran cantidad de trabajo.

¿Hay una interfaz que me falta?

Como resulta, aunque no hay una llamada directa de API para obtener installLocation , tampoco tengo que analizar el XML binario manualmente, ya que el XmlResourceParser proporcionado funciona en él.

 // Experimentally determined private static final int auto = 0; private static final int internalOnly = 1; private static final int preferExternal = 2; AssetManager am = createPackageContext(packageName, 0).getAssets(); XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); int eventType = xml.getEventType(); xmlloop: while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case 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")) { switch (Integer.parseInt(xml.getAttributeValue(j))) { case auto: // Do stuff break; case internalOnly: // Do stuff break; case preferExternal: // Do stuff break; default: // Shouldn't happen // Do stuff break; } break attrloop; } } } break; } eventType = xml.nextToken(); } 

Uh, supongo que hay un switch allí con un case que probablemente debería ser sólo un if . Oh bien. Tú entiendes.

Teniendo en cuenta todos los otros atributos directos de la etiqueta de manifiesto están disponibles en PackageInfo, creo que tienes razón al buscar allí.

Sé que no está en el documento, pero ¿lo intentaste de todos modos? Algo como

 PackageInfo pkg = ...; String loc = pkg.installLocation(); 

Sé que esto es probablemente muy ingenuo teniendo en cuenta que el doc puede incluso ser generado automáticamente – y no me atrevería a sugerir si podría probarlo yo mismo (atrapado en la API 7 en este momento debido a retraso OS no es compatible con más en 8)

Si no funciona, me temo que sólo pasamos por alto que – no puedo imaginar que lo pondría en otro lugar de repente. En ese caso, usted probablemente se quedará analizando los manifiestos por sí mismo de hecho.

En la API más antigua de 2007, había campos públicos en la clase PackageInfo que proporcionaban toda la información sobre la ubicación interna y otra información relevante. Por razones de seguridad supongo que se deshizo de esos campos convenientes.

Puede acceder a este atributo en el siguiente ejemplo:

 PackageInfo packageInfo = context.getPackageManager().getPackageInfo(mPackageName, 0); if (packageInfo.installLocation != PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) { ..... } 

http://developer.android.com/reference/android/content/pm/PackageInfo.html#installLocation
Fue introducido en API 21

Pero este campo existe incluso en Android 2.3 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/content/pm/PackageInfo.java/

  • La configuración de un indicador personalizado para ExpandableListView no funciona
  • cómo encontrar mis errores en el archivo xml
  • Leer de forma programada Estado de depuración en Manifest
  • Tamaño de imagen de mapa de bits de Android en xml
  • Cómo detener a Eclipse de intentar ejecutar archivos XML?
  • ScrollView no se desplaza a la parte inferior
  • Android.content.res.Resources $ NotFoundException: Cadena de recursos ID # 0x0
  • Archivos de diseño XML de Android y espacio de nombres
  • Simple-XML analiza el feed RSS con 2 que se declara dos veces
  • Múltiples animaciones en 1 imageview android
  • org.w3c.dom.Node con la versión de Android menos de 2.2
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.