1
0

APKAutoUpdate.java 4.7 KB

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