Android obtiene registros de métodos de lista de aplicaciones

prefacio

A veces, necesitamos obtener la lista de aplicaciones en el dispositivo,
como obtener todos los APK que están instalados o que se pueden mostrar en el escritorio.
Según estas listas, podemos realizar algunas funciones de administración, como la visualización de permisos, etc. .

1. Obtenga todas las aplicaciones instaladas

Para simplificar, solo se devuelve el nombre del paquete de cada aplicación.

    //{@ - 获取所有安装的APK (MATCH_UNINSTALLED_PACKAGES 表示未卸载的APK, 包括APK已被删除但是保留数据的)
    // 需要获取所有apk 添加permission <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
    private List<String> getInstalledPackages(Context context) {
    
    
        List<String> installedPackageList = new ArrayList<>();
        List<PackageInfo> installedPackageInfoList = context.getPackageManager().getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES);

        for (PackageInfo packageInfo: installedPackageInfoList) {
    
    
            installedPackageList.add(packageInfo.packageName);
        }
        return installedPackageList;
    }
    //@}

Cabe señalar aquí que la declaración de permiso debe agregarse al AndroidManifest; de lo contrario, solo se pueden obtener algunas aplicaciones.

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>

2. Obtenga todas las aplicaciones que se pueden mostrar en el escritorio

Para simplificar, solo se devuelve el nombre del paquete de cada aplicación.

    //{@add - 获取所有带有桌面属性的APK -
    // 需要获取所有apk 添加permission <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
    private List<String> getAllLauncherIconPackages(Context context) {
    
    
        List<String> launcherIconPackageList = new ArrayList<>();

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);

        //set MATCH_ALL to prevent any filtering of the results
        List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_ALL);
        for (ResolveInfo info: resolveInfos) {
    
    
            launcherIconPackageList.add(info.activityInfo.packageName);
        }

        return launcherIconPackageList;
    }
    //@add}

Cabe señalar aquí que la declaración de permiso debe agregarse al AndroidManifest; de lo contrario, solo se pueden obtener algunas aplicaciones.

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>

3. Prueba la API

Para facilitar la prueba de la API anterior, se ha agregado una función separada

    private void printPackages(List<String> packagesList, String packageTag){
    
    
         if (packagesList == null) {
    
    
             Log.d(TAG, packageTag + " packagesList is null" );
             return;
         }
        int packageSize = packagesList.size();
        Log.d(TAG, packageTag + " packageSize=" + packageSize);
        for (int index = 0; index < packageSize; index++) {
    
    
            Log.d(TAG, "The " + index + " package is: " + packagesList.get(index));
        }
    }

Entonces se puede llamar (esto se pasa en una Actividad):

        List<String> installedPackages = getInstalledPackages(this);
        printPackages(installedPackages, "installed");

        List<String> launcherIconPackages = getAllLauncherIconPackages(this);
        printPackages(launcherIconPackages, "launcherIcon");

Obtendrá el siguiente resultado:

14:40:19.096 9446 9446 AppListActivity: paquete instalado Tamaño=455
14:40:19.096 9446 9446 AppListActivity: El paquete 0 es: com.google.android.networkstack.tethering

14:40:19.114 9446 9446 AppListActivity: launcherIcon tamaño del paquete = 66
14:40:19.114 9446 9446 AppListActivity: El paquete 0 es: com.android.gallery3d

4. Ampliar

Podemos obtener resolveInfos de acuerdo con lo obtenido, a saber,
List resolveInfos = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_ALL);

Luego obtenga el objeto PackageInfo de cada aplicación de acuerdo con resolveInfo.activityInfo , y luego obtenga todos los permisos que declara.Por ejemplo :

ActivityInfo ai = resolveInfo.activityInfo;
PackageInfo pi = pm.getPackageInfo(ai.packageName, PackageManager.GET_PERMISSIONS);
if (ai.enabled && ai.exported && pi.requestedPermissions != null) {
    
    
      // 这里可以对 应用所声明的权限 做分类, 例如哪些是 涉及 用户隐私的.
}

Tenga en cuenta que pi.requestedPermissions aquí incluye todos los permisos declarados en la propia aplicación y el paquete ,
es decir, estos están en AndroidManifest:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Enlace: https://www.jianshu.com/p/5d3fa474c17d
Autor: 3 cartas al caminar

por fin

Si desea convertirse en arquitecto o quiere superar el rango de salario de 20-30K, entonces no se limite a la codificación y los negocios, sino que debe poder seleccionar modelos, expandir y mejorar el pensamiento de programación. Además, un buen plan de carrera también es muy importante, y el hábito de aprender es muy importante, pero lo más importante es poder perseverar, cualquier plan que no se pueda implementar de manera constante es una palabrería.

Si no tiene dirección, aquí hay un conjunto de " Notas avanzadas sobre ocho módulos de Android " escrito por un arquitecto senior de Ali , para ayudarlo a organizar el conocimiento desordenado, disperso y fragmentado de manera sistemática y eficiente. Domine los diversos puntos de conocimiento de Android desarrollo.

Escanee el código QR a continuación para obtenerlo gratis ~

inserte la descripción de la imagen aquí
En comparación con el contenido fragmentado que solemos leer, los puntos de conocimiento de esta nota son más sistemáticos, más fáciles de entender y recordar, y están organizados estrictamente de acuerdo con el sistema de conocimiento.

Conjunto completo de materiales de video:

1. Colección de entrevistas
inserte la descripción de la imagen aquí
2. Colección de análisis de código fuente

inserte la descripción de la imagen aquí
3. Colección de marcos de código abierto

inserte la descripción de la imagen aquí

Bienvenidos a todos a apoyar con un clic y tres enlaces. Si necesita la información del artículo, simplemente haga clic en la tarjeta WeChat de certificación oficial de CSDN al final del artículo para obtenerla gratis↓↓↓

Supongo que te gusta

Origin blog.csdn.net/Misdirection_XG/article/details/128713430
Recomendado
Clasificación