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);
}
}