diff --git a/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt index 34bca83c83..b73da59329 100644 --- a/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt @@ -19,6 +19,7 @@ import com.gh.common.util.PermissionHelper.INSTALL_PERMISSION_CODE import com.gh.common.xapk.XapkInstaller import com.gh.gamecenter.R import com.lightgame.download.DownloadEntity +import com.lightgame.utils.Utils import kotlin.random.Random class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { @@ -26,7 +27,7 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { lateinit var mView: View var isXapk = false var url: String = "" - var mCallBack: (() -> Unit)? = null + var mCallBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { mView = inflater.inflate(R.layout.dialog_install_permission, null, false) @@ -56,7 +57,7 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { closeTv.setOnClickListener { MtaHelper.onEvent(getEvent(), getKey(), "文案样式_点击以后再说") if (isXapk) { - mCallBack?.invoke() + mCallBack?.invoke(false) } dismiss() } @@ -77,9 +78,11 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISSION_CODE) { - SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "") - SPUtils.setString(Constants.SP_XAPK_URL, "") - mCallBack?.invoke() + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "") + SPUtils.setString(Constants.SP_XAPK_URL, "") + } + mCallBack?.invoke(true) dismiss() } } @@ -90,27 +93,27 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() { companion object { @JvmStatic - fun show(activity: AppCompatActivity, downloadEntity: DownloadEntity, callBack: (() -> Unit)?) { + fun show(activity: AppCompatActivity, downloadEntity: DownloadEntity, callBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)?) { val isXapk = XapkInstaller.XAPK_EXTENSION_NAME == downloadEntity.path.getExtension() if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - callBack?.invoke() + callBack?.invoke(false) return } val haveInstallPermission = activity.packageManager.canRequestPackageInstalls() if (haveInstallPermission) { - callBack?.invoke() + callBack?.invoke(false) return } if (isXapk) { val xapkUnzipVersions = Config.getSettings()?.permissionPopupAppliedVersions?.xapkUnzip if (xapkUnzipVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) { - callBack?.invoke() + callBack?.invoke(false) return } } else { val installVersions = Config.getSettings()?.permissionPopupAppliedVersions?.install if (installVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) { - callBack?.invoke() + callBack?.invoke(false) return } } diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index b9aae9125e..69b22b6c14 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -53,15 +53,23 @@ object PackageInstaller { // TODO 此处可能遇到 activity 是 WXEntryActivity // TODO 当 activity 全部出栈,但是应用还在下载游戏,下载完会唤不起安装! if (currentActivity is AppCompatActivity && !currentActivity.isFinishing) { - InstallPermissionDialogFragment.show(currentActivity, downloadEntity) { + InstallPermissionDialogFragment.show(currentActivity, downloadEntity) { isFromPermissionGrantedCallback -> // 取消状态栏下载完成的通知,若存在 downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity) - if (isXapk) { - XapkInstaller.install(context, downloadEntity, showUnzipToast) + if (isFromPermissionGrantedCallback && Build.VERSION.SDK_INT >= 31) { + val pm = context.packageManager + val intent = pm.getLaunchIntentForPackage(context.packageName) + val mainIntent = Intent.makeRestartActivityTask(intent!!.component) + context.startActivity(mainIntent) + Runtime.getRuntime().exit(0) } else { - install(context, downloadEntity.isPlugin, downloadEntity.path) + if (isXapk) { + XapkInstaller.install(context, downloadEntity, showUnzipToast) + } else { + install(context, downloadEntity.isPlugin, downloadEntity.path) + } } } } diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 1f6e754ce6..17708e5ea2 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -295,11 +295,6 @@ public class MainActivity extends BaseActivity { checkDialog(); } -// handler.postDelayed(() -> { -// PushHelper.postPushClickAction(this.getApplicationContext(), null); -// }, 2000); - - // 耗时操作 AppExecutor.getIoExecutor().execute(() -> { // 上传数据 @@ -312,9 +307,6 @@ public class MainActivity extends BaseActivity { // 初始化PlatformUtils PlatformUtils.getInstance(getApplicationContext()); -// // 友盟记录启动 -// PushAgent.getInstance(this).onAppStart(); - HomePluggableHelper.activationFilterData(); }); @@ -336,6 +328,9 @@ public class MainActivity extends BaseActivity { postAttentionVideoRecord(); deleteSimulatorGame(); + // 检查是否需要触发 XAPK 安装 + AppExecutor.getUiExecutor().executeWithDelay(this::resumeXapkInstallIfNeeded, 150); + QuickLoginHelper.getPhoneInfo(this); WechatBindHelper.getWechatConfig(null); initWBSDK(); @@ -1033,4 +1028,23 @@ public class MainActivity extends BaseActivity { } } + /** + * 重新触发 XAPK 安装流程 + * 因为 Android 12 起授予应用安装未知应用权限以后不触发进程重启,导致应用一直无法读写 android/data 目录 + * 所以这里再手动重启应用进程时再触发一回安装 + */ + private void resumeXapkInstallIfNeeded() { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + String xapkUrl = SPUtils.getString(Constants.SP_XAPK_URL); + if (!TextUtils.isEmpty(xapkUrl)) { + DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntityByUrl(xapkUrl); + if (downloadEntity != null) { + PackageInstaller.install(this, downloadEntity, false); + } + } + SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, ""); + SPUtils.setString(Constants.SP_XAPK_URL, ""); + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index 82a88d201b..3519e0f959 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -5,6 +5,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -176,8 +177,10 @@ public class SplashScreenActivity extends BaseActivity { launchMainActivity(); } - SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, ""); - SPUtils.setString(Constants.SP_XAPK_URL, ""); + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, ""); + SPUtils.setString(Constants.SP_XAPK_URL, ""); + } } private void showPrivacyDialog(ViewPager guideLayout) {