diff --git a/android/src/main/java/top/jerryyan/RN/A/VersionUpgrade/DownLoadBroadcastReceiver.java b/android/src/main/java/top/jerryyan/RN/A/VersionUpgrade/DownLoadBroadcastReceiver.java new file mode 100644 index 0000000..e426528 --- /dev/null +++ b/android/src/main/java/top/jerryyan/RN/A/VersionUpgrade/DownLoadBroadcastReceiver.java @@ -0,0 +1,44 @@ +package top.jerryyan.RN.A.VersionUpgrade; + +import android.app.DownloadManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; + +import java.io.File; + +public class DownLoadBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + long currentDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); + SharedPreferences sPreferences = context.getSharedPreferences("jerry_rn_a_version_upgrade", 0); + long refernece = sPreferences.getLong("downloadId", 0); + if (currentDownloadId == refernece) { + DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + Intent install = new Intent(Intent.ACTION_VIEW); + DownloadManager.Query queryById = new DownloadManager.Query(); + queryById.setFilterById(currentDownloadId); + Cursor downloadCursor = downloadManager.query(queryById); + String filePath = null; + if(downloadCursor.moveToFirst()){ + if(downloadCursor.getInt(downloadCursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL){ + int fileNameIdx = downloadCursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME); + filePath = downloadCursor.getString(fileNameIdx); + }else{ + downloadManager.remove(currentDownloadId); + downloadCursor.close(); + return; + } + downloadCursor.close(); + } + if(filePath == null) return; + File file = new File(filePath); + install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); + install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.getApplicationContext().startActivity(install); + } + } +} diff --git a/android/src/main/java/top/jerryyan/RN/A/VersionUpgrade/UpgradeModule.java b/android/src/main/java/top/jerryyan/RN/A/VersionUpgrade/UpgradeModule.java index 3976a48..26169e1 100644 --- a/android/src/main/java/top/jerryyan/RN/A/VersionUpgrade/UpgradeModule.java +++ b/android/src/main/java/top/jerryyan/RN/A/VersionUpgrade/UpgradeModule.java @@ -1,5 +1,16 @@ package top.jerryyan.RN.A.VersionUpgrade; +import android.app.Activity; +import android.app.DownloadManager; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.Settings; + +import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; @@ -9,10 +20,15 @@ import java.util.Map; public class UpgradeModule extends ReactContextBaseJavaModule { private final ReactApplicationContext reactContext; + private String downloadUrl; + private String title = "应用更新中"; + private final Activity activity; + public UpgradeModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; + this.activity = reactContext.getCurrentActivity(); } @Override @@ -21,8 +37,47 @@ public class UpgradeModule extends ReactContextBaseJavaModule { } @Override - public Map getConstants(){ + public Map getConstants() { final Map constants = new HashMap<>(); return constants; } + + @ReactMethod + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + @ReactMethod + public void setTitle(String title) { + this.title = title; + } + + private boolean _hasPermissionToInstall() { + return activity != null && (Build.VERSION.SDK_INT < Build.VERSION_CODES.O || activity.getPackageManager().canRequestPackageInstalls()); + } + + private void _requestInstallPermission() { + if (activity == null) return; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Uri packageURI = Uri.parse("package:" + activity.getPackageName()); + Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); + (activity).startActivityForResult(intent, 2); + } + } + + @ReactMethod + public void startDownload() { + if (activity == null) return; + if (!this._hasPermissionToInstall()) this._requestInstallPermission(); + DownloadManager downloadManager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); + Uri uri = Uri.parse(downloadUrl); + DownloadManager.Request request = new DownloadManager.Request(uri); + request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI); + request.setMimeType("application/vnd.android.package-archive"); + request.setTitle(this.title); + request.setDestinationInExternalFilesDir(activity, Environment.DIRECTORY_DOWNLOADS, ""); + long downloadId = downloadManager.enqueue(request); + SharedPreferences sharedPreferences = activity.getSharedPreferences("jerry_rn_a_version_upgrade", 0); + sharedPreferences.edit().putLong("downloadId", downloadId).apply(); + } }