zoukankan      html  css  js  c++  java
  • React Native之图片保存到本地相册(ios android)

    React Native之图片保存到本地相册(ios android)

    一,需求分析

        1,react native保存网络图片到相册,iOS端可以用RN自带的CameraRoll完美解决,但是android端不支持从网络保存图片。

        2,只保存一张图片到本地相册(比如生成的邀请卡 付款码等)

    二,介绍与iOS简单配置

         2.1 介绍

    saveToCameraRoll(tag, type?)方法介绍

    (1)这个是 CameraRoll 的一个静态方法,作用是保存一张图片到相册。
    (2)参数 tag 是图片的地址,为字符串类型。其内容根据不同的设备也有所不同:
      • 在 Android 上:tag 是本地地址,例如:"file:///sdcard/img.png"
      • 在 iOS 上:tag 可以是 url、assets-library、内存图片中的一种。
    (3)参数 type 不是必须的,可选值是'photo' 或 'video'。用来表示存的是图片还是视频。不指定的话程序也会根据后缀自行判断。(结尾为 .mov 或 .mp4 为视频,其它为图片)

         2.2 CameraRoll API iOS链接配置

    第一步

        添加CameraRoll库(node_modules/react-native/Libraries/CameraRoll/RCTCameraRoll.xcodeproj)到XCode的Libraries分组里 

    第二步

        将 RCTCameraRoll.xcodeproj下的Products文件夹中的静态库文件(.a文件,拖到Xcode General--Linked FrameworksLibraries下。

    第三步

        配置访问相册的权限,如果不配置Privacy - Photo Library Additions Usage Description到Info.plist下,会出现闪退情况。在Info.plist添加如下:

    1     <key>NSPhotoLibraryAddUsageDescription</key>
    2     <string>使用相册</string>
    3     <key>NSPhotoLibraryUsageDescription</key>
    4     <string>使用相册</string>

         Android可以直接访问CameraRoll API

    1 import { Platform, CameraRoll } from 'react-native';
    2 import RNFS from 'react-native-fs';

    三,应用实例

        3.1 网络图片保存到相册(支持iOS Android)

    下载网络图片,并保存到相册中:

     1 /**
     2  * 下载网页图片
     3  * @param uri  图片地址
     4  * @returns {*}
     5  */
     6 export const DownloadImage=(uri)=> {
     7     if (!uri) return null;
     8     return new Promise((resolve, reject) => {
     9         let timestamp = (new Date()).getTime();//获取当前时间错
    10         let random = String(((Math.random() * 1000000) | 0))//六位随机数
    11         let dirs = Platform.OS === 'ios' ? RNFS.LibraryDirectoryPath : RNFS.ExternalDirectoryPath; //外部文件,共享目录的绝对路径(仅限android)
    12         const downloadDest = `${dirs}/${timestamp+random}.jpg`;
    13         const formUrl = uri;
    14         const options = {
    15             fromUrl: formUrl,
    16             toFile: downloadDest,
    17             background: true,
    18             begin: (res) => {
    19                 // console.log('begin', res);
    20                 // console.log('contentLength:', res.contentLength / 1024 / 1024, 'M');
    21             },
    22         };
    23         try {
    24             const ret = RNFS.downloadFile(options);
    25             ret.promise.then(res => {
    26                 // console.log('success', res);
    27                 // console.log('file://' + downloadDest)
    28                 var promise = CameraRoll.saveToCameraRoll(downloadDest);
    29                 promise.then(function(result) {
    30                    // alert('保存成功!地址如下:
    ' + result);
    31                 }).catch(function(error) {
    32                      console.log('error', error);
    33                     // alert('保存失败!
    ' + error);
    34                 });
    35                 resolve(res);
    36             }).catch(err => {
    37                 reject(new Error(err))
    38             });
    39         } catch (e) {
    40             reject(new Error(e))
    41         }
    42 
    43     })
    44 
    45 }

    使用实例

     1  //保存图片
     2     DownloadImage=(uri)=>{
     3         Download.DownloadImage(uri).then((res)=>{
     4             if(res.statusCode==200){
     5                 Toast.show('图片保存成功')
     6             }else{
     7                 Toast.show('图片保存失败')
     8             }
     9         })
    10         .catch((error)=>{
    11             Toast.show('图片保存失败')
    12            console.log(error)
    13         })
    14     }

        3.2 内存图片保存到相册(支持iOS Android)

    将内存图片保存到相册中:

     1 /**
     2  * 保存图片到相册
     3  * @param ImageUrl  图片地址
     4  * @returns {*}
     5  */
     6 export const DownloadLocalImage=(ImageUrl)=> {
     7     if (!ImageUrl) return null;
     8     return new Promise((resolve, reject) => {
     9         try {
    10                 var promise = CameraRoll.saveToCameraRoll(ImageUrl);
    11                 promise.then(function(result) {
    12                     resolve({statusCode:200});
    13                     //alert('保存成功!地址如下:
    ' + result);
    14                 }).catch(function(error) {
    15                      console.log('error', error);
    16                     // alert('保存失败!
    ' + error);
    17                 });
    18         } catch (e) {
    19             reject(new Error(e))
    20         }
    21 
    22     })
    23 
    24 }
  • 相关阅读:
    python中获取当前位置所在的行号和函数名(转)
    Scrapy 轻松定制网络爬虫(转)
    XPath教程
    Scrapy入门教程(转)
    django safe 过滤器--不对字符串进行转义(转)
    WinDbg-如何抓取dump文件
    Windows系统默认调试器设置
    javascript(js)自动刷新页面的实现方法总结
    [HTML]不让TD中的文本撑开表格(转)
    apache 与 iis共存
  • 原文地址:https://www.cnblogs.com/jackson-yqj/p/9556468.html
Copyright © 2011-2022 走看看