diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index fcd5255dc9..d164109b9e 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -157,15 +157,15 @@ object DownloadObserver { } // 下载过程分析统计 - val pm = mApplication.packageManager - val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, PackageManager.GET_ACTIVITIES) - if (packageInfo == null) { +// val pm = mApplication.packageManager +// val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, 0) +// if (packageInfo == null) { // MtaHelper.onEventWithBasicDeviceInfo("解析包错误分析", // "游戏名字", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform)) // // MtaHelper.onEventWithBasicDeviceInfo("解析包错误_新", // "游戏", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform)) - } +// } } if (downloadEntity.status == DownloadStatus.done) { diff --git a/app/src/main/java/com/gh/common/util/InstallUtils.java b/app/src/main/java/com/gh/common/util/InstallUtils.java index a23f1c0be5..4e8fb3fd42 100644 --- a/app/src/main/java/com/gh/common/util/InstallUtils.java +++ b/app/src/main/java/com/gh/common/util/InstallUtils.java @@ -48,7 +48,7 @@ public class InstallUtils { public void handleMessage(Message msg) { if (msg.what == INSTALL_WHAT && packageManager != null) { ArrayList list = new ArrayList<>(); - List packageInfos = packageManager.getInstalledPackages(0); + List packageInfos = PackageUtils.getInstalledPackages(context, 0); for (PackageInfo packageInfo : packageInfos) { if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { list.add(packageInfo.packageName); diff --git a/app/src/main/java/com/gh/common/util/LibaoUtils.java b/app/src/main/java/com/gh/common/util/LibaoUtils.java index fc532d8921..3234c8d297 100644 --- a/app/src/main/java/com/gh/common/util/LibaoUtils.java +++ b/app/src/main/java/com/gh/common/util/LibaoUtils.java @@ -458,7 +458,7 @@ public class LibaoUtils { adapter.notifyDataSetChanged(); final String finalLibaoCode = libaoCode; NotificationHelper.showNotificationHintDialog(NotificationUgc.GIFT, isShow -> { - if (!isShow){ + if (!isShow) { DialogUtils.showWarningDialog(context, "领取成功", Html.fromHtml(context.getString(R.string.linged_dialog, finalLibaoCode)) , "关闭", " 复制礼包码" , () -> { @@ -547,8 +547,7 @@ public class LibaoUtils { } public static boolean isAppInstalled(Context context, String packageName) { - final android.content.pm.PackageManager packageManager = context.getPackageManager(); - List pinfo = packageManager.getInstalledPackages(0); + List pinfo = PackageUtils.getInstalledPackages(context, 0); if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName; diff --git a/app/src/main/java/com/gh/common/util/PackageHelper.kt b/app/src/main/java/com/gh/common/util/PackageHelper.kt index b488d89970..9cbda1952d 100644 --- a/app/src/main/java/com/gh/common/util/PackageHelper.kt +++ b/app/src/main/java/com/gh/common/util/PackageHelper.kt @@ -63,7 +63,7 @@ object PackageHelper { private fun getAllPackageName(context: Context): HashSet { val set = HashSet() return try { - val packageInfos = context.applicationContext.packageManager.getInstalledPackages(0) + val packageInfos = PackageUtils.getInstalledPackages(context, 0) for (packageInfo in packageInfos) { if (packageInfo.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM == 0) { if (context.packageName != packageInfo.packageName) { diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index 81b3ae0aef..d4203e0121 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -30,8 +30,11 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.io.BufferedReader; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; @@ -286,7 +289,7 @@ public class PackageUtils { */ public static String getPackageNameByPath(Context context, String path) { PackageManager packageManager = context.getApplicationContext().getPackageManager(); - PackageInfo info = packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES); + PackageInfo info = packageManager.getPackageArchiveInfo(path, 0); if (info != null) { ApplicationInfo appInfo = info.applicationInfo; return appInfo.packageName; @@ -365,7 +368,7 @@ public class PackageUtils { */ public static ArrayList getAllPackageName(Context context) { ArrayList list = new ArrayList<>(); - List packageInfos = context.getApplicationContext().getPackageManager().getInstalledPackages(0); + List packageInfos = getInstalledPackages(context, 0); for (PackageInfo packageInfo : packageInfos) { if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { if (!context.getPackageName().equals(packageInfo.packageName)) { @@ -380,7 +383,7 @@ public class PackageUtils { JSONArray jsonArray = new JSONArray(); try { PackageManager pm = context.getPackageManager(); - List packageInfos = pm.getInstalledPackages(0); + List packageInfos = getInstalledPackages(context, 0); for (PackageInfo packageInfo : packageInfos) { if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { JSONObject jsonObject = new JSONObject(); @@ -552,4 +555,42 @@ public class PackageUtils { } + /** + * 在5.1系统手机使用PackageManager获取已安装应用容易发生Package manager has died异常 + * https://stackoverflow.com/questions/13235793/transactiontoolargeeception-when-trying-to-get-a-list-of-applications-installed/30062632#30062632 + */ + public static List getInstalledPackages(Context context, int flags) { + final PackageManager pm = context.getPackageManager(); + try { + return pm.getInstalledPackages(flags); + } catch (Exception ignored) { + //we don't care why it didn't succeed. We'll do it using an alternative way instead + } + // use fallback: + Process process; + List result = new ArrayList<>(); + BufferedReader bufferedReader = null; + try { + process = Runtime.getRuntime().exec("pm list packages"); + bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = bufferedReader.readLine()) != null) { + final String packageName = line.substring(line.indexOf(':') + 1); + final PackageInfo packageInfo = pm.getPackageInfo(packageName, flags); + result.add(packageInfo); + } + process.waitFor(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bufferedReader != null) + try { + bufferedReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return result; + } + } diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index 4ab3740512..abe2c2d711 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -158,8 +158,7 @@ public class ShareUtils { //检查是否安装手机QQ public static boolean isQQClientAvailable(Context context) { - final PackageManager packageManager = context.getPackageManager(); - List pinfo = packageManager.getInstalledPackages(0); + List pinfo = PackageUtils.getInstalledPackages(context, 0); if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName; @@ -619,7 +618,7 @@ public class ShareUtils { e.printStackTrace(); } - if (mShareEntrance != ShareEntrance.shareGh ) { + if (mShareEntrance != ShareEntrance.shareGh) { safelyDismiss(); } } @@ -746,7 +745,7 @@ public class ShareUtils { } } } - + private void safelyDismiss() { if (popupWindow.get() != null) { popupWindow.get().dismiss(); diff --git a/app/src/main/java/com/gh/download/DownloadDataHelper.kt b/app/src/main/java/com/gh/download/DownloadDataHelper.kt index f41e83d39a..83fb2306b8 100644 --- a/app/src/main/java/com/gh/download/DownloadDataHelper.kt +++ b/app/src/main/java/com/gh/download/DownloadDataHelper.kt @@ -50,7 +50,7 @@ object DownloadDataHelper { "暂停下载-连上WiFi自动下载" } else if (status == DownloadStatus.done) { val pm = HaloApp.getInstance().application.applicationContext.packageManager - val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, PackageManager.GET_ACTIVITIES) + val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, 0) if (packageInfo == null) { "解析包错误" } else { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/CleanApkAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/CleanApkAdapter.java index f646c2130d..6a1e888f7b 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/CleanApkAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/CleanApkAdapter.java @@ -17,6 +17,7 @@ import androidx.core.content.ContextCompat; import com.gh.common.util.BitmapUtils; import com.gh.common.util.MtaHelper; import com.gh.common.util.PackageInstaller; +import com.gh.common.util.PackageUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.KcSelectGameViewHolder; import com.gh.gamecenter.entity.InstallGameEntity; @@ -106,7 +107,7 @@ public class CleanApkAdapter extends BaseRecyclerAdapter for (String apk_path : mApkPath) { InstallGameEntity apkEntity = new InstallGameEntity(); PackageManager pm = mContext.getApplicationContext().getPackageManager(); - PackageInfo packageInfo = pm.getPackageArchiveInfo(apk_path, PackageManager.GET_ACTIVITIES); + PackageInfo packageInfo = pm.getPackageArchiveInfo(apk_path, 0); if (packageInfo == null) continue; ApplicationInfo appInfo = packageInfo.applicationInfo; @@ -132,7 +133,7 @@ public class CleanApkAdapter extends BaseRecyclerAdapter /**安装处理类型*/ /** 得到包名 */ String packageName = packageInfo.packageName; - int type = doType(pm, packageName); + int type = doType(packageName); apkEntity.setInstallStatus(type); mApkList.add(apkEntity); @@ -176,8 +177,8 @@ public class CleanApkAdapter extends BaseRecyclerAdapter } } - private int doType(PackageManager pm, String packageName) { - List pakageinfos = pm.getInstalledPackages(0); + private int doType(String packageName) { + List pakageinfos = PackageUtils.getInstalledPackages(mContext, 0); for (PackageInfo pi : pakageinfos) { if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { String pi_packageName = pi.packageName; diff --git a/app/src/main/java/com/gh/gamecenter/qa/select/SelectGameDialogAdapter.java b/app/src/main/java/com/gh/gamecenter/qa/select/SelectGameDialogAdapter.java index 5bafb8b1a5..8433b86a0d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/select/SelectGameDialogAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/qa/select/SelectGameDialogAdapter.java @@ -14,6 +14,7 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import com.gh.common.util.BitmapUtils; +import com.gh.common.util.PackageUtils; import com.gh.common.util.UrlFilterUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.GameInstall; @@ -101,7 +102,7 @@ public class SelectGameDialogAdapter extends BaseRecyclerAdapter { PackageManager pm = mContext.getPackageManager(); - List installedPackages = pm.getInstalledPackages(0); + List installedPackages = PackageUtils.getInstalledPackages(mContext, 0); for (PackageInfo installedPackage : installedPackages) { diff --git a/app/src/main/java/com/gh/gamecenter/suggest/SuggestSelectGameAdapter.java b/app/src/main/java/com/gh/gamecenter/suggest/SuggestSelectGameAdapter.java index 1d5d57c863..12132d603d 100644 --- a/app/src/main/java/com/gh/gamecenter/suggest/SuggestSelectGameAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/suggest/SuggestSelectGameAdapter.java @@ -11,6 +11,7 @@ import android.widget.ProgressBar; import com.gh.base.OnRequestCallBackListener; import com.gh.base.fragment.BaseFragment; import com.gh.common.util.BitmapUtils; +import com.gh.common.util.PackageUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.SuggestionActivity; import com.gh.gamecenter.entity.InstallGameEntity; @@ -60,7 +61,7 @@ public class SuggestSelectGameAdapter extends BaseRecyclerAdapter { PackageManager pm = mContext.getPackageManager(); - List installedPackages = pm.getInstalledPackages(0); + List installedPackages = PackageUtils.getInstalledPackages(mContext, 0); for (PackageInfo installedPackage : installedPackages) { if ((installedPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {