修复:Android 11 获取用户应用权限问题(申请权限QUERY_ALL_PACKAGES)

pull/86/head
pppscn 3 years ago
parent 21d45d717b
commit 1882443280

@ -3,6 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.idormy.sms.forwarder">
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

@ -65,7 +65,6 @@ public class AppListActivity extends AppCompatActivity {
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
Toast.makeText(AppListActivity.this, "加载应用列表中,请稍候...", Toast.LENGTH_LONG).show();
//是否关闭页面提示
TextView help_tip = findViewById(R.id.help_tip);
@ -110,27 +109,36 @@ public class AppListActivity extends AppCompatActivity {
//获取应用列表
private void getAppList() {
new Thread(() -> {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "user".equals(currentType) ? "正在加载用户应用,请稍候..." : "正在加载系统应用,请稍候...");
msg.setData(bundle);
handler.sendMessage(msg);
appInfoList = new ArrayList<>();
PackageManager pm = getApplication().getPackageManager();
@SuppressLint("QueryPermissionsNeeded") List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo packageInfo : packages) {
//只取用户应用
if ("user".equals(currentType) && (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
continue;
}
//只取系统应用
if ("sys".equals(currentType) && (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 1) {
continue;
try {
List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES);
for (PackageInfo packageInfo : packages) {
//只取用户应用
if ("user".equals(currentType) && isSystemApp(packageInfo)) continue;
//只取系统应用
if ("sys".equals(currentType) && !isSystemApp(packageInfo)) continue;
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
String packageName = packageInfo.packageName;
Drawable drawable = packageInfo.applicationInfo.loadIcon(pm);
String verName = packageInfo.versionName;
int verCode = packageInfo.versionCode;
AppInfo appInfo = new AppInfo(appName, packageName, drawable, verName, verCode);
appInfoList.add(appInfo);
Log.d(TAG, appInfo.toString());
}
String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
String packageName = packageInfo.packageName;
Drawable drawable = packageInfo.applicationInfo.loadIcon(pm);
String verName = packageInfo.versionName;
int verCode = packageInfo.versionCode;
AppInfo appInfo = new AppInfo(appName, packageName, drawable, verName, verCode);
appInfoList.add(appInfo);
Log.d(TAG, appInfo.toString());
} catch (Throwable t) {
t.printStackTrace();
}
Message message = new Message();
message.what = APP_LIST;
message.obj = appInfoList;
@ -138,6 +146,13 @@ public class AppListActivity extends AppCompatActivity {
}).start();
}
// 通过packName得到PackageInfo作为参数传入即可
private boolean isSystemApp(PackageInfo pi) {
boolean isSysApp = (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1;
boolean isSysUpd = (pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1;
return isSysApp || isSysUpd;
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");

@ -49,7 +49,7 @@ public class CommonUtil {
//获取当前版本名称
public static String getVersionName(Context context) throws Exception {
// 获取packagemanager的实例
// 获取PackageManager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
@ -58,7 +58,7 @@ public class CommonUtil {
//获取当前版本号
public static Integer getVersionCode(Context context) throws Exception {
// 获取packagemanager的实例
// 获取PackageManager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
@ -83,12 +83,14 @@ public class CommonUtil {
boolean permission_read_contacts = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_CONTACTS", that.getPackageName()));
boolean permission_battery_stats = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.BATTERY_STATS", that.getPackageName()));
boolean permission_bind_notification_listener_service = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.BIND_NOTIFICATION_LISTENER_SERVICE", that.getPackageName()));
boolean permission_query_all_packages = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.QUERY_ALL_PACKAGES", that.getPackageName()));
if (!(permission_internet && permission_receive_boot && permission_foreground_service &&
permission_read_external_storage && permission_write_external_storage &&
permission_receive_sms && permission_read_sms && permission_send_sms &&
permission_read_call_log && permission_read_contacts &&
permission_read_phone_state && permission_read_phone_numbers && permission_battery_stats && permission_bind_notification_listener_service)) {
permission_read_phone_state && permission_read_phone_numbers && permission_battery_stats &&
permission_bind_notification_listener_service && permission_query_all_packages)) {
ActivityCompat.requestPermissions((Activity) that, new String[]{
Manifest.permission.INTERNET,
Manifest.permission.RECEIVE_BOOT_COMPLETED,
@ -104,6 +106,7 @@ public class CommonUtil {
Manifest.permission.FOREGROUND_SERVICE,
Manifest.permission.BATTERY_STATS,
Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE,
Manifest.permission.QUERY_ALL_PACKAGES,
}, 0x01);
}
}

Loading…
Cancel
Save