天天看點

Android11擷取目前手機已安裝應用清單

最近在上架GooglePlay,奈何Google8月份剛釋出的稽核警告

Android11擷取目前手機已安裝應用清單

Google也說了能适用的APP類型如下:

Android11擷取目前手機已安裝應用清單

 其實 QUERY_ALL_PACKAGES 這個權限是針對 Android11以及以上系統擷取不全目前手機已安裝app清單添加的權限。  Android11以下不添加這個權限,是正常拿到清單的。 但我們做程式怎麼可能不考慮适配呢。于是乎,解決思路根據Google文檔的方案。

Android11擷取目前手機已安裝應用清單

在AndroidManifest.xml  中添加

<queries package="${applicationId}">
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE"/>
        </intent>
        <intent>
            <action android:name="android.media.action.ACTION_VIDEO_CAPTURE"/>
        </intent>

        <intent>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent>
    </queries>
           
@NonNull
    public static List<String> getAllApps(@NonNull Context context) {
        List<String> apps = new ArrayList<>();
        PackageManager pManager = context.getPackageManager();
        // 擷取手機内所有應用
        @SuppressLint("QueryPermissionsNeeded") List<ApplicationInfo> packlist = pManager.getInstalledApplications(0);
        for (int i = 0, len = packlist.size(); i<len; i++) {
            ApplicationInfo pak = (ApplicationInfo) packlist.get(i);
            // if()裡的值如果<=0則為自己裝的程式,否則為系統工程自帶
            if ((pak.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
                // 添加自己已經安裝的應用程式
                apps.add(pak.packageName);
            }
//            apps.add(pak);
        }
        return apps;
    }
           

其實利用了過濾器原則,在清單檔案中篩選包含 MAIN 的應用。 正常應用來說都會有一個MAIN程式主入口。利用這個機制,完美拿到所有Android系統的已安裝應用清單。

喜歡的話點個小心心再走~

如果不在海外上架的小夥伴,該添權重限的添權重限,友善省事。