PackageManager y PackageInfo
A veces necesitamos recoger informaciones sobre las aplicaciones instaladas en nuestros dispositivos Android, y podemos conseguir esto a través de dos clases de Android llamadas PackageManager y PackageInfo.
PackageManager
La clase PackageManager nos permite de obtener informaciones sobre las aplicaciones que tenemos instaladas en nuestro dispositivo.
Es una clase que obtenemos desde el método getPackageManager(), como veremos luego en su utilizo.
PackageInfo
La clase PackageInfo nos permite de obtener informaciones detalladas sobre el contenido de un package de una Aplicación.
Simplemente, con la clase PackageManager recogemos las informaciones sobre las aplicaciones instaladas en nuestro dispositivo, y por cada aplicación a través de la clase PackageInfo podemos recoger informaciones detalladas.
Código Explicado
Vamos a ver como utilizar estas dos clases para obtener informaciones sobre las aplicaciones instaladas.
Primero, tendremos que crear y obtener el PackageManager
PackageManager pm = getPackageManager();
Una vez obtenido, podemos obtener entre todas las informaciones las aplicaciones instaladas en nuestro dispositivo, a través del método getInstalledApplications(flags).
Este método pide en ingreso un set de flags para saber que informaciones recopilar al momento de ejecución,
Podemos utilizar como flag cualquiera combinación de GET_META_DATA, GET_SHARED_LIBRARY_FILES, GET_UNINSTALLED_PACKAGES para modificar los resultados.
int flags = PackageManager.GET_META_DATA |
PackageManager.GET_SHARED_LIBRARY_FILES |
PackageManager.GET_UNINSTALLED_PACKAGES;
final List<ApplicationInfo> installed_packages = pm.getInstalledApplications(flags);
Una vez obtenidos en installed_packages todas las aplicaciones instaladas, podemos analizar cada aplicación utilizando la clase PackageInfo.
PackageInfo appInfo = installed_packages[0];
PackageInfo pkgInfo = pm.getPackageInfo(
appInfo.packageName,
PackageManager.GET_PERMISSIONS);
Ahora, por cada elemento del array installed_packages podemos llamar el método getPackageInfo(packageName, flags) y obtener, a según del flag que ponemos, informaciones sobre el package de una aplicación.
Obtenemos aqui en el ejemplo los permisos que esta aplicación utiliza
Ahora, en requested_permission tenemos todos los permisos que nuestra aplicación appInfo utiliza.
Obtenemos aqui en el ejemplo los permisos que esta aplicación utiliza
PackageInfo pkgInfo = pm.getPackageInfo(
appInfo.packageName,
PackageManager.GET_PERMISSIONS);
String[] requested_permission = pkgInfo.requestedPermissions;
Ahora, en requested_permission tenemos todos los permisos que nuestra aplicación appInfo utiliza.
Ejemplo de utilizo
Ponemos aqui el código que necesitamos para obtener en dos arrays, dangerousApp para informaciones sobre todas las aplicaciones instaladas y appNameList, que es un array de String con todos los nombres de las Aplicaciones instaladas.
Ademas, incluyéremos un filtro para incluir solo las aplicaciones instalada desde el usuario, y no las aplicaciones de sistema.
// Definitions
PackageManager pm = getPackageManager();
// Retrieve all the application installed
int flags = PackageManager.GET_META_DATA |
PackageManager.GET_SHARED_LIBRARY_FILES |
PackageManager.GET_UNINSTALLED_PACKAGES;
final List<ApplicationInfo> installed_packages = pm.getInstalledApplications(flags);
// Filter all application selecting only application installed by user
for (ApplicationInfo appInfo : installed_packages) {
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
// Check if possess a dangerous permission
try {
PackageInfo pkgInfo = pm.getPackageInfo(appInfo.packageName,
PackageManager.GET_PERMISSIONS);
String[] requested_permission = pkgInfo.requestedPermissions;
if (dangerous_permission(requested_permission)) {
// Found an application with dangerous permission
dangerousApps.add(appInfo);
appNameList.add(appInfo.loadLabel(pm).toString());
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
Bibliografia
http://developer.android.com/reference/android/content/pm/PackageManager.html
http://developer.android.com/reference/android/content/pm/PackageInfo.html
+15.10.02.png)
+15.13.39.png)
+15.15.03.png)
+15.22.29.png)
+15.26.15.png)