0
0
lihuiming 3 роки тому
батько
коміт
259b57348c

+ 137 - 0
app/src/main/java/com/emato/ich/update/APKAutoUpdate.java

@@ -0,0 +1,137 @@
+package com.emato.ich.update;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class APKAutoUpdate {
+
+    private static final String TAG = APKAutoUpdate.class.getName();
+
+    /**
+     * 适配android9的安装方法。
+     * 全部替换安装
+     * @return
+     */
+    public static Boolean installApk(Context mContext, String apkFilePath, OnInstallListener listener) {
+        File apkFile = new File(apkFilePath);
+        if (!apkFile.exists()) {
+            return null;
+        }
+
+        PackageInfo packageInfo = mContext.getPackageManager().getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES);
+        if (packageInfo != null) {
+            String packageName = packageInfo.packageName;
+            int versionCode = packageInfo.versionCode;
+            String versionName = packageInfo.versionName;
+            Log.d(TAG, "packageName=" + packageName + ", versionCode=" + versionCode + ", versionName=" + versionName);
+        }
+
+        PackageInstaller packageInstaller = mContext.getPackageManager().getPackageInstaller();
+        PackageInstaller.SessionParams sessionParams
+                = new PackageInstaller.SessionParams(PackageInstaller
+                .SessionParams.MODE_FULL_INSTALL);
+        sessionParams.setSize(apkFile.length());
+
+        int mSessionId = 0;
+        try {
+            mSessionId = packageInstaller.createSession(sessionParams);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        Log.d(TAG, "sessionId---->" + mSessionId);
+        if (mSessionId != -1) {
+            boolean copySuccess = onTransformApkFile(mContext, apkFilePath, mSessionId, listener);
+            Log.d(TAG, "copySuccess---->" + copySuccess);
+            if (copySuccess) {
+                execInstallAPP(mContext, mSessionId, listener);
+            }
+        } else {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 通过文件流传输apk
+     *
+     * @param apkFilePath
+     * @return
+     */
+    private static boolean onTransformApkFile(Context mContext, String apkFilePath, int mSessionId, OnInstallListener listener) {
+        InputStream in = null;
+        OutputStream out = null;
+        PackageInstaller.Session session = null;
+        boolean success = false;
+        try {
+            File apkFile = new File(apkFilePath);
+            session = mContext.getPackageManager().getPackageInstaller().openSession(mSessionId);
+            out = session.openWrite("base.apk", 0, apkFile.length());
+            in = new FileInputStream(apkFile);
+            int total = 0, c;
+            byte[] buffer = new byte[1024 * 1024];
+            while ((c = in.read(buffer)) != -1) {
+                total += c;
+                out.write(buffer, 0, c);
+            }
+            session.fsync(out);
+            Log.d(TAG, "streamed " + total + " bytes");
+            success = true;
+        } catch (IOException e) {
+            e.printStackTrace();
+            listener.onInstallException(e);
+        } finally {
+            if (null != session) {
+                session.close();
+            }
+            try {
+                if (null != out) {
+                    out.close();
+                }
+                if (null != in) {
+                    in.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+                listener.onInstallException(e);
+            }
+        }
+        return success;
+    }
+    /**
+     * 执行安装并通知安装结果
+     *
+     */
+    private static void execInstallAPP(Context mContext, int mSessionId, OnInstallListener listener) {
+        PackageInstaller.Session session = null;
+        try {
+            session = mContext.getPackageManager().getPackageInstaller().openSession(mSessionId);
+            Intent intent = new Intent(mContext, InstallResultReceiver.class);
+            PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
+                    1, intent,
+                    PendingIntent.FLAG_UPDATE_CURRENT);
+            session.commit(pendingIntent.getIntentSender());
+            listener.onInstallSuccess();
+        } catch (IOException e) {
+            e.printStackTrace();
+            listener.onInstallException(e);
+        } finally {
+            if (null != session) {
+                session.close();
+            }
+        }
+    }
+
+
+}

+ 1 - 1
app/src/main/java/com/emato/ich/update/APKUpdateDownload.java

@@ -46,7 +46,7 @@ public class APKUpdateDownload {
                 // 文件路径
                 String absolutePath = file.getAbsolutePath();
                 // 需要自动安装并重启
-                PackageManagerCompat.install(context, absolutePath, context.getPackageManager(), new OnInstallListener() {
+                APKAutoUpdate.installApk(context, absolutePath, new OnInstallListener() {
                     @Override
                     public void onInstallException(Exception e) {
                         Log.e(TAG, "onInstallException: 安装出现异常! " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), e);

+ 20 - 8
app/src/main/java/com/emato/ich/update/PackageManagerCompat.java

@@ -13,6 +13,8 @@ import android.util.Log;
 
 import androidx.annotation.RequiresApi;
 
+import com.emato.ich.MainActivity;
+
 import java.io.BufferedReader;
 import java.io.Closeable;
 import java.io.DataOutputStream;
@@ -150,16 +152,26 @@ public class PackageManagerCompat {
      */
     public static void restartApp(Context context) {
         Log.i(TAG, "restartApp: 应用程序重启中! 日期=====>" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
-        Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
-        PendingIntent restartIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
-        AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        try {
+            Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
+            if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")) {
+                Intent intent1 = new Intent(context, MainActivity.class);
+                intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                context.startActivity(intent1);
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "restartApp: 重启失败! ", e);
+        }
+//        PendingIntent restartIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+//        AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
 
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 6.0及以上
-            mgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, restartIntent);
 
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 4.4及以上
-            mgr.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, restartIntent);
-        }
+//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 6.0及以上
+//            mgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, restartIntent);
+//
+//        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 4.4及以上
+//            mgr.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, restartIntent);
+//        }
         Log.i(TAG, "restartApp: 应用程序重启完成! 日期=====>" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
     }
 }