Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中區分系統程序和安裝程序

Android中區分系統程序和安裝程序

編輯:關於Android編程

在google上輸入以上的關鍵字+ android,可以搜到的代碼

List packs = getPackageManager().getInstalledPackages(0);

雖然,有些代碼號稱可以過濾掉系統自身的應用程序,但是只要細看代碼就會發現,好像裡面的那個布爾變量沒有起到什麼過濾的作用。

  方法一:通過獲取的安裝包(包括安裝的與系統自身的應用程序),對其android.content.pm.PackageInfo的packageName 進行過濾,

但是Android與google的包比較容易過濾掉,但需要對不同產商進行適配;

  方法二:枚舉 \data\app 文件夾,其下的*.apk文件 就是本機安裝的軟件,而\system\App下的*.apk文件就是系統自帶的軟件,

由於普通的程序是無法讀取這兩個文件夾的,需要root權限吧,因此該方法也行不通(用File.listFiles() + android.permission.FACTORY_TEST 權限 還是不能枚舉出文件)

雖然不能枚舉文件夾 "\data\app\",但我們可以訪問(read)文件夾"\data\app\"下的所有文件,因此可以用如下的方法來獲取本機上已經安裝的軟件(排除系統的應用程序):

PackageManager pckMan = getPackageManager();
List packs = pckMan.getInstalledPackages(0);
count = packs.size();
String name;
int installedNum = 0;
for(int i = 0; i < count; i++) { 
                PackageInfo p = packs.get(i); 
    if (p.versionName == null) 
        continue; 
    
方法三、可以通過uid來過濾系統系統的安裝包,因為android系統中的uid從 1000 ~ 9999 都是給系統程序保留的,所以只要判斷package的uid > 10000即可判定該程序是非系統程序。

if(p.applicationInfo.uid > 10000) //非系統程序

uid是程序在安裝的時候由系統分配的。

方法四:這個方法應該是最優的。在廣告殺手中用的這個區分系統還是第三方軟件

ApplicationInfo appInfo = p.applicationInfo;
    /**
     * Value for {@link #flags}: if set, this application is installed in the
     * device's system image.
     */
if((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0)
    //系統程序
else
    //不是系統程序



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved