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?
- Cómo aumentar el tamaño de transport.dump de 256 bytes a 512 o más bytes en KSOAP2?
- ¿Cómo se hace el texto en un archivo xml de la lista de capas android?
- Android - Botón de radio - el botón dibujable no se muestra en Lollipop
- InflateException: Línea de archivo XML binario # 1: Error de inflar clase <unknown> causada por OutOfMemoryError
- Animación de agitación de botón de Android
- ¿Puede un ToggleButton cambiar la funcionalidad de otros botones en la misma Actividad?
- La vista personalizada no aparece
- Cómo analizar XML utilizando el analizador SAX
- Cambiar el color del texto del elemento de menú en el cajón de navegación
- ImageView en el diseño de android XML con layout_height = "wrap_content" tiene relleno superior e inferior
- Cómo configurar la aplicación RecyclerView: layoutManager = "" de XML?
- Actualizando a Android Studio 3.0 Canary 5 causando "IllegalArgumentException: AppCompat no admite las características del tema actual .."
- configurar el color de fondo en listview
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/
- Android: vista personalizada basada en el diseño: ¿cómo?
- Cómo obtener la cadena subyacente de un JsonParser (Jackson Json)