我正在尝试通过邮件发送最近的应用程序捕获的照片,但遇到以下错误:
(对于我正在使用此模块的邮件功能: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
答案 0 :(得分:8)
------以下编辑答案------
好的,所以我终于有了Mac,并且能够更详细地研究这个问题。
这是我在Android和iOS上找到的。
假设您将react-native-camera与react-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崩溃,您会看到以下错误消息:
这很可能是因为您在 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都工作时你应该有这样的东西:
这是工作代码:
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以获取真实路径,并将其用作路径