PackageManagerCompat.java 7.6 KB

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