PackageManagerCompat.java 6.9 KB

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