在项目中随处可见的照相机和选择图片功能
react-native-image-picker的GtiHub地址,我们一定要多看看这些,了解这些属性小萌把属性复制到这里了
这个只是选择,如果要实现多个图像选择,裁剪,压缩等功能需要 react-native-image-crop-picker 这个小萌以后也会介绍的
添加依赖
安装
yarn add react-native-image-picker
保险一些 运行一下没坏处
react-native link
在使用前我们先配置环境:
一、安卓环境配置
1,在android/settings.gradle文件中添加如下代码:
include ':react-native-image-picker'
project(':react-native-image-picker').projectDir = new File(settingsDir, '../node_modules/react-native-image-picker/android')
2,在android/app/build.gradle文件的dependencies中添加如下代码:
compile project(':react-native-image-picker')
3,在AndroidManifest.xml文件中添加权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4,最后在MainApplication.Java文件中添加如下代码:
import com.imagepicker.ImagePickerPackage;
new ImagePickerPackage()
二:苹果环境配置
在info.plist中配置即可

属性
option | iOS | Android | 描述 |
---|---|---|---|
title | OK | OK | 标题 |
cancelButtonTitle | OK | OK | 取消按钮 |
takePhotoButtonTitle | OK | OK | 拍照按钮 |
chooseFromLibraryButtonTitle | OK | OK | 从图库选择照片 |
customButtons | OK | OK | 自定义按钮 |
cameraType | OK | - | 类型 'front' or 'back' |
mediaType | OK | OK | 图片或视频 'photo', 'video', or 'mixed' on iOS, 'photo' or 'video' on Android |
maxWidth | OK | OK | 最长宽 Photos only |
maxHeight | OK | OK | 最长高 Photos only |
quality | OK | OK | 图片质量 0 to 1, photos only |
videoQuality | OK | OK | 视频质量 'low', 'medium', or 'high' on iOS, 'low' or 'high' on Android |
durationLimit | OK | OK | 最大视频录制时间,以秒为单位 |
rotation | - | OK | Photos only, 0 to 360 旋转角度 |
allowsEditing | OK | - | bool 是否可以编辑 |
noData | OK | OK | 如果为true,则禁用data生成的base64 字段(极大地提高大图片的性能) |
storageOptions | OK | OK | 如果提供此密钥,该图像将被保存在DocumentsiOS 应用程序的目录中,或者保存在PicturesAndroid上的应用程序目录(而不是临时目录) |
storageOptions.skipBackup | OK | - | 如果true,该照片将不会备份到iCloud |
storageOptions.path | OK | - | 如果设置,将保存图像Documents/[path]/而不是根目录Documents |
storageOptions.cameraRoll | OK | OK | 如果为true,裁剪的照片将保存到iOS相机胶卷或Android DCIM文件夹。 |
storageOptions.waitUntilSaved | OK | - | 如果为true,则会延迟回复回复,直到照片/视频保存到相机胶卷后。如果刚刚拍摄了照片或视频,则只有在该AND cameraRoll均为真时,才会在响应对象中提供文件名和时间戳字段。 |
permissionDenied.title | - | OK | 解释权限对话框的标题。默认情况下Permission denied。 |
permissionDenied.text | - | OK | 解释权限对话框的消息。默认情况下To be able to take pictures with your camera and choose images from your library.。 |
permissionDenied.reTryTitle | - | OK | 重试按钮的标题。默认re-try |
permissionDenied.okTitle | - | OK | 确定按钮的标题。默认I'm sure |
响应对象
key | iOS | Android | 描述 |
---|---|---|---|
didCancel | OK | OK | 点击了取消 |
error | OK | OK | 出现错误信息 |
customButton | OK | OK | 点击了自定义按钮 |
data | OK | OK | base64编码的图像数据(仅限照片) |
uri | OK | OK | 设备上的本地文件资源(照片或视频) |
origURL | OK | - | 照片库中原始资源的网址(如果存在) |
isVertical | OK | OK | 如果图像是垂直定向的,则会是真实的 |
width | OK | OK | 图像宽(仅限照片) |
height | OK | OK | 图像高度(仅限照片) |
fileSize | OK | OK | 文件大小(仅限照片) |
type | - | OK | 文件类型(仅限照片) |
fileName | OK (photos and videos) | OK (photos) | 文件名称 |
path | - | OK | 文件路径 |
例子,完整代码的贴出是为了照顾初学者哦
完整代码:
import ImagePicker from 'react-native-image-picker';
import {
Platform,
StyleSheet,
Text,
View,
PixelRatio,
TouchableOpacity,
Image,
} from 'react-native';
const instructions = Platform.select({
ios: 'Press Cmd+R to reload,\n' +
'Cmd+D or shake for dev menu',
android: 'Double tap R on your keyboard to reload,\n' +
'Shake or press menu button for dev menu',
});
export default class App extends Component {
state = {
avatarSource: null,
videoSource: null
};
//选择图片
selectPhotoTapped() {
const options = {
title: '选择图片',
cancelButtonTitle: '取消',
takePhotoButtonTitle: '拍照',
chooseFromLibraryButtonTitle: '选择照片',
customButtons: [
{name: 'fb', title: 'Choose Photo from Facebook'},
],
cameraType: 'back',
mediaType: 'photo',
videoQuality: 'high',
durationLimit: 10,
maxWidth: 300,
maxHeight: 300,
quality: 0.8,
angle: 0,
allowsEditing: false,
noData: false,
storageOptions: {
skipBackup: true
}
};
ImagePicker.showImagePicker(options, (response) => {
console.log('Response = ', response);
if (response.didCancel) {
console.log('User cancelled photo picker');
}
else if (response.error) {
console.log('ImagePicker Error: ', response.error);
}
else if (response.customButton) {
console.log('User tapped custom button: ', response.customButton);
}
else {
let source = { uri: response.uri };
// You can also display the image using data:
// let source = { uri: 'data:image/jpeg;base64,' + response.data };
this.setState({
avatarSource: source
});
}
});
}
//选择视频
selectVideoTapped() {
const options = {
title: '选择视频',
cancelButtonTitle: '取消',
takePhotoButtonTitle: '录制视频',
chooseFromLibraryButtonTitle: '选择视频',
mediaType: 'video',
videoQuality: 'medium'
};
ImagePicker.showImagePicker(options, (response) => {
console.log('Response = ', response);
if (response.didCancel) {
console.log('User cancelled video picker');
}
else if (response.error) {
console.log('ImagePicker Error: ', response.error);
}
else if (response.customButton) {
console.log('User tapped custom button: ', response.customButton);
}
else {
this.setState({
videoSource: response.uri
});
}
});
}
render() {
return (
<View style={styles.container}>
<TouchableOpacity onPress={this.selectPhotoTapped.bind(this)}>
<View style={[styles.avatar, styles.avatarContainer, {marginBottom: 30}]}>
{ this.state.avatarSource === null ? <Text>选择照片</Text> :
<Image style={styles.avatar} source={this.state.avatarSource} />
}
</View>
</TouchableOpacity>
<TouchableOpacity onPress={this.selectVideoTapped.bind(this)}>
<View style={[styles.avatar, styles.avatarContainer]}>
<Text>选择视频</Text>
</View>
</TouchableOpacity>
{ this.state.videoSource &&
<Text style={{margin: 8, textAlign: 'center'}}>{this.state.videoSource}</Text>
}
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF'
},
avatarContainer: {
borderColor: '#9B9B9B',
borderWidth: 1 / PixelRatio.get(),
justifyContent: 'center',
alignItems: 'center'
},
avatar: {
borderRadius: 50,
width: 100,
height: 100
}
});
效果:


自定义选择器选择图片
const options = {
};
// Open Image Library:
ImagePicker.launchImageLibrary(options, (response) => {
// Same code as in above section!
});
// Launch Camera:
ImagePicker.launchCamera(options, (response) => {
// Same code as in above section!
});
在需要选择的地方写上这些代码即可。
网友评论
重装了一次依赖包,重新配置和link了一遍,然后重新在Android studio里build一遍项目就行了
不是很懂是什么原理