安卓不申请安装权限获取用户安装的软件 传统方法,都是通过申请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😀