安卓不申请安装权限获取用户安装的软件

传统方法,都是通过申请android.permission.QUERY_ALL_PACKAGES权限来获取手机上安装的软件,但是有些定制系统会拦截这个权限,以至于采用pm grant 和 appops set 都会失败,必须要手动去设置里面进行授权,非常傻逼,而且每个系统都不一样,而腾讯公司旗下的应用宝却可以不申请这个权限,就能直接获取到已安装的应用。

以下是操作步骤:
1、在AndroidManifest.xml的activity里面,加入

1
2
3
4
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

2、在AndroidManifest.xml里面添加声明权限

1
2
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />

3、通过以下代码实现查询手机上已安装的软件信息,跟腾讯应用宝一样的功能实现,检索出来的软件都是一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public void queryPKGSCore(Activity activity, ArrayList<PKGINFO> pkginfos , ArrayList<Boolean> checkboxs,Integer types,Integer state){
PackageManager packageManager = activity.getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(types | PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_UNINSTALLED_PACKAGES);
if(installedPackages.size() == 1){
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL);
for (ResolveInfo info : list) {
String packageName = info.activityInfo.packageName;
try {
PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
ApplicationInfo appInfo = packageInfo.applicationInfo;
boolean isUserApp = (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 || (appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
if(isUserApp && (types.equals(QUERY_ALL_USER_PKG) || types.equals(QUERY_ALL_USER_ENABLE_PKG))){
appInfoAdd(packageManager,packageInfo,pkginfos,checkboxs,state);
}else{
appInfoAdd(packageManager,packageInfo,pkginfos,checkboxs,state);
}

} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}else{
for (PackageInfo packageInfo : installedPackages) {
appInfoAdd(packageManager,packageInfo,pkginfos,checkboxs,state);
}
}
sortPKGINFOS(pkginfos);
}

这段代码仅能检索出有桌面图标的软件,想要完整的,还是要授权,如果不授权的话,就需要通过adb进行提权,通过aidl跨进程查询,这里不多赘述。

enjoy😀