PackageManagerCompat.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package com.emato.ich.update;
  2. import android.app.Activity;
  3. import android.app.AlarmManager;
  4. import android.app.PendingIntent;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.pm.PackageInstaller;
  8. import android.content.pm.PackageManager;
  9. import android.net.Uri;
  10. import android.os.Build;
  11. import android.util.Log;
  12. import androidx.annotation.RequiresApi;
  13. import com.emato.ich.MainActivity;
  14. import java.io.BufferedReader;
  15. import java.io.Closeable;
  16. import java.io.DataOutputStream;
  17. import java.io.File;
  18. import java.io.FileInputStream;
  19. import java.io.IOException;
  20. import java.io.InputStream;
  21. import java.io.InputStreamReader;
  22. import java.io.OutputStream;
  23. import java.text.DateFormat;
  24. import java.text.SimpleDateFormat;
  25. import java.util.Date;
  26. public class PackageManagerCompat {
  27. private static final String TAG = PackageManagerCompat.class.getName();
  28. /*public static void install(Activity activity, File apkFile, OnInstallListener listener){
  29. try{
  30. Intent intent =new Intent();
  31. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  32. //Uri uri = Uri.fromFile(apkFile);
  33. Uri uri = null;
  34. //todo N FileProvider
  35. //todo O install permission
  36. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
  37. uri = androidx.core.content.FileProvider.getUriForFile(activity,activity.getPackageName()+".fileprovider", apkFile);
  38. intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  39. intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
  40. }else{
  41. uri = Uri.fromFile(apkFile);
  42. }
  43. intent.setDataAndType(uri, "application/vnd.android.package-archive");
  44. activity.startActivity(intent);
  45. listener.onInstallSuccess();
  46. } catch (Exception e) {
  47. listener.onInstallException(e);
  48. }
  49. }*/
  50. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  51. public static void install(Context context, String apkFilePath, PackageManager packageManager, OnInstallListener listener) {
  52. try {
  53. Log.i(TAG, "install: 应用程序开始安装! " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  54. File apkFile = new File(apkFilePath);
  55. if (!apkFile.exists()) {
  56. throw new RuntimeException("文件不存在! 更新失败! ");
  57. }
  58. PackageInstaller packageInstaller = packageManager.getPackageInstaller();
  59. PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
  60. sessionParams.setSize(apkFile.length());
  61. int sessionId = createSession(packageInstaller, sessionParams);
  62. if (sessionId != -1) {
  63. boolean copySuccess = copyInstallFile(packageInstaller, sessionId, apkFilePath, listener);
  64. if (copySuccess) {
  65. execInstallCommand(context, packageInstaller, sessionId, listener);
  66. }
  67. }
  68. Log.i(TAG, "install: 应用程序安装完成! " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  69. } catch (Exception e) {
  70. listener.onInstallException(e);
  71. }
  72. }
  73. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  74. private static int createSession(PackageInstaller packageInstaller,
  75. PackageInstaller.SessionParams sessionParams) {
  76. int sessionId = -1;
  77. try {
  78. sessionId = packageInstaller.createSession(sessionParams);
  79. } catch (IOException e) {
  80. e.printStackTrace();
  81. }
  82. return sessionId;
  83. }
  84. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  85. private static boolean copyInstallFile(PackageInstaller packageInstaller,
  86. int sessionId, String apkFilePath, OnInstallListener listener) {
  87. InputStream in = null;
  88. OutputStream out = null;
  89. PackageInstaller.Session session = null;
  90. boolean success = false;
  91. try {
  92. File apkFile = new File(apkFilePath);
  93. session = packageInstaller.openSession(sessionId);
  94. out = session.openWrite("base.apk", 0, apkFile.length());
  95. in = new FileInputStream(apkFile);
  96. int total = 0, c;
  97. byte[] buffer = new byte[65536];
  98. while ((c = in.read(buffer)) != -1) {
  99. total += c;
  100. out.write(buffer, 0, c);
  101. }
  102. session.fsync(out);
  103. success = true;
  104. } catch (IOException e) {
  105. listener.onInstallException(e);
  106. } finally {
  107. closeQuietly(out, listener);
  108. closeQuietly(in, listener);
  109. closeQuietly(session, listener);
  110. }
  111. return success;
  112. }
  113. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  114. private static void execInstallCommand(Context context, PackageInstaller packageInstaller, int sessionId, OnInstallListener listener) {
  115. PackageInstaller.Session session = null;
  116. try {
  117. session = packageInstaller.openSession(sessionId);
  118. Intent intent = new Intent(context, InstallResultReceiver.class);
  119. PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  120. session.commit(pendingIntent.getIntentSender());
  121. listener.onInstallSuccess();
  122. } catch (IOException e) {
  123. listener.onInstallException(e);
  124. } finally {
  125. closeQuietly(session, listener);
  126. }
  127. }
  128. private static void closeQuietly(Closeable c, OnInstallListener listener) {
  129. if (c != null) {
  130. try {
  131. c.close();
  132. } catch (IOException ignored) {
  133. listener.onInstallException(ignored);
  134. }
  135. }
  136. }
  137. /**
  138. * 重启
  139. * @param context 应用上下文
  140. */
  141. public static void restartApp(Context context) {
  142. Log.i(TAG, "restartApp: 应用程序重启中! 日期=====>" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  143. try {
  144. Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
  145. if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")) {
  146. Intent intent1 = new Intent(context, MainActivity.class);
  147. intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  148. context.startActivity(intent1);
  149. }
  150. } catch (Exception e) {
  151. Log.e(TAG, "restartApp: 重启失败! ", e);
  152. }
  153. // PendingIntent restartIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
  154. // AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
  155. // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 6.0及以上
  156. // mgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, restartIntent);
  157. //
  158. // } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 4.4及以上
  159. // mgr.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, restartIntent);
  160. // }
  161. Log.i(TAG, "restartApp: 应用程序重启完成! 日期=====>" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  162. }
  163. }