APKAutoUpdate.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package com.emato.ich.update;
  2. import android.app.PendingIntent;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.pm.PackageInfo;
  6. import android.content.pm.PackageInstaller;
  7. import android.content.pm.PackageManager;
  8. import com.emato.ich.utils.Log;
  9. import java.io.File;
  10. import java.io.FileInputStream;
  11. import java.io.IOException;
  12. import java.io.InputStream;
  13. import java.io.OutputStream;
  14. public class APKAutoUpdate {
  15. private static final String TAG = APKAutoUpdate.class.getName();
  16. /**
  17. * 适配android9的安装方法。
  18. * 全部替换安装
  19. * @return
  20. */
  21. public static Boolean installApk(Context mContext, String apkFilePath, InstallListener listener) {
  22. File apkFile = new File(apkFilePath);
  23. if (!apkFile.exists()) {
  24. return null;
  25. }
  26. PackageInfo packageInfo = mContext.getPackageManager().getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES);
  27. if (packageInfo != null) {
  28. String packageName = packageInfo.packageName;
  29. int versionCode = packageInfo.versionCode;
  30. String versionName = packageInfo.versionName;
  31. Log.i(TAG, "packageName=" + packageName + ", versionCode=" + versionCode + ", versionName=" + versionName);
  32. }
  33. PackageInstaller packageInstaller = mContext.getPackageManager().getPackageInstaller();
  34. PackageInstaller.SessionParams sessionParams
  35. = new PackageInstaller.SessionParams(PackageInstaller
  36. .SessionParams.MODE_FULL_INSTALL);
  37. sessionParams.setSize(apkFile.length());
  38. int mSessionId = 0;
  39. try {
  40. mSessionId = packageInstaller.createSession(sessionParams);
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. Log.i(TAG, "sessionId---->" + mSessionId);
  45. if (mSessionId != -1) {
  46. boolean copySuccess = onTransformApkFile(mContext, apkFilePath, mSessionId, listener);
  47. Log.i(TAG, "copySuccess---->" + copySuccess);
  48. if (copySuccess) {
  49. execInstallAPP(mContext, mSessionId, listener);
  50. }
  51. } else {
  52. return false;
  53. }
  54. return true;
  55. }
  56. /**
  57. * 通过文件流传输apk
  58. *
  59. * @param apkFilePath
  60. * @return
  61. */
  62. private static boolean onTransformApkFile(Context mContext, String apkFilePath, int mSessionId, InstallListener listener) {
  63. InputStream in = null;
  64. OutputStream out = null;
  65. PackageInstaller.Session session = null;
  66. boolean success = false;
  67. try {
  68. File apkFile = new File(apkFilePath);
  69. session = mContext.getPackageManager().getPackageInstaller().openSession(mSessionId);
  70. out = session.openWrite("base.apk", 0, apkFile.length());
  71. in = new FileInputStream(apkFile);
  72. int total = 0, c;
  73. byte[] buffer = new byte[1024 * 1024];
  74. while ((c = in.read(buffer)) != -1) {
  75. total += c;
  76. out.write(buffer, 0, c);
  77. }
  78. session.fsync(out);
  79. Log.i(TAG, "streamed " + total + " bytes");
  80. success = true;
  81. } catch (IOException e) {
  82. e.printStackTrace();
  83. listener.onInstallException(e);
  84. } finally {
  85. if (null != session) {
  86. session.close();
  87. }
  88. try {
  89. if (null != out) {
  90. out.close();
  91. }
  92. if (null != in) {
  93. in.close();
  94. }
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. listener.onInstallException(e);
  98. }
  99. }
  100. return success;
  101. }
  102. /**
  103. * 执行安装并通知安装结果
  104. *
  105. */
  106. private static void execInstallAPP(Context mContext, int mSessionId, InstallListener listener) {
  107. PackageInstaller.Session session = null;
  108. try {
  109. session = mContext.getPackageManager().getPackageInstaller().openSession(mSessionId);
  110. Intent intent = new Intent(mContext, InstallResultReceiver.class);
  111. PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
  112. 1, intent,
  113. PendingIntent.FLAG_UPDATE_CURRENT);
  114. session.commit(pendingIntent.getIntentSender());
  115. listener.onInstallSuccess();
  116. } catch (IOException e) {
  117. e.printStackTrace();
  118. listener.onInstallException(e);
  119. } finally {
  120. if (null != session) {
  121. session.close();
  122. }
  123. }
  124. }
  125. }