本專案由 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) 複製程式碼
這裡有兩個要說明的:
- 部分國產機無法使用圖片剪下功能,例如華為TAG-AL00就閹割了圖片剪下,但本人親測小米3就可以進行圖片剪下,這是系統優化差異造成的,不是本庫的問題!!!
- 此外,就算可以進行圖片剪下,也不一定可以固定圖片大小,親測小米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的執行效果: