From 2d842103e3cdfd872ca72f2941f361fd228119d7 Mon Sep 17 00:00:00 2001 From: zhaojin Date: Thu, 5 Apr 2018 23:00:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BD=BF=E7=94=A8=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=9A=84UpdateDialogFragment=E5=9C=A8=E5=88=9D?= =?UTF-8?q?=E6=AC=A1=E5=AE=89=E8=A3=85=E5=BA=94=E7=94=A8=E6=97=B6=E5=80=99?= =?UTF-8?q?=EF=BC=8C=E5=9B=A0=E4=B8=BADownloadService=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E8=83=BD=E4=BD=BF=E7=94=A8activity.startActivityForResult?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=AE=89=E8=A3=85=E7=95=8C=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=94=A8=E6=88=B7=E5=A6=82=E6=9E=9C=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E5=AE=89=E8=A3=85=EF=BC=8C=E6=8F=92=E4=BB=B6=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E8=80=85=E5=BE=97=E4=B8=8D=E5=88=B0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update_app/SilenceUpdateCallback.java | 5 +++++ .../update_app/UpdateDialogFragment.java | 9 ++++++++ .../update_app/service/DownloadService.java | 13 ++++++++++- .../update_app/utils/AppUpdateUtils.java | 22 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) 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();