diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 05e1e802..75b9e404 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,9 @@ xmlns:tools="http://schemas.android.com/tools" package="com.idormy.sms.forwarder"> + diff --git a/app/src/main/java/com/idormy/sms/forwarder/AppListActivity.java b/app/src/main/java/com/idormy/sms/forwarder/AppListActivity.java index 0e8f03cd..3c1999cc 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/AppListActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/AppListActivity.java @@ -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 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 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"); diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java index 0d3f07ff..9f4ef297 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java @@ -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); } }