React Native Native Modules,官方地址:https://facebook.github.io/react-native/docs/native-modules-android.html

第一步:使用Android Studio在项目中增加两个Class

TestReactModule.java

  1. package com.tqstablet;
  2.  
  3. import android.widget.Toast;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.net.Uri;
  7. import android.Manifest;
  8. import android.app.Activity;
  9. import android.app.AlertDialog;
  10. import android.bluetooth.BluetoothAdapter;
  11. import android.bluetooth.BluetoothDevice;
  12. import android.content.Context;
  13. import android.content.pm.PackageManager;
  14. import android.location.LocationManager;
  15. import android.os.Build;
  16. import android.provider.Settings;
  17. import android.support.v4.app.ActivityCompat;
  18. import android.support.v4.content.ContextCompat;
  19. import android.support.v7.app.AppCompatActivity;
  20. import android.os.Bundle;
  21. import android.util.Log;
  22. import android.view.View;
  23. import android.widget.TextView;
  24.  
  25. import com.facebook.react.bridge.NativeModule;
  26. import com.facebook.react.bridge.ReactApplicationContext;
  27. import com.facebook.react.bridge.ReactContext;
  28. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  29. import com.facebook.react.bridge.ReactMethod;
  30. import com.facebook.react.bridge.Promise;
  31. import com.facebook.react.bridge.BaseActivityEventListener;
  32. import com.facebook.react.bridge.ActivityEventListener;
  33.  
  34. import java.util.Map;
  35. import java.util.HashMap;
  36.  
  37. import android.os.Build;
  38. import com.facebook.react.bridge.Callback;
  39.  
  40. /**
  41. * Created by ChenWes on 2018-05-24.
  42. */
  43.  
  44. public class TestReactModule extends ReactContextBaseJavaModule {
  45.  
  46. // Toast code
  47. private static final String DURATION_SHORT_KEY = "SHORT";
  48. private static final String DURATION_LONG_KEY = "LONG";
  49.  
  50. // image code
  51. private static final int IMAGE_PICKER_REQUEST = 467081;
  52. private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
  53. private static final String E_PICKER_CANCELLED = "E_PICKER_CANCELLED";
  54. private static final String E_FAILED_TO_SHOW_PICKER = "E_FAILED_TO_SHOW_PICKER";
  55. private static final String E_NO_IMAGE_DATA_FOUND = "E_NO_IMAGE_DATA_FOUND";
  56.  
  57. private Promise mPromise;
  58.  
  59. private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
  60. @Override
  61. public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
  62. // Toast.makeText(getReactApplicationContext(), "找到照片" + requestCode + "****" + resultCode, Toast.LENGTH_SHORT).show();
  63. if (requestCode == IMAGE_PICKER_REQUEST) {
  64. if (mPromise != null) {
  65. if (resultCode == Activity.RESULT_CANCELED) {
  66. // Toast.makeText(getReactApplicationContext(), "RESULT_CANCELED", Toast.LENGTH_SHORT).show();
  67. mPromise.reject(E_PICKER_CANCELLED, "Image picker was cancelled");
  68. } else if (resultCode == Activity.RESULT_OK) {
  69. // Toast.makeText(getReactApplicationContext(), "RESULT_OK", Toast.LENGTH_SHORT).show();
  70. Uri uri = intent.getData();
  71.  
  72. Toast.makeText(getReactApplicationContext(), uri.toString(), Toast.LENGTH_SHORT).show();
  73. if (uri == null) {
  74. mPromise.reject(E_NO_IMAGE_DATA_FOUND, "No image data found");
  75. } else {
  76. mPromise.resolve(uri.toString());
  77. }
  78. }
  79. mPromise = null;
  80. }
  81. }
  82. }
  83. };
  84.  
  85. public TestReactModule(ReactApplicationContext reactContext) {
  86. super(reactContext);
  87.  
  88. // Add the listener for `onActivityResult`
  89. reactContext.addActivityEventListener(mActivityEventListener);
  90. }
  91.  
  92. @Override
  93. public String getName() {
  94. return "TestReactModule";
  95. }
  96.  
  97. @Override
  98. public Map<String, Object> getConstants() {
  99. final Map<String, Object> constants = new HashMap<>();
  100. constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
  101. constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
  102. return constants;
  103. }
  104.  
  105. /* 无回调的方式 *************************************************************/
  106.  
  107. @ReactMethod
  108. public void show(String message, int duration) {
  109. Toast.makeText(getReactApplicationContext(), "Android :" + message, duration).show();
  110. }
  111. /* 事件回调的方式 *************************************************************/
  112.  
  113. @ReactMethod
  114. public void getSystemModel(Callback result) {
  115. String sysModel = Build.MODEL;
  116. result.invoke(sysModel);
  117. }
  118.  
  119. @ReactMethod
  120. public void getSystemModelAndVersion(Callback result) {
  121. String sysModel = Build.MODEL;
  122. String sysVersion = Build.VERSION.RELEASE;
  123. result.invoke(sysModel, sysVersion);
  124. }
  125.  
  126. /* Promise的方式 *************************************************************/
  127.  
  128. @ReactMethod
  129. public void pickImage(final Promise promise) {
  130. Activity currentActivity = getCurrentActivity();
  131.  
  132. if (currentActivity == null) {
  133. promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist");
  134. return;
  135. }
  136. // Store the promise to resolve/reject when picker returns data
  137. mPromise=null;
  138. mPromise = promise;
  139.  
  140. try {
  141. final Intent galleryIntent = new Intent(Intent.ACTION_PICK);
  142. galleryIntent.setType("image/*");
  143. final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image");
  144. currentActivity.startActivityForResult(chooserIntent, IMAGE_PICKER_REQUEST);
  145.  
  146. Toast.makeText(getReactApplicationContext(), "弹出照片库", Toast.LENGTH_SHORT).show();
  147. } catch (Exception e) {
  148. mPromise.reject(E_FAILED_TO_SHOW_PICKER, e);
  149. mPromise = null;
  150. }
  151. }
  152. }

TestReactModulePackage.java

  1. package com.tqstablet;
  2.  
  3. import com.facebook.react.ReactPackage;
  4. import com.facebook.react.bridge.NativeModule;
  5. import com.facebook.react.bridge.ReactApplicationContext;
  6. import com.facebook.react.uimanager.ViewManager;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.Collections;
  10. import java.util.List;
  11.  
  12. /**
  13. * Created by ChenWes on 2018-05-24.
  14. */
  15.  
  16. public class TestReactModulePackage implements ReactPackage {
  17. @Override
  18. public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
  19. return Collections.emptyList();
  20. }
  21.  
  22. @Override
  23. public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
  24. List<NativeModule> modules = new ArrayList<>();
  25.  
  26. modules.add(new TestReactModule(reactContext));
  27.  
  28. return modules;
  29. }
  30. }

第二步:在MainApplication.java中增加引用

  1. package com.tqstablet;
  2.  
  3. import android.app.Application;
  4.  
  5. import com.facebook.react.ReactApplication;
  6. import com.AlexanderZaytsev.RNI18n.RNI18nPackage;
  7. import com.imagepicker.ImagePickerPackage;
  8. import com.learnium.RNDeviceInfo.RNDeviceInfo;
  9. import com.facebook.react.ReactNativeHost;
  10. import com.facebook.react.ReactPackage;
  11. import com.facebook.react.shell.MainReactPackage;
  12. import com.facebook.soloader.SoLoader;
  13.  
  14. import java.util.Arrays;
  15. import java.util.List;
  16.  
  17. public class MainApplication extends Application implements ReactApplication {
  18.  
  19. private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
  20. @Override
  21. public boolean getUseDeveloperSupport() {
  22. return BuildConfig.DEBUG;
  23. }
  24.  
  25. @Override
  26. protected List<ReactPackage> getPackages() {
  27. return Arrays.<ReactPackage>asList(
  28. new MainReactPackage(),
  29. new RNI18nPackage(),
  30. new ERulerPackage(),
  31. new TestReactModulePackage(),
  32. new RNDeviceInfo(),
  33. new ImagePickerPackage()
  34. );
  35. }
  36.  
  37. @Override
  38. protected String getJSMainModuleName() {
  39. return "index";
  40. }
  41. };
  42.  
  43. @Override
  44. public ReactNativeHost getReactNativeHost() {
  45. return mReactNativeHost;
  46. }
  47.  
  48. @Override
  49. public void onCreate() {
  50. super.onCreate();
  51. SoLoader.init(this, /* native exopackage */ false);
  52. }
  53. }

第三步:在React Native中进行调用

TestModule.js

  1. import { NativeModules } from 'react-native';
  2. module.exports = NativeModules.TestReactModule;

调用代码

  1. import TestReactModule from '../util/TestReactModule';

<Button style={styles.menuButton} onPress={() => {
//无回调
// TestReactModule.show("平板端打开一个对话框", TestReactModule.LONG);

//回调事件
// TestReactModule.getSystemModel((getModel) => {
// Alert.alert(getModel);
// });

//回调事件,多参数
// TestReactModule.getSystemModelAndVersion((sysModel, sysVersion) => {
// Alert.alert(sysModel, sysVersion);
// });

//Promise
TestReactModule.pickImage()
.then((data) => {
Alert.alert(data);
}).catch((err) => {
Alert.alert('Err', err.message);
})

}}>
React Native 测试
</Button>

react native native module的更多相关文章

  1. [RN] React Native 错误 Module does not exist in the module map

    React Native 错误 Module does not exist in the module map 代码如下: import Login from 'login' import Index ...

  2. React Native是一套使用 React 构建 Native app 的编程框架

    React Native是一套使用 React 构建 Native app 的编程框架 React Native at first sight what is React Native? 跟据官方的描 ...

  3. react native-调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错

    调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在iOS上运行没问题.原因是因为接口是有验证信息的,而调用这个插件时没有传入,在iOS上会自动加 ...

  4. React Native--Animated:`useNativeDriver`is not supported because the native animated module is missing

    目录 问题描述 解决方法 问题描述 react-native init 项目,在运行中报错 解决方法 打开Xcode项目,点击Libraries文件夹右键Add Files to "项目名& ...

  5. react 调用 native 的callShareAllFunc()方法,实现分享

    let shareName = { '0': '微信', '1': '朋友圈', '2': '新浪微博', '3': ' QQ', '4': 'QQ空间'};render(){ //分享YztApp. ...

  6. react-native 计算时间差

    //计算时间var sendTime = this.props.obj.send_time; console.log(sendTime); //当前时间var nowTime = (new Date( ...

  7. [React] {svg, css module, sass} support in Create React App 2.0

    create-react-app version 2.0 added a lot of new features. One of the new features is added the svgr  ...

  8. React使用css module和className多类名设置

    引入样式文件 import styles from './footer.module.css'; 注意: 样式文件名必须要以.module.css结尾 单类名设置 <div className= ...

  9. Cordova VS React Native 谁是未来? - b

    对于原生native还是倍加推崇的,极佳的用户体验和性能让我学的如痴如醉,可是互联网这个世界可以用一句话可以总结:没有什么是不可能的.自从阿里淘宝天猫横空出世,它们教会了人们如何在网上购物,然后仿佛一 ...

随机推荐

  1. Microsoft office 2013安装图解

    Microsoft office 2013安装图解... ================ 简介: Microsoft Office 2013(Office 15)是微软的新一代Office办公软件, ...

  2. linux内核的配置

    以2.6.35.7版本的内核为例 总结:.config决定了Make时的条件编译与连接..config文件由两次配置第一次make XX_defconfig 第二次menuconfig. 1.分析源码 ...

  3. idea 多模块引用

    roma-server 引用common-utils的类,所以在roma-server 的pom中配置 <dependency> <groupId>org.springfram ...

  4. 动态规划小结 - 一维动态规划 - 时间复杂度 O(n),题 [LeetCode] Jump Game,Decode Ways

    引言 一维动态规划根据转移方程,复杂度一般有两种情况. func(i) 只和 func(i-1)有关,时间复杂度是O(n),这种情况下空间复杂度往往可以优化为O(1) func(i) 和 func(1 ...

  5. 问题BeanFactory not initialized or already closed - call 'refresh' before access

    问题BeanFactory not initialized or already closed - call 'refresh' before access 2016-08-23 14:22 8565 ...

  6. unity ugui消息透传

    公司要做一个这东西. A是滑动区域,ScrollRect组件. B是各种选项. C是拾取到鼠标(或触点)的选项. D是拖放区域. 大概要求是这样. 因为B的条目很多,放在A里可以滑动查看.如果要选择一 ...

  7. loj515 「LibreOJ β Round #2」贪心只能过样例

    传送门:https://loj.ac/problem/515 [题解] 容易发现S最大到1000000. 于是我们有一个$O(n^2*S)$的dp做法. 容易发现可以被bitset优化. 于是复杂度就 ...

  8. 如何用js自己实现Animate运动函数

    js运动是我们学习js必不可少的研究部分,首先我们要知道js的运动其实仅仅是不断改变元素的某个属性值而已,比如不断改变一个绝对定位div的left值,那么你看到的效果就是这个div不断的向右边运动,那 ...

  9. 大话Spring Cloud

    研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...

  10. ES6新增的let与const

    1.const 声明常量,一旦声明必须立马赋值,否则报错 const PI = 3.14 const PI; //报错:Uncaught SyntaxError: Missing initialize ...