IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 小程序和app实现项目本地图片保存到相册,采用taro -> 正文阅读

[移动开发]小程序和app实现项目本地图片保存到相册,采用taro

直接贴代码
小程序端实现代码:

import Taro, { Component, Config } from '@tarojs/taro';
import { View, Image, Text } from '@tarojs/components';
import { NavigationBar } from '@/components';
import './index.scss';

import officialAccountPng from './official-account.png';
import bgImage from './bg.png';

/**
 * 引导关注海信集团成为会员
 */
export default class GroupGoldExchangeTip extends Component {
    static config: Config = {
        navigationBarTitleText: '关注成为集团会员',
        backgroundColor: '#ffffff',
        navigationStyle: 'custom'
    };

    downCard = (e: Event) => {
        e.preventDefault();
        e.stopPropagation();

        // 获取用户是否开启用户授权相册
        Taro.getSetting({
            success(res) {
                // 如果没有则获取授权
                if (!res.authSetting['scope.writePhotosAlbum']) {
                    Taro.authorize({
                        scope: 'scope.writePhotosAlbum',
                        success() {
                            Taro.saveImageToPhotosAlbum({
                                filePath: officialAccountPng,
                                success() {
                                    Taro.showToast({
                                        title: '保存成功'
                                    });
                                },
                                fail() {
                                    Taro.showToast({
                                        title: '保存失败',
                                        icon: 'none'
                                    });
                                }
                            });
                        },
                        fail() {}
                    });
                } else {
                    // 有则直接保存
                    Taro.saveImageToPhotosAlbum({
                        filePath: officialAccountPng,
                        success() {
                            Taro.showToast({
                                title: '保存成功'
                            });
                        },
                        fail() {
                            Taro.showToast({
                                title: '保存失败',
                                icon: 'none'
                            });
                        }
                    });
                }
            },
            fail() {
                Taro.showToast({
                    title: '保存失败',
                    icon: 'none'
                });
            }
        });
    };

    render() {
        return (
            <View className='group-gold-exchange-tip'>
                <NavigationBar
                    navigationBarTitle='关注成为集团会员'
                    backIcon
                    backIconType='black'
                />
                <Image
                    className='group-gold-exchange-tip__bg'
                    mode='widthFix'
                    src={bgImage}
                />
                <View className='group-gold-exchange-tip__code-wrap'>
                    <View className='group-gold-exchange-tip__code-box'>
                        <Image
                            showMenuByLongpress
                            className='group-gold-exchange-tip__code-box-img'
                            src={officialAccountPng}
                        />
                    </View>
                    <View
                        className='group-gold-exchange-tip__download'
                        onClick={this.downCard.bind(this)}
                    >
                        <View className='group-gold-exchange-tip__download-btn'>
                            <Text className='group-gold-exchange-tip__download-text'>
                                保存图片
                            </Text>
                        </View>
                    </View>
                </View>
            </View>
        );
    }
}

app端
package.json中添加插件

"react-native-view-shot": "^3.1.2",

实现代码:(app采用ViewShot截图)

import Taro, { Component, Config } from '@tarojs/taro';
import { View, Image, Text } from '@tarojs/components';
import { NavigationBar } from '@/components';
import RNFile from '@/services/save-file';
import ViewShot from 'react-native-view-shot';
import './index.scss';

import officialAccountPng from './official-account.png';
import bgImage from './bg.png';

/**
 * 引导关注海信集团成为会员
 */
export default class GroupGoldExchangeTip extends Component {
    static config: Config = {
        navigationBarTitleText: '关注成为集团会员',
        backgroundColor: '#ffffff',
        navigationStyle: 'custom'
    };

    downCard = () => {
        // eslint-disable-next-line react/no-string-refs
        this.refs.viewShot
            .capture()
            .then((uri) => {
                RNFile.downloadImage(uri, '.png', true);
            })
            .catch(() => {
                Taro.showToast({
                    title: '保存失败',
                    icon: 'none'
                });
            });
    };

    render() {
        return (
            <View className='group-gold-exchange-tip'>
                <NavigationBar
                    navigationBarTitle='关注成为集团会员'
                    backIcon
                    backIconType='black'
                />
                <Image
                    className='group-gold-exchange-tip__bg'
                    mode='widthFix'
                    src={bgImage}
                />
                <View className='group-gold-exchange-tip__code-wrap'>
                    <ViewShot
                        // eslint-disable-next-line react/no-string-refs
                        ref='viewShot'
                        options={{ format: 'png' }}
                    >
                        <View className='group-gold-exchange-tip__code-box'>
                            <Image
                                showMenuByLongpress
                                className='group-gold-exchange-tip__code-box-img'
                                src={officialAccountPng}
                            />
                        </View>
                    </ViewShot>
                    <View
                        className='group-gold-exchange-tip__download'
                        onClick={this.downCard.bind(this)}
                    >
                        <View className='group-gold-exchange-tip__download-btn'>
                            <Text className='group-gold-exchange-tip__download-text'>
                                保存图片
                            </Text>
                        </View>
                    </View>
                </View>
            </View>
        );
    }
}


RNFile.downloadImage的具体实现方案

import { Platform } from 'react-native';
import CameraRoll from '@react-native-community/cameraroll';
import Taro from '@tarojs/taro';
import RNFS from 'react-native-fs';

const imgTypeArr = ['.png', '.jpg', '.jpeg', '.gif', '.bmp'];

const RNFile = {
    /**
     * @param fromUrl 文件地址
     * @param fileType 文件类型
     * @param directSaveAlbum 是否是file协议的文件 直接保存
     */
    async downloadImage(fromUrl, fileType = '', directSaveAlbum = false) {
        if (!fromUrl) return;
        if (!fileType) fileType = '.png';

        Taro.showLoading({ title: '' });

        if (Platform.OS === 'android') {
            for (let index = 0; index < imgTypeArr.length; index++) {
                const item = imgTypeArr[index];
                if (fromUrl.indexOf(item) >= 0) {
                    fileType = item;
                    break;
                }
            }

            if (directSaveAlbum) {
                // 如果图片资源是 file://xxxx 的 直接使用存储
                // https://github.com/itinance/react-native-fs/issues/865
                const promise = CameraRoll.saveToCameraRoll(fromUrl);
                promise
                    .then(() => {
                        Taro.showToast({
                            title: '保存成功!'
                        });
                    })
                    .catch((error) => {
                        Taro.showToast({
                            title: '保存失败!\n' + error
                        });
                    });
            } else {
                const storeLocation = `${RNFS.DocumentDirectoryPath}`;
                const pathName = `${new Date().getTime()}${Math.random() *
                    1000}${fileType}`;
                const downloadPath = `${storeLocation}/${pathName}`;
                const ret = RNFS.downloadFile({
                    fromUrl,
                    toFile: downloadPath
                });
                ret.promise.then((res) => {
                    if (res && res.statusCode === 200) {
                        const promise = CameraRoll.saveToCameraRoll(
                            'file://' + downloadPath
                        );
                        promise
                            .then(() => {
                                Taro.showToast({
                                    title: '保存成功!'
                                });
                            })
                            .catch((error) => {
                                Taro.showToast({
                                    title: '保存失败!\n' + error
                                });
                            });
                    }
                });
            }
        } else {
            const promise = CameraRoll.saveToCameraRoll(fromUrl);
            promise
                .then(() => {
                    Taro.showToast({
                        title: '保存成功!'
                    });
                })
                .catch(function(error) {
                    Taro.showToast({
                        title: '保存失败!\n' + error
                    });
                });
        }
    }
};

export default RNFile;

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:36:39  更:2022-03-30 18:37:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/20 17:42:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码