React native - 每封邮件发送照片

时间:2016-07-01 09:18:44

标签: react-native

我正在尝试通过邮件发送最近的应用程序捕获的照片,但遇到以下错误:

(对于我正在使用此模块的邮件功能:newtable

我正试图在此模块的帮助下通过邮件发送照片并收到以下错误:

var Mailer = require('NativeModules').RNMail;

这是调用代码:

index.ios.bundle:28842Exception '-[MFMailComposeInternalViewController addAttachmentData:mimeType:fileName:] attachment must not be nil.' was thrown while invoking mail on target RNMail with params (
        {
        attachment =         {
            name = Ladunek;
            path = "assets-library://asset/asset.JPG?id=3B7DBB2E-1271-4D86-A5F2-A0CEEE7CC4DE&ext=JPG";
            type = jpg;
        };
        body = "body";
        isHTML = 1;
        recipients =         (
            "placeholder@mail.com"
        );
        subject = Ladunek;
    },
    9
)

路径无效吗?或者它可能是别的东西。

修改

我正在使用此模块.then((data, path) => { console.log(data) console.log(data.path) Mailer.mail({ subject: 'Ladunek', recipients: ['placeholder@mail.com'], body: 'body', isHTML: true, // iOS only, exclude if false attachment: { path: data.path, // The absolute path of the file from which to read data. type: 'jpg', // Mime Type: jpg, png, doc, ppt, html, pdf name: 'Ladunek', // Optional: Custom filename for attachment } }, (error, event) => { if(error) { AlertIOS.alert('Error', 'Could not send mail. Please send a mail to support@example.com'); } }); }) 获取文件路径 像这样:

事件:

react-native-camera

元素:

takePicture() {
    this.camera.capture()
      .then((data, path) =>

UPDATE2

在为路径转换包含obj-c file之后,我现在收到以下错误:

<Camera
              ref={(cam) => {
                this.camera = cam;
              }}
              style={{
                    flex: 1,
                    justifyContent: 'flex-end',
                    alignItems: 'center',
                    height: 400,
                    width: Dimensions.get('window').width
                  }}
              aspect={Camera.constants.Aspect.fill}>
              <Text style={{
                        flex: 0,
                        backgroundColor: '#fff',
                        borderRadius: 5,
                        color: '#000',
                        padding: 10,
                        margin: 40
                      }} onPress={this.takePicture.bind(this)}>{cameraIcon}</Text>
            </Camera>

我&#34;删除&#34;以下代码中的错误行? :/

Obj-c文件内容:

ExceptionsManager.js:76 JSON value '<null>' of type NSNull cannot be converted to NSString

1 个答案:

答案 0 :(得分:8)

------以下编辑答案------

好的,所以我终于有了Mac,并且能够更详细地研究这个问题。

这是我在Android和iOS上找到的。

假设您将react-native-camerareact-native-mail

一起使用

- 1:绝对路径

将属性captureTarget={Camera.constants.CaptureTarget.disk}添加到Camera组件,如下所示:

<Camera
  captureTarget={Camera.constants.CaptureTarget.disk}
  ref={(cam) => {
    this.camera = cam;
  }}
  style={styles.preview}
  aspect={Camera.constants.Aspect.fill}>
  <Text style={styles.capture} onPress={this.takePicture.bind(this)}>[CAPTURE]</Text>
</Camera>

现在相机组件应该返回绝对文件路径而不是uri。

因此,对于 Android ,您应该看到如下内容:

file:/// storage / emulated / 0 / Pictures / RCTCameraModule / IMG_20160730_060652.jpg

而不是:

内容://媒体/外部/图像/媒体/ 86

iOS 你应该得到这样的结果:

/用户/安东/库/开发商/ CoreSimulator /设备/ 9A15F203-9A58-41C5-A4FC-EA25FAAE92BD /数据/容器/数据/应用/ 79FF93F9-BA89-4F4C-8809-277BEECD447D /文档/ EFFF0ECE-4063-4FE5-984E -E76506788350.jpg

而不是:

assets-library://asset/asset.JPG ?ID = 0058FA4A-268F-408A-9150-017A3DA368D2&安培; EXT = JPG

- 2:陷阱

iOS

如果Apple的MFMailComposeViewController崩溃,您会看到以下错误消息:

enter image description here

这很可能是因为您在 iOS 9 模拟器上运行该应用。解决方案:在真实设备上测试应用程序,或下载较旧的模拟器,如iOS 8.4。

有关此问题的更多信息,请访问here

Android

在撰写本文时,Android没有附件支持。

解决方案:(PR已添加此功能,但如果您不能等待)

将以下代码添加到文件 RNMAILModule.java

if (options.hasKey("attachment") && !options.isNull("attachment")) {
  i.putExtra(Intent.EXTRA_STREAM, Uri.parse(options.getMap("attachment").getString("path")));
}

当Android和iOS都工作时你应该有这样的东西:

enter image description here enter image description here

这是工作代码:

var Mailer = require('NativeModules').RNMail;
import Camera from 'react-native-camera';

import React, {Component} from 'react';
import
{
  View,
  TouchableHighlight,
  Text,
  StyleSheet,
  Dimensions,
  CameraRoll
}
from 'react-native';

const styles = StyleSheet.create({
  container: {
    flex: 1
  },
  preview: {
    flex: 1,
    justifyContent: 'flex-end',
    alignItems: 'center',
    height: Dimensions.get('window').height,
    width: Dimensions.get('window').width
  },
  capture: {
    flex: 0,
    backgroundColor: '#fff',
    borderRadius: 5,
    color: '#000',
    padding: 10,
    margin: 40
  }
});

class SendPhoto extends Component {
  takePicture() {
    this.camera.capture()
      .then((data) => {
        console.log(data.path)
        Mailer.mail({
          subject: 'Ladunek',
          recipients: ['placeholder@mail.com'],
          body: 'body',
          isHTML: true, // iOS only, exclude if false
          attachment: {
            path: data.path,  // The absolute path of the file from which to read data.
            type: 'jpg',   // Mime Type: jpg, png, doc, ppt, html, pdf
            name: 'Ladunek',   // Optional: Custom filename for attachment
          }
        }, (error, event) => {
            if(error) {
              AlertIOS.alert('Error', 'Could not send mail. Please send a mail to support@example.com');
            }
        })
      })
      .catch(err => console.error(err));
  }

  render() {
    return(
      <View>
        <View style={styles.container}>
          <Camera
            captureTarget={Camera.constants.CaptureTarget.disk}
            ref={(cam) => {
              this.camera = cam;
            }}
            style={styles.preview}
            aspect={Camera.constants.Aspect.fill}>
            <Text style={styles.capture} onPress={this.takePicture.bind(this)}>[CAPTURE]</Text>
          </Camera>
        </View>
      </View>
    );
  }
}
export default SendPhoto;

------下面的旧答案------

我以前从未使用过这个模块,但它看起来好像是文件的绝对路径,但是你提供的是文件uri。

你是如何获得这个文件的?

尝试使用react-native-get-real-path模块查看是否有帮助,您可以在此处找到它:react-native-get-real-path

即。转换您的文件uri以获取真实路径,并将其用作路径