極其方便的系統原生圖片選取庫,已適配Android 7.0

GitLqr發表於2017-05-25

本專案由 CSDN_LQR 個人獨立開發。
本庫GitHub地址:github.com/GitLqr/LQRN…

一、簡述

從 Android 7.0 開始,Android SDK 中的 StrictMode 策略禁止開發人員在應用外部公開 file:// URI。具體表現為,當我們在應用中使用包含 file:// URI 的 Intent 離開自己的應用時,程式會發生故障。本人根據網上給出的適配教程,成功在圖片選擇及拍照方面適配上了Android 7.0,並自己封裝了一個工具類,為了今後開發更加快捷,於是本庫就誕生了,如果你願意使用本庫的話,只需呼叫本庫工具類中提供的3個方法(最少),便可輕鬆完成拍照或相簿選取圖片的功能需求,且完全不需要考慮Android系統版本的問題,下面來看看如何使用本庫。

二、使用

1、依賴與許可權

1)依賴

compile 'com.lqr.picselect:library:1.0.1'複製程式碼

2)許可權

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>複製程式碼

2、程式碼呼叫

1)建立LQRPhotoSelectUtils

LQRPhotoSelectUtils提供了兩個建構函式,分別是:

// 可以自定義是否開啟圖片剪下功能(無法設定剪下大小,預設800*480)
public LQRPhotoSelectUtils(Activity activity, PhotoSelectListener listener, boolean shouldCrop)
// 預設開啟圖片剪下功能,可以指定剪下大小
public LQRPhotoSelectUtils(Activity activity, PhotoSelectListener listener, int aspectX, int aspectY, int outputX, int outputY) 複製程式碼

這裡有兩個要說明的:

  1. 部分國產機無法使用圖片剪下功能,例如華為TAG-AL00就閹割了圖片剪下,但本人親測小米3就可以進行圖片剪下,這是系統優化差異造成的,不是本庫的問題!!!
  2. 此外,就算可以進行圖片剪下,也不一定可以固定圖片大小,親測小米3與堅果pro無法固定剪下圖片的大小,又因為手頭上沒有“谷歌親兒子”,所以沒法斷定是不是本庫程式碼問題,故在此,本人建議使用第一個構造方法。

使用第一個構造方法建立LQRPhotoSelectUtils物件示例如下:

// 建立LQRPhotoSelectUtils(一個Activity對應一個LQRPhotoSelectUtils)
mLqrPhotoSelectUtils = new LQRPhotoSelectUtils(this, new LQRPhotoSelectUtils.PhotoSelectListener() {
    @Override
    public void onFinish(File outputFile, Uri outputUri) {
        // 當拍照或從相簿選取圖片成功後回撥
        mTvPath.setText(outputFile.getAbsolutePath());
        mTvUri.setText(outputUri.toString());
        Glide.with(MainActivity.this).load(outputUri).into(mIvPic);
    }
}, true);複製程式碼

如果你不需要圖片剪下功能,只需要將構造方法的第3個引數傳入false即可。

2)關聯onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 在Activity中的onActivityResult()方法裡與LQRPhotoSelectUtils關聯
    mLqrPhotoSelectUtils.attachToActivityForResult(requestCode, resultCode, data);
}複製程式碼

3)呼叫拍照或從相簿選取圖片方法

// 呼叫相機進行拍照
mLqrPhotoSelectUtils.takePhoto();
// 呼叫相簿選取圖片
mLqrPhotoSelectUtils.selectPhoto();複製程式碼

4)其他設定

// 設定FileProvider的主機名
mLqrPhotoSelectUtils.setAuthorities();
// 修改圖片的儲存路徑
mLqrPhotoSelectUtils.setImgPath();複製程式碼

注意:

如果你app的build.gradle中,defaultConfig{}的applicationId對應的值不是應用包名的話就需要呼叫setAuthorities()方法;也設定FileProvider的主機名,這是為了適配Android 7.0。取值是applicationId對應的值+".fileprovider"。若applicationId對應的值是應用包名的話則不需理會。

4、效果

如有問題請參考本庫的Demo,相信問題並不大,下面看下Demo的執行效果:

極其方便的系統原生圖片選取庫,已適配Android 7.0

相關文章