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


 

前言

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

 

解決步驟

1、AndroidManifest.xml設置拍照權限:

<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" />

2、配置build.gradle:

設置defaultConfig里面的targetSdkVersion>=23.

3、在需要使用的地方或者程序啟動之后的主頁面的構造中申請相機權限,代碼如下:

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;
    }
}

拍照之前調用上面的方法:

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

 

提高班

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

小技巧:react-native-syan-image-picker 版本V0.0.5 安卓6+ 拍照問題有點問題,我已經pull request,作者已經合並,稍后測試問題之后,即可發布,如果着急使用貼出解決代碼。

1.修改build.gradle如圖:

2、修改RNSyanImagePickerModule.java更新2.1.7配置,代碼如下:

.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 

效果如圖:

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM