Android上獲取本機安裝的應用程序


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

List<PackageInfo> 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<PackageInfo> 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;
             //判斷該軟件包是否在/data/app目錄下
File f1 = new File( "/data/app/" +  p.packageName + ".apk");
if(!f1.exists()) continue;

installedNum++;
/**
* 應用程序的名字
*/
name = p.applicationInfo.loadLabel(pckMan).toString();
}

方法三、可以通過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
//不是系統程序

 

------IPHONE------------

1.最近在研究iPhone,發現在iPhone上要達到這樣的功能還挺麻煩的啊:

 http://www.cocoachina.com/bbs/simple/?t86829.html


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com