React Native - 通过邮件发送照片

2024-03-28

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

(对于邮件功能,我正在使用此模块: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: ['[email protected] /cdn-cgi/l/email-protection'],
          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 [email protected] /cdn-cgi/l/email-protection');
            }
        });
      })

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

EDIT

我正在使用此模块获取文件路径react-native-camera像这样:

Event:

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

Element:

<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>

UPDATE2

包括后obj-c 文件 https://github.com/scottdixon/react-native-upload-from-camera-roll/blob/master/RCTCustom.m对于 uri 到路径的转换,我现在收到以下错误:

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

我是否从以下代码中“删除”了错误的行? :/

obj-c 文件内容:

#import "RCTBridgeModule.h"
#import <AssetsLibrary/AssetsLibrary.h>
#import <UIKit/UIKit.h>
@interface ReadImageData : NSObject <RCTBridgeModule>
@end

@implementation ReadImageData

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(readImage:(NSString *)input callback:(RCTResponseSenderBlock)callback)
{

  // Create NSURL from uri
  NSURL *url = [[NSURL alloc] initWithString:input];

  // Create an ALAssetsLibrary instance. This provides access to the
  // videos and photos that are under the control of the Photos application.
  //ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

  // Using the ALAssetsLibrary instance and our NSURL object open the image.
  //[library assetForURL:url resultBlock:^(ALAsset *asset) {

    // Create an ALAssetRepresentation object using our asset
    // and turn it into a bitmap using the CGImageRef opaque type.
    //CGImageRef imageRef = [asset thumbnail];

    // Create UIImageJPEGRepresentation from CGImageRef
   // NSData *imageData = UIImageJPEGRepresentation([UIImage imageWithCGImage:imageRef], 0.1);

    // Convert to base64 encoded string
    // NSString *base64Encoded = [imageData base64EncodedStringWithOptions:0];

    callback(@[url]);

  //} failureBlock:^(NSError *error) {
    //NSLog(@"that didn't work %@", error);
  //}];



}
@end

------ 下面编辑的答案 ------

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

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

假设您正在使用反应本机相机 https://github.com/lwansbrough/react-native-camera和...一起反应本机邮件 https://github.com/chirag04/react-native-mail

- 1:绝对路径

添加属性captureTarget={Camera.constants.CaptureTarget.disk} to 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>

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

So for Android你应该看到这样的东西:

"文件:///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"

代替:

"资产库://asset/asset.JPG?id=0058FA4A-268F-408A-9150-017A3DA368D2&ext=JPG"

- 2:陷阱

iOS:

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

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

有关此问题的更多信息可以找到here https://stackoverflow.com/questions/32078073/mfmailcomposeviewcontroller-throws-an-error-only-in-ios-9

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: ['[email protected] /cdn-cgi/l/email-protection'],
          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 [email protected] /cdn-cgi/l/email-protection');
            }
        })
      })
      .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。

您如何获取此文件 uri?

尝试使用react-native-get-real-path模块看看是否有帮助,你可以在这里找到它:反应本机获取真实路径 https://github.com/Wraptime/react-native-get-real-path

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Native - 通过邮件发送照片 的相关文章

随机推荐

  • 查询谷歌电子表格的特定工作表

    我正在尝试使用谷歌电子表格作为临时数据库 我已按照以下教程中的说明进行操作 一切正常 http www alatechsource org blog 2012 05 using the google spreadsheets data ap
  • PHP:如何自动加载接口和摘要

    我有这个自动装载机要自动加载的类classes最初 但现在我想自动加载interfaces and abstracts以及 所以我做了以下改变answer https stackoverflow com questions 7924782
  • 在 PHP echo 中嵌入 javascript

    echo td manuf td 上面的这个行得通吗 我正在从 mysql 数据库中提取结果来编辑内容 但需要 jQuery 功能来编辑它 因此嵌入了 javascript 变量 EDIT 抱歉 缺乏上下文 它与我在这里提出的另一个问题有关
  • 无法使用 ggsurvplot 从列表中使用 survfit 对象绘制 kaplan-meier 曲线

    我正在尝试使用 survminer 包中的 ggsurvplot 绘制 Kaplan Meyer 曲线 当我传递保存在列表中的 survfit 对象时 我无法绘制它 让我以肺部数据集为例 一切正常如下 library survival li
  • Vulkan 管道顶部/底部和 ALL_COMMANDS

    作为很多 初学者 我认为使用 TOP OF PIPELINE 作为 dst 和 BOTTOM OF PIPELINE 作为 src 意味着两者的 ALL COMMANDS Here https github com KhronosGroup
  • Grails 2.0 中带有新 where 查询的参数

    在 Grails 2 0 中定义 where 查询时是否可以使用参数 例如 def query Book where id it Book sub query find 5 我尝试运行该代码 但它在调用 find 时抛出 MissingMe
  • 创建一个包含比原始元素更多元素的 ReactiveUI 派生集合

    是否可以创建一个 ReactiveUI 派生集合 其中包含比原始集合更多的元素 我已经看到有一种方法可以过滤集合并选择单个属性 但我正在寻找相当于可枚举的 SelectMany 操作 为了说明这一点 想象一下尝试获取代表每个陷入交通拥堵的乘
  • 避免 printf() 中的尾随零

    我一直在发现 printf 系列函数的格式说明符 我想要的是能够打印小数点后最大给定位数的双精度 或浮点数 如果我使用 printf 1 3f 359 01335 printf 1 3f 359 00999 I get 359 013 35
  • C# 中图片框的图像之间的转换[重复]

    这个问题在这里已经有答案了 可能的重复 Windows 窗体图片框中的图像转换 https stackoverflow com questions 3270919 transition of images in windows forms
  • 当数据回发时,MVC 如何填充模型

    MVC对于如何将数据发送到浏览器非常清楚 您访问一个 URL 它运行代码来创建模型 将该类型化模型传递到视图中 然后视图根据模型的状态呈现 HTML 然而 我发现不太清楚的是 当用户在页面上提交表单时 MVC 如何将该表单映射回模型以在控制
  • 连接字符串中包含特殊字符的密码

    我需要从 ASP NET 应用程序连接到我的 Dynamics CRM 365 本地实例 我的问题是连接帐户的密码如下 T jL4O vc t 30
  • Service Fabric 重启应用程序

    我有一个在启动时从 KeyVault 读取的服务结构应用程序 当我们更改 KeyVault 值时 我们必须重新启动节点才能读取新值 这会导致同一节点上的其他应用程序出现故障 我正在尝试编写一个 PowerShell 脚本来重新启动服务结构应
  • iOS 8 上应用内购买失败,提示用户详细信息不正确

    我们有一个带有应用内购买功能的应用程序 该应用程序在 iOS 7 上运行良好 但在 iOS 8 上 当用户尝试在应用程序中购买任何内容时 应用程序内购买会失败 并显示错误 您输入的 Apple ID 无法 找不到或您的密码不正确 请重试 即
  • __libc_start_main@plt 如何工作?

    为了研究目标文件在linux中是如何加载和运行的 我制作了最简单的c代码 文件名为simple c int main 接下来 我创建目标文件并将目标文件另存为文本文件 gcc simple c objdump xD a out gt sim
  • 使用 Perl6 语法解析二进制结构

    使用 Perl6 解析二进制结构的最佳选择是什么 在 Perl5 中 我们在 Perl6 上有 pack unpack 方法 它们似乎是实验性的 是否可以使用 Perl6 语法来解析二进制数据假设我有一个文件 其中包含以下二进制格式的记录
  • Qt 加载指示器通过动画图像(又名预加载器)还是替代方案?

    我想在加载时在我的表格视图上显示动画加载程序图像 下面的截图显示了一个印象 我为此使用了一个动画 gif 由setStyleSheet作为居中的背景图像 我面临两个问题 gif 已显示 但不是动画 是否可以显示动画 gif 作为背景图像 通
  • Celery 错误“没有这样的传输:amqp”

    Celery 工作正常 有一天命令行工作程序无法启动 并显示以下跟踪 Traceback most recent call last File home buildslave venv bin celery line 9 in
  • 如何使用 Cloudinary 将经过转换的 url 输出为字符串?

    我将在开头说这可能是错误的做法 我想做的是使用 url w transformation 到 JSdata 属性 目前 我正在使用以下内容来生成图像标签 cl image tag image asset filename to s tran
  • 将 FeedParser 对象序列化为 Atom

    我使用 feedparserhttp www feedparser org http www feedparser org 解析 Atom feed 并对生成的 Python 对象进行一些操作 之后 我想将对象序列化回 Atom 但 fee
  • React Native - 通过邮件发送照片

    我正在尝试通过邮件发送最近在应用程序中捕获的照片 但遇到以下错误 对于邮件功能 我正在使用此模块 var Mailer require NativeModules RNMail 我试图借助此模块通过邮件发送照片 但出现以下错误 index