react native android6+拍照閃退或重啓的解決方案

 

前言

android 6+權限使用的時候須要動態申請,那麼在使用rn的時候要怎麼處理拍照權限問題呢?本文提供的是一攬子rn操做相冊、拍照的解決方案,請看正文的提升班部分。html

 

解決步驟

一、AndroidManifest.xml設置拍照權限:java

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

二、配置build.gradle:react

設置defaultConfig裏面的targetSdkVersion>=23.android

三、在須要使用的地方或者程序啓動以後的主頁面的構造中申請相機權限,代碼以下:ios

async requestCameraPermission() {
    if (Platform.OS == 'ios') return true;
    //申請相機權限
    try {
        const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA, {
            title: '申請攝像頭權限',
            message: '一個很牛逼的應用想借用你的攝像頭'
        });
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
            console.log('如今你得到攝像頭權限了');
            return true;
        } else {
            console.log('用戶並不屌你');
            return false;
        }
    } catch (err) {
        console.warn(err);
        return false;
    }
}

拍照以前調用上面的方法:git

this.requestCameraPermission(); //申請相機權限

 

提升班

多圖選擇、圖片裁剪(支持ad/ios圖片個數控制)推薦使用react-native-syan-image-picker,使用教程查看《react-native多圖選擇、圖片裁剪(支持ad/ios圖片個數控制)》github

小技巧:react-native-syan-image-picker 版本V0.0.5 安卓6+ 拍照問題有點問題,我已經pull request,做者已經合併,稍後測試問題以後,便可發佈,若是着急使用貼出解決代碼。react-native

1.修改build.gradle如圖:異步

二、修改RNSyanImagePickerModule.java更新2.1.7配置,代碼以下:async

.openGallery(PictureMimeType.ofImage())//所有.PictureMimeType.ofAll()、圖片.ofImage()、視頻.ofVideo()、音頻.ofAudio()
.maxSelectNum(imageCount)// 最大圖片選擇數量 int
.minSelectNum(1)// 最小選擇數量 int
.imageSpanCount(4)// 每行顯示個數 int
.selectionMode(modeValue)// 多選 or 單選 PictureConfig.MULTIPLE or PictureConfig.SINGLE
.previewImage(true)// 是否可預覽圖片 true or false
.previewVideo(false)// 是否可預覽視頻 true or false
.enablePreviewAudio(false) // 是否可播放音頻 true or false
.isCamera(isCamera)// 是否顯示拍照按鈕 true or false
.imageFormat(PictureMimeType.PNG)// 拍照保存圖片格式後綴,默認jpeg
.isZoomAnim(true)// 圖片列表點擊 縮放效果 默認true
.sizeMultiplier(0.5f)// glide 加載圖片大小 0~1之間 如設置 .glideOverride()無效
.enableCrop(isCrop)// 是否裁剪 true or false
.compress(true)// 是否壓縮 true or false
.glideOverride(160, 160)// int glide 加載寬高,越小圖片列表越流暢,但會影響列表圖片瀏覽的清晰度
.withAspectRatio(CropW, CropH)// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定義
.hideBottomControls(isCrop)// 是否顯示uCrop工具欄,默認不顯示 true or false
.isGif(isGif)// 是否顯示gif圖片 true or false
.freeStyleCropEnabled(true)// 裁剪框是否可拖拽 true or false
.circleDimmedLayer(showCropCircle)// 是否圓形裁剪 true or false
.showCropFrame(showCropFrame)// 是否顯示裁剪矩形邊框 圓形裁剪時建議設爲false   true or false
.showCropGrid(showCropGrid)// 是否顯示裁剪矩形網格 圓形裁剪時建議設爲false    true or false
.openClickSound(false)// 是否開啓點擊聲音 true or false
.cropCompressQuality(90)// 裁剪壓縮質量 默認90 int
.minimumCompressSize(100)// 小於100kb的圖片不壓縮 
.synOrAsy(true)//同步true或異步false 壓縮 默認同步
.rotateEnabled(true) // 裁剪是否可旋轉圖片 true or false
.scaleEnabled(true)// 裁剪是否可放大縮小圖片 true or false
.videoQuality(0)// 視頻錄製質量 0 or 1 int
.videoMaxSecond(15)// 顯示多少秒之內的視頻or音頻也可適用 int 
.videoMinSecond(10)// 顯示多少秒之內的視頻or音頻也可適用 int 
.recordVideoSecond(60)//視頻秒數錄製 默認60s int
.forResult(PictureConfig.CHOOSE_REQUEST);//結果回調onActivityResult code 

效果如圖:

      

相關文章
相關標籤/搜索