簡介
MultiImageSelector 輕量級的多圖片選擇工具段磨,適合多張圖片上傳的場景广鳍。
改進點
- 兼容7.0以上拍照
- 新增是否主動選擇照片的功能
- 動態(tài)設置照片水印
為何要改進
- 7.0以后android 在拍照時返回的“uri”這塊做了很大的改進
- 有這樣的奇葩需求:
1.上傳多張照片,具體多少張不確定蝶溶,用戶根據(jù)當時場景自己隨意定嗜历。
2.部分用戶要求可以從“相冊”里主動去選照片宣渗,部分用戶要求不能從“相冊”里選照片。(用戶來自不同市區(qū)梨州,開發(fā)時共用同一套模板痕囱,對于不同用戶稍加修改項目模板,打算寫一個開關出來暴匠,于是就誕生了是否主動選擇照片的功能)
3.加水印防止用戶提前拍好照片鞍恢,后期使用。
效果預覽
進入項目
- gradle 配置
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
compile 'com.zhy:base-rvadapter:3.0.3' //萬能適配器
compile 'com.zhy:base-adapter:3.0.3' //萬能適配器
compile 'com.github.bumptech.glide:glide:3.7.0'
implementation 'com.github.stf-android:MultiImageSelector:1.0.1' // 圖片選擇器
- Manifest 配置
<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" />
<!--兼容7.0以上拍照-->
<!-- authorities:是該項目的包名+provider
<!- grantUriPermissions:必須是true每窖,表示授予 URI 臨時訪問權限-->
<!--exported:必須是false-->
<!--resource:中的@xml/file_paths是我們接下來要在資源文件目錄下添加的文件 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
- file_paths.xml文件
在app下res目錄下新建xml文件夾帮掉,然后再xml中新建 file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--path:需要臨時授權訪問的路徑(.代表在相機調(diào)用時候訪問的是所有路徑,而文件寫入時訪問的路徑是Android/data/com.ijuyin.prints.news/)-->
<!--name: 是你為設置的這個訪問路徑起的名字-->
<paths>
<external-path
name="camera_photos"
path="." />
<external-path
name="files_root"
path="Android/data/com.ijuyin.prints.news/" />
<external-path
name="external_storage_root"
path="." />
</paths>
</resources>
- MultiImageSelector 的調(diào)用
private void startCamera() {
MultiImageSelector mModeType = null;
if (mMode) {// 拍單張還是多張
mModeType = getMultiImageSelectorOrigin().multi();// 多選
} else {
mModeType = getMultiImageSelectorOrigin().single(); // 單選
}
String trim = waterMrakEdit.getText().toString().trim();
if (TextUtils.isEmpty(trim)) {
mModeType.start(this, mCoder);// 開始拍照
} else {
WaterMarkBean waterMarkBean = mModeType.getWaterMarkBean(); // 設置水印的屬性
waterMarkBean.setTextSize(28);
waterMarkBean.setColor("#d4237a");
waterMarkBean.setAntiAlias(true);
waterMarkBean.setAlpha(180);
waterMarkBean.setRotate(-30);
waterMarkBean.setMark(trim);
mModeType.setWaterMarkStyle(waterMarkBean).start(this, mCoder); // 開始拍照
}
}
private MultiImageSelector getMultiImageSelectorOrigin() {
return MultiImageSelector.create()
.showCamera(mShowCamera) // 是否顯示相機. 默認為顯示
.count(mPhotoNumSp) // 最大選擇圖片數(shù)量, 默認為9. 只有在選擇模式為多選時有效
.selectPhoto(mSelectorPhoto) // 是否主動從相冊中選擇照片
.setWaterMarkPrivacy(mWaterMarkVis) // 是否添加水印
.origin(listPhotoPath);//返回照片集合的路徑
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == mCoder) {
if (resultCode == RESULT_OK) { // 照片的路徑集合返回
listPhotoPath = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
setGridViewData();
}
}
}
說明:
- 關于已經(jīng)顯出的照片的增加窒典,移除蟆炊,更換的問題
遵循是否主動在相冊中選擇照片的規(guī)則下
1.主動選擇
單選模式:拍照進行替換照片,不能移除瀑志。
多選模式:拍照增加替換或者點擊某張照片進行增加涩搓,移除。
2.不主動選擇(默認選中)
單選模式:只能拍照更換照片(默認選中該照片)劈猪。
多選模式:拍照(默認選中最近幾次拍的照片)昧甘,可長按某張照片移除它。
除拍照外其他操作最后點擊“完成”即可战得。 - 添加 水印且不設置水印內(nèi)容時充边,顯示當前拍照時間