zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/weschen/p/9086606.html
Copyright © 2011-2022 走看看