react native native module
React Native Native Modules,官方地址:https://facebook.github.io/react-native/docs/native-modules-android.html
第一步:使用Android Studio在项目中增加两个Class
TestReactModule.java
- package com.tqstablet;
- import android.widget.Toast;
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.Manifest;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.bluetooth.BluetoothAdapter;
- import android.bluetooth.BluetoothDevice;
- import android.content.Context;
- import android.content.pm.PackageManager;
- import android.location.LocationManager;
- import android.os.Build;
- import android.provider.Settings;
- import android.support.v4.app.ActivityCompat;
- import android.support.v4.content.ContextCompat;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.TextView;
- import com.facebook.react.bridge.NativeModule;
- import com.facebook.react.bridge.ReactApplicationContext;
- import com.facebook.react.bridge.ReactContext;
- import com.facebook.react.bridge.ReactContextBaseJavaModule;
- import com.facebook.react.bridge.ReactMethod;
- import com.facebook.react.bridge.Promise;
- import com.facebook.react.bridge.BaseActivityEventListener;
- import com.facebook.react.bridge.ActivityEventListener;
- import java.util.Map;
- import java.util.HashMap;
- import android.os.Build;
- import com.facebook.react.bridge.Callback;
- /**
- * Created by ChenWes on 2018-05-24.
- */
- public class TestReactModule extends ReactContextBaseJavaModule {
- // Toast code
- private static final String DURATION_SHORT_KEY = "SHORT";
- private static final String DURATION_LONG_KEY = "LONG";
- // image code
- private static final int IMAGE_PICKER_REQUEST = 467081;
- private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
- private static final String E_PICKER_CANCELLED = "E_PICKER_CANCELLED";
- private static final String E_FAILED_TO_SHOW_PICKER = "E_FAILED_TO_SHOW_PICKER";
- private static final String E_NO_IMAGE_DATA_FOUND = "E_NO_IMAGE_DATA_FOUND";
- private Promise mPromise;
- private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
- @Override
- public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
- // Toast.makeText(getReactApplicationContext(), "找到照片" + requestCode + "****" + resultCode, Toast.LENGTH_SHORT).show();
- if (requestCode == IMAGE_PICKER_REQUEST) {
- if (mPromise != null) {
- if (resultCode == Activity.RESULT_CANCELED) {
- // Toast.makeText(getReactApplicationContext(), "RESULT_CANCELED", Toast.LENGTH_SHORT).show();
- mPromise.reject(E_PICKER_CANCELLED, "Image picker was cancelled");
- } else if (resultCode == Activity.RESULT_OK) {
- // Toast.makeText(getReactApplicationContext(), "RESULT_OK", Toast.LENGTH_SHORT).show();
- Uri uri = intent.getData();
- Toast.makeText(getReactApplicationContext(), uri.toString(), Toast.LENGTH_SHORT).show();
- if (uri == null) {
- mPromise.reject(E_NO_IMAGE_DATA_FOUND, "No image data found");
- } else {
- mPromise.resolve(uri.toString());
- }
- }
- mPromise = null;
- }
- }
- }
- };
- public TestReactModule(ReactApplicationContext reactContext) {
- super(reactContext);
- // Add the listener for `onActivityResult`
- reactContext.addActivityEventListener(mActivityEventListener);
- }
- @Override
- public String getName() {
- return "TestReactModule";
- }
- @Override
- public Map<String, Object> getConstants() {
- final Map<String, Object> constants = new HashMap<>();
- constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
- constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
- return constants;
- }
- /* 无回调的方式 *************************************************************/
- @ReactMethod
- public void show(String message, int duration) {
- Toast.makeText(getReactApplicationContext(), "Android :" + message, duration).show();
- }
- /* 事件回调的方式 *************************************************************/
- @ReactMethod
- public void getSystemModel(Callback result) {
- String sysModel = Build.MODEL;
- result.invoke(sysModel);
- }
- @ReactMethod
- public void getSystemModelAndVersion(Callback result) {
- String sysModel = Build.MODEL;
- String sysVersion = Build.VERSION.RELEASE;
- result.invoke(sysModel, sysVersion);
- }
- /* Promise的方式 *************************************************************/
- @ReactMethod
- public void pickImage(final Promise promise) {
- Activity currentActivity = getCurrentActivity();
- if (currentActivity == null) {
- promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist");
- return;
- }
- // Store the promise to resolve/reject when picker returns data
- mPromise=null;
- mPromise = promise;
- try {
- final Intent galleryIntent = new Intent(Intent.ACTION_PICK);
- galleryIntent.setType("image/*");
- final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image");
- currentActivity.startActivityForResult(chooserIntent, IMAGE_PICKER_REQUEST);
- Toast.makeText(getReactApplicationContext(), "弹出照片库", Toast.LENGTH_SHORT).show();
- } catch (Exception e) {
- mPromise.reject(E_FAILED_TO_SHOW_PICKER, e);
- mPromise = null;
- }
- }
- }
TestReactModulePackage.java
- package com.tqstablet;
- import com.facebook.react.ReactPackage;
- import com.facebook.react.bridge.NativeModule;
- import com.facebook.react.bridge.ReactApplicationContext;
- import com.facebook.react.uimanager.ViewManager;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- /**
- * Created by ChenWes on 2018-05-24.
- */
- public class TestReactModulePackage implements ReactPackage {
- @Override
- public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
- return Collections.emptyList();
- }
- @Override
- public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
- List<NativeModule> modules = new ArrayList<>();
- modules.add(new TestReactModule(reactContext));
- return modules;
- }
- }
第二步:在MainApplication.java中增加引用
- package com.tqstablet;
- import android.app.Application;
- import com.facebook.react.ReactApplication;
- import com.AlexanderZaytsev.RNI18n.RNI18nPackage;
- import com.imagepicker.ImagePickerPackage;
- import com.learnium.RNDeviceInfo.RNDeviceInfo;
- import com.facebook.react.ReactNativeHost;
- import com.facebook.react.ReactPackage;
- import com.facebook.react.shell.MainReactPackage;
- import com.facebook.soloader.SoLoader;
- import java.util.Arrays;
- import java.util.List;
- public class MainApplication extends Application implements ReactApplication {
- private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
- @Override
- public boolean getUseDeveloperSupport() {
- return BuildConfig.DEBUG;
- }
- @Override
- protected List<ReactPackage> getPackages() {
- return Arrays.<ReactPackage>asList(
- new MainReactPackage(),
- new RNI18nPackage(),
- new ERulerPackage(),
- new TestReactModulePackage(),
- new RNDeviceInfo(),
- new ImagePickerPackage()
- );
- }
- @Override
- protected String getJSMainModuleName() {
- return "index";
- }
- };
- @Override
- public ReactNativeHost getReactNativeHost() {
- return mReactNativeHost;
- }
- @Override
- public void onCreate() {
- super.onCreate();
- SoLoader.init(this, /* native exopackage */ false);
- }
- }
第三步:在React Native中进行调用
TestModule.js
- import { NativeModules } from 'react-native';
- module.exports = NativeModules.TestReactModule;
调用代码
- 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的更多相关文章
- [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 ...
- React Native是一套使用 React 构建 Native app 的编程框架
React Native是一套使用 React 构建 Native app 的编程框架 React Native at first sight what is React Native? 跟据官方的描 ...
- react native-调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错
调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在iOS上运行没问题.原因是因为接口是有验证信息的,而调用这个插件时没有传入,在iOS上会自动加 ...
- React Native--Animated:`useNativeDriver`is not supported because the native animated module is missing
目录 问题描述 解决方法 问题描述 react-native init 项目,在运行中报错 解决方法 打开Xcode项目,点击Libraries文件夹右键Add Files to "项目名& ...
- react 调用 native 的callShareAllFunc()方法,实现分享
let shareName = { '0': '微信', '1': '朋友圈', '2': '新浪微博', '3': ' QQ', '4': 'QQ空间'};render(){ //分享YztApp. ...
- react-native 计算时间差
//计算时间var sendTime = this.props.obj.send_time; console.log(sendTime); //当前时间var nowTime = (new Date( ...
- [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 ...
- React使用css module和className多类名设置
引入样式文件 import styles from './footer.module.css'; 注意: 样式文件名必须要以.module.css结尾 单类名设置 <div className= ...
- Cordova VS React Native 谁是未来? - b
对于原生native还是倍加推崇的,极佳的用户体验和性能让我学的如痴如醉,可是互联网这个世界可以用一句话可以总结:没有什么是不可能的.自从阿里淘宝天猫横空出世,它们教会了人们如何在网上购物,然后仿佛一 ...
随机推荐
- Microsoft office 2013安装图解
Microsoft office 2013安装图解... ================ 简介: Microsoft Office 2013(Office 15)是微软的新一代Office办公软件, ...
- linux内核的配置
以2.6.35.7版本的内核为例 总结:.config决定了Make时的条件编译与连接..config文件由两次配置第一次make XX_defconfig 第二次menuconfig. 1.分析源码 ...
- idea 多模块引用
roma-server 引用common-utils的类,所以在roma-server 的pom中配置 <dependency> <groupId>org.springfram ...
- 动态规划小结 - 一维动态规划 - 时间复杂度 O(n),题 [LeetCode] Jump Game,Decode Ways
引言 一维动态规划根据转移方程,复杂度一般有两种情况. func(i) 只和 func(i-1)有关,时间复杂度是O(n),这种情况下空间复杂度往往可以优化为O(1) func(i) 和 func(1 ...
- 问题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 ...
- unity ugui消息透传
公司要做一个这东西. A是滑动区域,ScrollRect组件. B是各种选项. C是拾取到鼠标(或触点)的选项. D是拖放区域. 大概要求是这样. 因为B的条目很多,放在A里可以滑动查看.如果要选择一 ...
- loj515 「LibreOJ β Round #2」贪心只能过样例
传送门:https://loj.ac/problem/515 [题解] 容易发现S最大到1000000. 于是我们有一个$O(n^2*S)$的dp做法. 容易发现可以被bitset优化. 于是复杂度就 ...
- 如何用js自己实现Animate运动函数
js运动是我们学习js必不可少的研究部分,首先我们要知道js的运动其实仅仅是不断改变元素的某个属性值而已,比如不断改变一个绝对定位div的left值,那么你看到的效果就是这个div不断的向右边运动,那 ...
- 大话Spring Cloud
研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...
- ES6新增的let与const
1.const 声明常量,一旦声明必须立马赋值,否则报错 const PI = 3.14 const PI; //报错:Uncaught SyntaxError: Missing initialize ...