---
# System prepended metadata

title: 二維碼掃碼功能

---

# 二維碼掃碼功能

- [二維碼掃碼](https://www.twblogs.net/a/5c7c1c98bd9eee339918c505)

## 照片選擇

將使用 react-native-image-picker 套件。

### 安裝

```
$ npm install react-native-image-picker@latest --save
$ react-native link
```

### 報錯

安裝後，若看到此報錯，表示你的安裝時正確的。
後面的路徑 '/' 變爲反斜槓 '\' 將無法使用，改正過來即可。

``` 
include ':react-native-vector-icons'
project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android')
include ':react-native-image-picker'
project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android')
```

### Demo Code 

``` js
import React from 'react';
import { View, Button, Image } from 'react-native';
import ImagePicker from 'react-native-image-picker';

class ImagePickerAPI extends React.Component {

    state = {
        avatarSource: {
            uri: ''
        }
    }

    onPressImg = () => {
        const options = {
            title: '選擇圖片', 
            cancelButtonTitle: '取消',
            takePhotoButtonTitle: '拍照', 
            chooseFromLibraryButtonTitle: '相冊', 
            customButtons: [
                {name: '唯一名稱', title: '顯示的自定義按鈕內容'},
              ],
            cameraType: 'back', // 類型 'front' or 'back' ,前置還是後置攝像頭
            mediaType: 'photo', // 圖片或視頻 'photo', 'video', or 'mixed' on iOS, 'photo' or 'video' on Android
            videoQuality: 'high',  // 視頻質量 'low', 'medium', or 'high' on iOS, 'low' or 'high' on Android
            durationLimit: 10,  // 最大錄製時間
            maxWidth: 300, // 返回的圖片數據的最大寬 photos only 只有圖片有這個屬性
            maxHeight: 300, // 返回的圖片數據的最大高 photos only
            quality: 0.8, // 圖片質量 0 to 1 photos only
            angle: 90,
            allowsEditing: false, // 是否可以編輯
            noData: false, // 如果爲true，則禁用data生成的base64 字段（極大地提高大圖片的性能）
            storageOptions: {
                skipBackup: true   // 如果true，該照片將不會備份到iCloud
            }
        };

        ImagePicker.showImagePicker(options, (response) => {
            if (response.didCancel) {
                console.log('取消');
            }
            else if (response.error) {
                console.log('發生錯誤: ', response.error);
            }
            else if (response.customButton) {
                console.log('自定義按鈕被點擊，它的名稱是：', response.customButton);
            }
            else {
                console.log('Response = ', response); // 選擇或拍攝的照片數據對象
                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
                });
            }
        });
    }

    _renderImg = () => {
        const side = 200 ;
        if(this.state.avatarSource.uri){
            return(
                <View>
                    <Image 
                        source={{ uri: this.state.avatarSource.uri }} 
                        style={{width:side, height:side}} 
                    />
                </View>
            );
        }else{
            return null;
        }
    }

    render(){
        return(
            <View>
                <Button 
                    title='照片'
                    onPress={this.onPressImg}
                />
                {this._renderImg()}
            </View>
        );
    }
}

export default ImagePickerAPI;
```