react-native Android安装apk


 

第一步:创建NativeModule

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);
    }
}

 

第二步:在文件AndroidManifest.xml中的application标签中增加 标签和开启安装apk权限

<application>
  
  <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>


<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

 

第三步:在res/xml下增加文件file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    
    <files-path name="." path="."/>
    
    <cache-path name="." path="."/>
    
    <external-path name="." path="."/>
paths>

 

注意:在NativeModule的java文件下的"包名.FileProvider"和AndroidManifest.xml文件下的android:authorities="包名.FileProvider"要保持一致,不一定非要以包名命名,相同就行。