android 判断是否为系统应用
一定要用&號(hào)?
?
方法四:這個(gè)方法應(yīng)該是最優(yōu)的。
| 1 | ApplicationInfo appInfo = p.applicationInfo; |
| 2 | ???? /** |
| 3 | ????? * Value for {@link #flags}: if set, this application is installed in the |
| 4 | ????? * device's system image. |
| 5 | ????? */ |
| 6 | if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0 ) |
| 7 | ???? //系統(tǒng)程序 |
| 8 | else |
?????? //不是系統(tǒng)程序
?
?
在google上輸入以上的關(guān)鍵字+ android,可以搜到的代碼:
| 1 | List<PackageInfo> packs = getPackageManager().getInstalledPackages( 0 ); |
?
雖然,有些代碼號(hào)稱可以過濾掉系統(tǒng)自身的應(yīng)用程序,但是只要細(xì)看代碼就會(huì)發(fā)現(xiàn),好像里面的那個(gè)布爾變量沒有起到什么過濾的作用。
方法一 :通過獲取的安裝包(包括安裝的與系統(tǒng)自身的應(yīng)用程序),對(duì)其android.content.pm.PackageInfo的packageName 進(jìn)行過濾,
但是Anrodi與google的包比較容易過濾掉,但需要對(duì)不同產(chǎn)商進(jìn)行適配;
方法二 :枚舉 /data/app 文件夾,其下的*.apk文件 就是本機(jī)安裝的軟件,而/system/App下的*.apk文件就是系統(tǒng)自帶的軟件,
由于普通的程序是無(wú)法讀取這兩個(gè)文件夾的,需要root權(quán)限吧,因此該方法也行不通(用File.listFiles() + android.permission.FACTORY_TEST 權(quán)限 還是不能枚舉出文件)
雖然不能枚舉文件夾 "/data/app/",但我們可以訪問(read)文件夾"/data/app/"下的所有文件,因此可以用如下的方法來(lái)獲取本機(jī)上已經(jīng)安裝的軟件(排除系統(tǒng)的應(yīng)用程序):
| 01 | PackageManager pckMan = getPackageManager(); |
| 02 | List<PackageInfo> packs = pckMan.getInstalledPackages( 0 ); |
| 03 | count = packs.size(); |
| 04 | String name; |
| 05 | int installedNum = 0 ; |
| 06 | for ( int i = 0 ; i < count; i++) { |
| 07 | ???????????????? PackageInfo p = packs.get(i); |
| 08 | ???? if (p.versionName == null ) |
| 09 | ???????? continue ; |
| 10 | ??? ? |
| 01 | ????????????? //判斷該軟件包是否在/data/app目錄下 |
| 02 | ???? File f1 = new File(? "/data/app/" +? p.packageName + ".apk" ); |
| 03 | ???? if (!f1.exists()) continue ; |
| 04 | ? |
| 05 | ???? installedNum++; |
| 06 | ???? /** |
| 07 | ????? * 應(yīng)用程序的名字 |
| 08 | ????? */ |
| 09 | ???? name = p.applicationInfo.loadLabel(pckMan).toString(); |
| 10 | } |
方法三 、可以通過uid來(lái)過濾系統(tǒng)系統(tǒng)的安裝包,因?yàn)閍ndroid系統(tǒng)中的uid從 1000 ~ 9999 都是給系統(tǒng)程序保留的,所以只要判斷package的uid > 10000即可判定該程序是非系統(tǒng)程序。
| 1 | if (p.applicationInfo.uid > 10000 ) |
| 2 | ??? //非系統(tǒng)程序 |
?
uid是程序在安裝的時(shí)候由系統(tǒng)分配的。
?
Android源碼上的方法? com/android/settings/ManageApplications.java
[java] view plaincopyprint?
總結(jié)
以上是生活随笔為你收集整理的android 判断是否为系统应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 借助ADB冻结与卸载Android系统应
- 下一篇: 华为鸿蒙系统应用开发工具介绍 DevEc