原生端
新建PermissionModule
public class CcPermissionModule extends ReactContextBaseJavaModule {
public CcPermissionModule(@Nonnull ReactApplicationContext reactContext) {
super(reactContext);
}
@Nonnull
@Override
public String getName() {
//此方法返回一個字符串,用於在JS端標記這個模塊,方便JS端調用此模塊
return "Permissions";
}
}
新建PermissionPackage
public class CcPermissionPackage implements ReactPackage {
@Nonnull
@Override
public List<NativeModule> createNativeModules(@Nonnull ReactApplicationContext reactContext) {
return null;
}
@Nonnull
@Override
public List<ViewManager> createViewManagers(@Nonnull ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
新建Activity加入請求和處理權限結果的方法
//這裏我們不做請求和處理的代碼講解,用了簡單的僞代碼來代替
public void requestPermission() {
//請求應用需要的權限
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//根據權限申請的結果做處理
}
在PermissionModule中調用Activity中的請求權限方法
之前前文說過,PermissionModule中getNames方法是在js端標記次模塊,那麼使用@ReactMethod標記的方法是js端能調用的,那麼就在@ReactMethod標記的方法中去調用Activity中的請求權限方法。
@ReactMethod
public void requestPermission() {
MainActivity permissionActivity = (MainActivity) getCurrentActivity();
//請求權限
permissionActivity.requestPermission();
}
註冊模塊PermissionModule類到PermissionPackage中
@Nonnull
@Override
public List<NativeModule> createNativeModules(@Nonnull ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new CcPermissionModule(reactContext));
return modules;
}
PermissionPackage在MainApplication中
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new PermissionPackage()
);
}
自此原生端要做的工作已經全部做了,接下來就是到JS端調用原生端的代碼
JS端
方便調用原生模塊,將JS的調用端獨立封裝下
import { NativeModules } from 'react-native';
//這裏面Permissions就是PermissionModule中getNames返回的字符串,用於在Js端標記此模塊
export default NativeModules.Permissions;
結語
最近項目中使用的是混合開發,各種原生調JS和JS調原生,剛開始還有點不適應,當寫多了,就好多了,寫這篇文章目的就是方便以後查閱更方便,