将捕获的图像从相机保存到自定义文件夹

Posted

技术标签:

【中文标题】将捕获的图像从相机保存到自定义文件夹【英文标题】:Save captured image from camera to custom folder react native 【发布时间】:2018-10-04 19:34:23 【问题描述】:

所以我正在使用 react-native 创建一个简单的相机应用程序。对于相机组件,我使用react-native-camera 包。到目前为止,我可以使用 react-native CameraRoll Api CameraRoll.saveToCameraRoll 捕获照片并将其保存到 DCIM 文件夹中,但我想将其保存在另一个文件夹中,例如 DCIM/CameraAppPictures 文件夹中。为此,我使用RNFetchBlob 包。我尝试了几种方法来从 this.camera.takePictureAsync 返回的 uri 创建一个新文件,但它会引发文件不存在的错误。但是,如果我将该 uri 传递给 CameraRoll.saveToCameraRoll,它会将其保存在 DCIM 文件夹中。

我当前的代码:

    const options =  quality: 0.5 ;

    const data = await this.camera.takePictureAsync(options)
    const  uri, height, width  = data;
    this.setState( uri, height, width );

    CameraRoll.saveToCameraRoll(data.uri, 'photo') // it saves it into DCIM
    .then( uri => 
        // tried this too
        //RNFetchBlob.fs.createFile(`$RNFetchBlob.fs.dirs.DCIMDir/newfile.png`, uri, 'uri'); // throws error that file does not exist
        RNFetchBlob.fs.cp(`$RNFetchBlob.fs.dirs.DCIMDir`, `$RNFetchBlob.fs.dirs.DCIMDir/CameraApp/p.png`);  
        console.warn('uri:', uri)
    )
    .catch( err => console.warn('err:', err));
    console.warn(data);

我尝试了一些奇怪的方法只是将文件保存在我想要的位置,但徒劳无功。我希望我已经清除了我的意图,但如果您需要更多信息,请告诉我。欢迎提出任何建议。

【问题讨论】:

@Julien Malige 你能对这个问题提供任何见解吗.. 【参考方案1】:

**我可以创建目录,但是我无法将图像移动到该目录,但是您可以检查它是否对您有帮助。!! **

import React from 'react';
//import react in our code. 
import  StyleSheet, Text, View, 
Alert, ActivityIndicator, Permissionsandroid  from 'react-native';
//import all the basic components we are going to use.
import  CameraKitCameraScreen  from 'react-native-camera-kit';
//import CameraKitCameraScreen we are going to use.
import RNFetchBlob from 'react-native-fetch-blob'

export default class App extends React.Component 
state = isPermitted:false
constructor(props) 
super(props);
var that=this;
async function requestCameraPermission() 
try 
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
'title': 'CameraExample App Camera Permission',
'message': 'CameraExample App needs access to your camera '

)
if (granted === PermissionsAndroid.RESULTS.GRANTED) 
//If CAMERA Permission is granted
//Calling the WRITE_EXTERNAL_STORAGE permission function
requestExternalWritePermission();
 else 
alert("CAMERA permission denied");

 catch (err) 
alert("Camera permission err",err);
console.warn(err)


async function requestExternalWritePermission() 
try 
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
'title': 'CameraExample App External Storage Write Permission',
'message': 'CameraExample App needs access to Storage data in your SD Card '

)
if (granted === PermissionsAndroid.RESULTS.GRANTED) 
//If WRITE_EXTERNAL_STORAGE Permission is granted
//Calling the READ_EXTERNAL_STORAGE permission function
requestExternalReadPermission();
 else 
alert("WRITE_EXTERNAL_STORAGE permission denied");

 catch (err) 
alert("Write permission err",err);
console.warn(err)


async function requestExternalReadPermission() 
try 
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
'title': 'CameraExample App Read Storage Write Permission',
'message': 'CameraExample App needs access to your SD Card '

)
if (granted === PermissionsAndroid.RESULTS.GRANTED) 
//If READ_EXTERNAL_STORAGE Permission is granted
//changing the state to re-render and open the camera 
//in place of activity indicator
that.setState(isPermitted:true)
 else 
alert("READ_EXTERNAL_STORAGE permission denied");

 catch (err) 
alert("Read permission err",err);
console.warn(err)


//Calling the camera permission function
requestCameraPermission();

onBottomButtonPressed(event) 

if (event.type) 
//const captureImages = JSON.stringify(event.captureImages);

if (event.type == "capture") 

const pictureFolder = RNFetchBlob.fs.dirs.SDCardDir+'/Optimize/';
const captureImageLength = event.captureImages.length;
RNFetchBlob.fs.exists(pictureFolder).then((exists)=>
if(exists)
RNFetchBlob.fs.isDir(pictureFolder).then((isDir)=>
if(isDir)

RNFetchBlob.fs.mv(event.captureImages[0].uri, RNFetchBlob.fs.dirs.SDCardDir+'/Optimize/').then(() => 
alert('Image Moved');
).catch((e)=> alert("FAILED:= "+e.message) );
else
alert('Some Error Happened');

).catch((e)=> alert("Checking Directory Error : "+e.message); );
else
RNFetchBlob.fs.mkdir(pictureFolder).then(()=>
alert('DIRECTORY CREATED');
).catch((e)=> alert("Directory Creating Error : "+e.message); );

);



render() 
if(this.state.isPermitted)
return (
<CameraKitCameraScreen
// Buttons to perform action done and cancel
actions= rightButtonText: 'Done', leftButtonText: 'Cancel' 
onBottomButtonPressed=event => this.onBottomButtonPressed(event)
flashImages=
// Flash button images
on: require('./assets/flashon.png'),
off: require('./assets/flashoff.png'),
auto: require('./assets/flashauto.png'),

cameraFlipImage=require('./assets/flip.png')
captureButtonImage=require('./assets/capture.png')
/>
);
else
return ( 
<ActivityIndicator />
)



const styles = StyleSheet.create(
container: 
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
,
);

【讨论】:

以上是关于将捕获的图像从相机保存到自定义文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 react-native-camera 将捕获的图像保存到自定义应用程序特定文件夹

如何将图像保存到自定义相册?

Swift 3 或 4 保存到自定义相册会创建重复的图像

Phonegap(cordova)将图像保存到自定义相册

将相机捕获的图像保存到ios中的文档目录中[重复]

保存自定义相机捕获图像 iOS Xcode