场景:在RN界面中需要调用原生的拍照和选择相册功能,将拍照或者选择的照片的路径回传给RN

步骤如下:

1、RN的界面跳转到原生Activity,并接收从原生回传的数据

import React, { Component } from 'react';

import {

AppRegistry,

StyleSheet,

Text,

View,

TouchableOpacity,

NativeModules,

DeviceEventEmitter

} from 'react-native';

export default class Main extends Component {

render() {

return (

{

NativeModules.TakePhotoModule.selectPhoto();

}}>

跳转到原生拍照或相册

);

}

componentDidMount(){

this.listener = DeviceEventEmitter.addListener('msg',(path)=>{

console.log('====React Native界面,收到数据: + path==',path);

})

}

componentWillUnMount(){

this.listener && this.listener.remove();

}

}

const styles = StyleSheet.create({

container: {

flex: 1,

justifyContent: 'center',

alignItems: 'center',

backgroundColor: '#F5FCFF',

},

welcome: {

fontSize: 20,

textAlign: 'center',

margin: 10,

},

instructions: {

textAlign: 'center',

color: '#333333',

marginBottom: 5,

},

});

2、创建一个原生Module,在里面添加RN需要调用的跳转原生Activity的方法和原生调用的需要回传数据到RN界面的方法

package com.test;

import android.app.Activity;

import android.content.Intent;

import android.database.Cursor;

import android.net.Uri;

import android.os.Environment;

import android.provider.MediaStore;

import android.util.Log;

import com.facebook.react.bridge.ActivityEventListener;

import com.facebook.react.bridge.BaseActivityEventListener;

import com.facebook.react.bridge.Callback;

import com.facebook.react.bridge.ReactApplicationContext;

import com.facebook.react.bridge.ReactContextBaseJavaModule;

import com.facebook.react.bridge.ReactMethod;

import com.facebook.react.modules.core.DeviceEventManagerModule;

import java.io.File;

import java.io.IOException;

import static android.app.Activity.RESULT_OK;

/**

* Created by qq on 2018/05/27.

*/

public class TakePhotoModule extends ReactContextBaseJavaModule {

private ReactApplicationContext reactContext;

public TakePhotoModule(ReactApplicationContext reactContext) {

super(reactContext);

this.reactContext = reactContext;

}

@Override

public String getName() {

return "TakePhotoModule";

}

/**

从RN界面里面调用该方法,跳转到原生Activity

**/

@ReactMethod

public void selectPhoto(){

Intent intent = new Intent(getCurrentActivity(),PhotoSelectActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

reactContext.startActivity(intent);

}

/**

从原生Activity里面调用该方法,回传数据给RN界面

**/

public void sendDataToJS(String path){

Log.i("msg", "sendDataToJS: ===path=="+path);

this.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)

.emit("msg",path);

}

}

3、创建一个原生ReactPackage,添加Module模块

package com.test;

import android.util.Log;

import com.facebook.react.ReactPackage;

import com.facebook.react.bridge.JavaScriptModule;

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 qq on 2018/05/27.

*/

public class TakePhotoPackage implements ReactPackage {

public TakePhotoModule mModule;

@Override

public List createNativeModules(ReactApplicationContext reactContext) {

List list = new ArrayList<>();

mModule = new TakePhotoModule(reactContext);

list.add(mModule);

return list;

}

@Override

public List> createJSModules() {

return Collections.emptyList();

}

@Override

public List createViewManagers(ReactApplicationContext reactContext) {

return Collections.emptyList();

}

}

4、在MainApplication里添加该ReactPackage

package com.test;

import android.app.Application;

import com.facebook.react.ReactApplication;

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 static final TakePhotoPackage mCommPackage = new TakePhotoPackage();

public static TakePhotoPackage getReactPackage() {

return mCommPackage;

}

private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {

@Override

public boolean getUseDeveloperSupport() {

return BuildConfig.DEBUG;

}

@Override

protected List getPackages() {

return Arrays.asList(

new MainReactPackage(),

mCommPackage

);

}

};

@Override

public ReactNativeHost getReactNativeHost() {

return mReactNativeHost;

}

@Override

public void onCreate() {

super.onCreate();

SoLoader.init(this, /* native exopackage */ false);

}

}

5、原生Activity回传数据给RN

package com.test;

import android.annotation.TargetApi;

import android.content.ContentUris;

import android.content.Intent;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Build;

import android.os.Environment;

import android.provider.DocumentsContract;

import android.provider.MediaStore;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageView;

import android.widget.TextView;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;

public class PhotoSelectActivity extends AppCompatActivity implements OnClickListener{

private TextView tvTakePhoto;

private TextView tvSelectAblumn;

private TextView tvFinish;

private ImageView iv;

public static final int TAKE_PHOTO = 1;

public static final int CROP_PHOTO = 2;

public static final int CHOOSE_PHOTO = 3;

private Uri imageUri;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_photo_select);

tvTakePhoto = (TextView) findViewById(R.id.tv_take_photo);

tvSelectAblumn = (TextView) findViewById(R.id.tv_select_ablumn);

tvFinish = (TextView) findViewById(R.id.tv_finish);

iv = (ImageView) findViewById(R.id.iv);

tvTakePhoto.setOnClickListener(this);

tvSelectAblumn.setOnClickListener(this);

tvFinish.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()){

case R.id.tv_take_photo:

{

File outputImage = new File(Environment.getExternalStorageDirectory(),

"tempImg" + ".jpg");

try {

if (outputImage.exists()) {

outputImage.delete();

}

outputImage.createNewFile();

} catch (IOException e) {

e.printStackTrace();

}

imageUri = Uri.fromFile(outputImage);

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, TAKE_PHOTO);

}

break;

case R.id.tv_select_ablumn:

{

Intent intent = new Intent("android.intent.action.GET_CONTENT");

intent.setType("image/*");

startActivityForResult(intent,CHOOSE_PHOTO);//打开相册

}

break;

case R.id.tv_finish:

{

Log.i("qq", "onClick: imageUri=="+imageUri);

MainApplication.getReactPackage().mModule.sendDataToJS(imageUri.getPath());

// Intent intent = new Intent();

// //把返回数据存入Intent

// intent.putExtra("img", imageUri);

// //设置返回数据

// this.setResult(1002, intent);

Intent intent = new Intent(this,MainActivity.class);

startActivity(intent);

this.finish();

}

break;

}

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode) {

case TAKE_PHOTO:

if (resultCode == RESULT_OK) {

Intent intent = new Intent("com.android.camera.action.CROP");

intent.setDataAndType(imageUri, "image/*");

intent.putExtra("scale", true);

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, CROP_PHOTO); // 启动裁剪程序

}

break;

case CROP_PHOTO:

if (resultCode == RESULT_OK) {

try {

Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(imageUri));

iv.setImageBitmap(bitmap);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

break;

case CHOOSE_PHOTO:

if (resultCode == RESULT_OK){

//判断手机系统版本号

if (Build.VERSION.SDK_INT >= 19){

//4.4及以上系统使用这个方法处理图片

handleImageOnKitKat(data);

}else {

//4.4以下系统使用这个放出处理图片

handleImageBeforeKitKat(data);

}

}

break;

}

}

@TargetApi(19)

private void handleImageOnKitKat(Intent data){

String imagePath = null;

Uri uri = data.getData();

imageUri = uri;

if (DocumentsContract.isDocumentUri(this,uri)){

//如果是document类型的Uri,则通过document id处理

String docId = DocumentsContract.getDocumentId(uri);

if ("com.android.providers.media.documents".equals(uri.getAuthority())){

String id = docId.split(":")[1];//解析出数字格式的id

String selection = MediaStore.Images.Media._ID + "=" + id;

imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);

}else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())){

Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));

imagePath = getImagePath(contentUri,null);

}

}else if ("content".equalsIgnoreCase(uri.getScheme())){

//如果是content类型的Uri,则使用普通方式处理

imagePath = getImagePath(uri,null);

}else if ("file".equalsIgnoreCase(uri.getScheme())){

//如果是file类型的Uri,直接获取图片路径即可

imagePath = uri.getPath();

}

diaplayImage(imagePath);//根据图片路径显示图片

}

private void handleImageBeforeKitKat(Intent data){

Uri uri = data.getData();

String imagePath = getImagePath(uri,null);

diaplayImage(imagePath);

}

private String getImagePath(Uri uri,String selection){

String path = null;

//通过Uri和selection来获取真实的图片路径

Cursor cursor = getContentResolver().query(uri,null,selection,null,null);

if (cursor != null){

if (cursor.moveToFirst()){

path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));

}

cursor.close();

}

return path;

}

private void diaplayImage(String imagePath){

if (imagePath != null){

Bitmap bitmap = BitmapFactory.decodeFile(imagePath);

iv.setImageBitmap(bitmap);

}else {

Log.i("qq", "diaplayImage: imagePath为空");

}

}

}

rn+android+sdk,RN与Android原生交互相关推荐

  1. OpenCV android sdk配置OpenCV android NDK开发实例

    OpenCV android sdk配置OpenCV android NDK开发实例 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/det ...

  2. 运行android sdk管理器,Android SDK 安装配置

    Android SDK 可以通过 Android Command line tools(叫命令行工具或 SDK 工具)手动安装,也可以让 Android Studio 自动帮你下载安装,这里详细描述手 ...

  3. 下载Android SDK tools完成Android SDK 安装、配置环境变量

    Table of Contents 一.下载Android SDK tools 二.安装 三.配置变量 四.验证环境变量 开发Android程序必需有Android SDK(Software Deve ...

  4. Android SDK下载失败-Android SDK Manager国内无法更新的解决方案

    本文转载自http://www.linuxidc.com/Linux/2015-01/111958.htm,向原作者表示感谢!如有侵权,请联系我删除. 现在google基本和咱们说咱见了,就给现在在做 ...

  5. adt+选择android+sdk,eclipse+adt+android SDK 开发搭建环境中遇到的问题

    [先copy下别人的东西作为讲解需要,别介意问题是我遇到的呵呵] 1.下载Eclipse3.7,登录http://www.eclipse.org/downloads/,下载Eclipse Classi ...

  6. adb 更新 android sdk,[转载]安装Android时SDK AVD MANAGER时更新报错的解决办法

    最近安装Android SDK时,发现更新时出现"A folder failed to be renamed or moved."等类似错误.经过测试和G后发现解决办法目前有两种情 ...

  7. android sdk no space,Android SDK folder taking a lot of disk space. Do

    可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: There are a lot of system images piling up on m ...

  8. android sdk system images,Android SDK下边tools、platform-tools、system-images、sources等目录的作用...

    Android sdk目录里,有一些文件夹: tools:该目录下存放大量Android开发工具,例如SDK Manager.androidavd.emulator.ddms等等. platform- ...

  9. anychat for android sdk,AnyChat For Android SDK

    SDK包概述AnyChat是一套跨平台的音.视频即时通讯解决方案,支持Windows.Linux.Mobile.Android.iOS.Mac等操作系统平台,提供客户端SDK.服务器端SDK,可与第三 ...

最新文章

  1. 用like语句时的C#格式化函数
  2. bash: ifconfig: command not found
  3. 北二外有绵羊语系吗?
  4. C/C++位域知识小结
  5. [转载] Python算法
  6. bzoj 3261: 最大异或和
  7. FireReport 层次坐标 使用问题A1[A1:-1]=A1
  8. 我的Android之路
  9. 零基础java自学流程-Java语言高级531
  10. 傅里叶变换中采样频率(fs)的解读
  11. mysql姓氏笔画排序_php根据姓氏笔画排序怎么做
  12. 天津出差系列(一)----第一天
  13. 运用java爬虫和python做词云图
  14. Text to image论文精读PDF-GAN:文本生成图像新度量指标SSD Semantic Similarity Distance
  15. SQL 实验项目8_事务控制
  16. 比尔总动员日常任务攻略一
  17. Java通过FFmpeg录制屏幕
  18. HBuilder 代码格式化时清除空行
  19. 哈工大操作系统实验:动手修改操作系统内核,自定义开机界面
  20. iOS界面 点击按钮切换横屏竖屏

热门文章

  1. laravel excel 2.1
  2. java抠图_硬章图片的透明化【抠图】java/android实现
  3. java字符串与数值型相互转换
  4. ps中颜色和图片本身颜色不一样,白色呈米色
  5. 监控局域网机器的屏幕
  6. sql 语句中count()有条件的时候为什么要加上or null
  7. 如何使用Microsoft PowerPoint制作海报
  8. 图的遍历——深度优先搜索和广度(宽度)优先搜索(含例题)
  9. SAP SD 客户物料主数据
  10. BUUWeb刷题记录