1

作爲一項安全措施,我希望獲取未從Play商店安裝的應用列表。有沒有辦法做到這一點?Android獲取非Play商店應用列表

packageManager包含一個方法getInstalledApplications但我不知道要添加哪些標誌來獲取列表。任何幫助,將不勝感激。

編輯:這是v4_adi的答案的代碼示例。

public static List<String> getAppsFromUnknownSources(Context context) 
{ 
    List<String> apps = new ArrayList<>(); 
    PackageManager packageManager = context.getPackageManager(); 
    List<PackageInfo> packList = packageManager.getInstalledPackages(0); 
    for (int i = 0; i < packList.size(); i++) 
    { 
    PackageInfo packInfo = packList.get(i); 
    if (packageManager.getInstallerPackageName(packInfo.packageName) == null) 
    { 
     apps.add(packInfo.packageName); 
    } 
    } 

    return apps; 
} 

這是一個良好的開端,然而,這也返回了很多關預裝Android和三星的應用程序。無論如何將它們從列表中刪除?我只想要用戶安裝來自未知來源的應用程序。

+0

如果問題得到解決。將已解決問題的答案標記爲已接受。 –

回答

0

原本我以爲這將是足夠的,以檢索不是通過谷歌Play商店安裝的應用程式。後來我發現我也需要過濾掉預先安裝的系統應用程序。 我在另一篇文章中發現了拼圖的最後部分:Get list of Non System Applications

public static List<String> getAppsFromUnknownSources(Context context) 
{ 
    List<String> apps = new ArrayList<>(); 
    PackageManager packageManager = context.getPackageManager(); 
    List<PackageInfo> packList = packageManager.getInstalledPackages(0); 
    for (int i = 0; i < packList.size(); i++) 
    { 
    PackageInfo packInfo = packList.get(i); 
    boolean hasEmptyInstallerPackageName = packageManager 
      .getInstallerPackageName(packageInfo.packageName) == null; 
    boolean isUserInstalledApp = (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0; 

    if (hasEmptyInstallerPackageName && isUserInstalledApp) 
    { 
     apps.add(packInfo.packageName); 
    } 
    } 

    return apps; 
}