package com.demo.ReactNativeBridge; import android.content.Intent; import android.net.Uri; import android.os.Build; import androidx.core.content.FileProvider; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.Callback; import java.io.File; import java.util.HashMap; import java.util.Map; public class InstallApk extends ReactContextBaseJavaModule { private ReactApplicationContext _context = null; public InstallApk(ReactApplicationContext reactContext) { super(reactContext); _context = reactContext; } @Override public String getName() { return "InstallApk"; } @ReactMethod public void install(String path) { String cmd = "chmod 777 " + path; try { Runtime.getRuntime().exec(cmd); } catch (Exception e) { e.printStackTrace(); } File file = new File(path); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判讀版本是否在7.0以上 Uri apkUri = FileProvider.getUriForFile(_context, "包名.FileProvider", file); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); }else{ intent.setDataAndType(Uri.parse("file://" + path), "application/vnd.android.package-archive"); } _context.startActivity(intent); } }
<application> <!-- 添加provider,用於apk安裝 --> <provider android:name="androidx.core.content.FileProvider" android:authorities="包名.FileProvider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application> <!-- 添加apk安裝權限 --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 物理路徑至關於Context.getFilesDir() --> <files-path name="." path="."/> <!-- 物理路徑至關於Context.getCacheDir() --> <cache-path name="." path="."/> <!-- 物理路徑至關於Environment.getExternalStorageDirectory() --> <external-path name="." path="."/> </paths>