diff --git a/update-app/src/main/java/com/vector/update_app/SilenceUpdateCallback.java b/update-app/src/main/java/com/vector/update_app/SilenceUpdateCallback.java index 8a8106a..bcb8256 100644 --- a/update-app/src/main/java/com/vector/update_app/SilenceUpdateCallback.java +++ b/update-app/src/main/java/com/vector/update_app/SilenceUpdateCallback.java @@ -53,6 +53,11 @@ public boolean onFinish(File file) { public void onError(String msg) { } + + @Override + public boolean onInstallAppAndAppOnForeground(File file) { + return false; + } }); } } diff --git a/update-app/src/main/java/com/vector/update_app/UpdateDialogFragment.java b/update-app/src/main/java/com/vector/update_app/UpdateDialogFragment.java index 2c5f5e8..3e37e6e 100644 --- a/update-app/src/main/java/com/vector/update_app/UpdateDialogFragment.java +++ b/update-app/src/main/java/com/vector/update_app/UpdateDialogFragment.java @@ -387,6 +387,7 @@ public boolean onFinish(final File file) { @Override public void onClick(View v) { AppUpdateUtils.installApp(UpdateDialogFragment.this, file); + dismiss(); } }); } else { @@ -402,6 +403,14 @@ public void onError(String msg) { dismissAllowingStateLoss(); } } + + @Override + public boolean onInstallAppAndAppOnForeground(File file) { + // 如果应用处于前台,那么就自行处理应用安装 + AppUpdateUtils.installApp(UpdateDialogFragment.this.getActivity(), file); + dismiss(); + return true; + } }); } } diff --git a/update-app/src/main/java/com/vector/update_app/service/DownloadService.java b/update-app/src/main/java/com/vector/update_app/service/DownloadService.java index b40ce8c..7942563 100644 --- a/update-app/src/main/java/com/vector/update_app/service/DownloadService.java +++ b/update-app/src/main/java/com/vector/update_app/service/DownloadService.java @@ -189,6 +189,14 @@ public interface DownloadCallback { * @param msg 异常信息 */ void onError(String msg); + + /** + * 当应用处于前台,准备执行安装程序时候的回调, + * + * @param file + * @return + */ + boolean onInstallAppAndAppOnForeground(File file); } /** @@ -283,7 +291,10 @@ public void onResponse(File file) { if (AppUpdateUtils.isAppOnForeground(DownloadService.this) || mBuilder == null) { //App前台运行 mNotificationManager.cancel(NOTIFY_ID); - AppUpdateUtils.installApp(DownloadService.this, file); + boolean temp = mCallBack.onInstallAppAndAppOnForeground(file); + if (!temp) { + AppUpdateUtils.installApp(DownloadService.this, file); + } } else { //App后台运行 //更新参数,注意flags要使用FLAG_UPDATE_CURRENT diff --git a/update-app/src/main/java/com/vector/update_app/utils/AppUpdateUtils.java b/update-app/src/main/java/com/vector/update_app/utils/AppUpdateUtils.java index 700885d..e1dbd1d 100644 --- a/update-app/src/main/java/com/vector/update_app/utils/AppUpdateUtils.java +++ b/update-app/src/main/java/com/vector/update_app/utils/AppUpdateUtils.java @@ -96,6 +96,28 @@ public static boolean installApp(Context context, File appFile) { return false; } + public static boolean installApp(Activity activity, File appFile) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Uri fileUri = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".fileProvider", appFile); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.setDataAndType(fileUri, "application/vnd.android.package-archive"); + } else { + intent.setDataAndType(Uri.fromFile(appFile), "application/vnd.android.package-archive"); + } + if (activity.getPackageManager().queryIntentActivities(intent, 0).size() > 0) { + activity.startActivityForResult(intent, REQ_CODE_INSTALL_APP); + } + return true; + } catch (Exception e) { + // TODO 后续可以考虑这种情况应该通知应用开发者 + e.printStackTrace(); + } + return false; + } + public static boolean installApp(Fragment fragment, File appFile) { try { final Activity activity = fragment.getActivity();