[Modify]修改圖片選擇邏輯和更改版本為1.3.0

This commit is contained in:
wushaocheng
2022-12-02 18:32:14 +08:00
parent 19b368d54e
commit 62702c9650
10 changed files with 86 additions and 208 deletions

View File

@@ -9,6 +9,7 @@
android:icon="@mipmap/app_logo"
android:label="@string/app_name"
android:largeHeap="true"
android:requestLegacyExternalStorage="true"
android:resizeableActivity="true"
android:supportsRtl="true"
android:theme="@style/MyMaterialTheme"

View File

@@ -10,17 +10,18 @@ import android.view.Gravity
import android.view.Window
import android.view.WindowManager
import com.hjq.toast.ToastUtils
import kotlinx.coroutines.Job
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import com.yizhuan.erban.R
import com.yizhuan.erban.application.XChatApplication
import com.yizhuan.xchat_android_library.common.base.BaseDialogFragment
import com.yizhuan.erban.databinding.PhotoDialogBinding
import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog
import com.yizhuan.xchat_android_library.common.base.BaseDialogFragment
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider
import com.yizhuan.xchat_android_library.common.photo.PhotoProviderNew
import com.yizhuan.xchat_android_library.common.util.PhotoCompressCallback
import com.yizhuan.xchat_android_library.common.util.PhotoCompressUtil
import com.yizhuan.xchat_android_library.common.util.PhotosCompressCallback
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import kotlinx.coroutines.Job
/**
* 该对话框的功能提供拍摄和选择图片
@@ -84,7 +85,7 @@ class PhotoDialog : BaseDialogFragment<PhotoDialogBinding>(), EasyPermissions.Pe
Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER)
PhotoProviderNew.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER)
}
}
@@ -115,7 +116,7 @@ class PhotoDialog : BaseDialogFragment<PhotoDialogBinding>(), EasyPermissions.Pe
Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
PhotoProvider.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER)
PhotoProviderNew.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER)
}
}

View File

@@ -38,7 +38,7 @@ import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.user.bean.UserInfo
import com.yizhuan.xchat_android_core.user.bean.UserPhoto
import com.yizhuan.xchat_android_core.utils.Logger
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider
import com.yizhuan.xchat_android_library.common.photo.PhotoProviderNew
import com.yizhuan.xchat_android_library.common.util.PhotoCompressCallback
import com.yizhuan.xchat_android_library.common.util.PhotoCompressUtil
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
@@ -317,7 +317,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
PhotoProviderNew.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
@@ -393,7 +393,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
}
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(it) ?: return
val photos = PhotoProviderNew.getResultPhotoList(it) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)

View File

@@ -29,7 +29,7 @@ import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.user.bean.UserInfo
import com.yizhuan.xchat_android_core.user.bean.UserPhoto
import com.yizhuan.xchat_android_core.utils.net.BeanObserver
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider
import com.yizhuan.xchat_android_library.common.photo.PhotoProviderNew
import com.yizhuan.xchat_android_library.common.util.PhotoCompressCallback
import com.yizhuan.xchat_android_library.common.util.PhotoCompressUtil
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
@@ -226,7 +226,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
PhotoProviderNew.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
@@ -246,7 +246,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
} else if (resultCode == RESULT_OK) {
when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProvider.getResultPhotoList(data) ?: return
val photos = PhotoProviderNew.getResultPhotoList(data) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)

View File

@@ -3,9 +3,7 @@ package com.yizhuan.erban.community.publish.view;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@@ -18,12 +16,10 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.flexbox.FlexboxLayout;
import com.hjq.toast.ToastUtils;
import com.netease.nim.uikit.StatusBarUtil;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.trello.rxlifecycle3.android.ActivityEvent;
@@ -36,8 +32,8 @@ import com.yizhuan.erban.community.photo.BigPhotoActivity;
import com.yizhuan.erban.community.photo.PagerOption;
import com.yizhuan.erban.community.publish.ImageAdapter;
import com.yizhuan.erban.community.publish.presenter.PublishPresenter;
import com.yizhuan.erban.community.utils.Glide4Engine;
import com.yizhuan.erban.community.utils.ObjectTypeHelper;
import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog;
import com.yizhuan.erban.ui.widget.recyclerview.decoration.GridSpacingItemDecoration;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.Constants;
@@ -52,18 +48,15 @@ import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver;
import com.yizhuan.xchat_android_library.base.factory.CreatePresenter;
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider;
import com.yizhuan.xchat_android_library.common.util.PhotoCompressUtil;
import com.yizhuan.xchat_android_library.common.util.PhotosCompressCallback;
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions;
import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.internal.entity.CaptureStrategy;
import com.zhihu.matisse.internal.entity.CustomItem;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -72,21 +65,15 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import kotlinx.coroutines.Job;
/**
* create by lvzebiao @2019/11/11
*/
@CreatePresenter(PublishPresenter.class)
public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresenter>
implements IPublishView, WorldsChooseFrg.ChooseWorldCallback, EasyPermissions.PermissionCallbacks {
implements IPublishView, WorldsChooseFrg.ChooseWorldCallback {
private final static String KEY_SP_ORIGINAL_IMAGE = "key_sp_original_image";
private final static int PERMISSION_CODE_STORAGE = 12;
private final static int REQUEST_CODE_STORAGE = 42;
private final static int REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111; // 从相册中选择
@BindView(R.id.rv_images)
RecyclerView rvImages;
@@ -126,8 +113,6 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
// 话题客态页进入(话题进入不让修改话题标签)
private boolean fromWorld;
private Job mJob = null;
public static void start(DialogManager manager, long worldId) {
if (beforeStart(manager)) {
return;
@@ -207,26 +192,25 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
imageAdapter.setOnItemClickListener((adapter, view, position) -> {
PublishItem item = imageShowList.get(position);
if (item.isAddItem()) {
// checkPermission(() -> {
// CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider",
// BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
// int maxCanSelect = 9 - uploadList.size();
// Matisse.from(PublishActivity.this)
// .choose(MimeType.ofImage())
// .showSingleMediaType(true)
// .capture(true)
// .spanCount(4)
// .captureStrategy(captureStrategy)
// .countable(true)
// .maxSelectable(maxCanSelect)
// .originalEnable(false)
// .maxOriginalSize(10)
// .imageEngine(new Glide4Engine())
// .setType(2)
// .setOriginalImagee(isOriginalImage)
// .forResult(ConstantValue.CODE_CHOOSE_PHOTO);
// }, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE);
checkStoragePermission();
checkPermission(() -> {
CaptureStrategy captureStrategy = new CaptureStrategy(true, context.getPackageName() + ".fileprovider",
BasicConfig.INSTANCE.getImageDir().getAbsolutePath());
int maxCanSelect = 9 - uploadList.size();
Matisse.from(PublishActivity.this)
.choose(MimeType.ofImage())
.showSingleMediaType(true)
.capture(true)
.spanCount(4)
.captureStrategy(captureStrategy)
.countable(true)
.maxSelectable(maxCanSelect)
.originalEnable(false)
.maxOriginalSize(10)
.imageEngine(new Glide4Engine())
.setType(2)
.setOriginalImagee(isOriginalImage)
.forResult(ConstantValue.CODE_CHOOSE_PHOTO);
}, R.string.ask_storage, Manifest.permission.READ_EXTERNAL_STORAGE);
} else {
BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList<CustomItem>) uploadList,
position, new PagerOption().setDelete(true));
@@ -344,45 +328,8 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_STORAGE) {
checkStoragePermission();
} else if (resultCode == RESULT_OK) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_CODE_OPEN_PHOTO_PROVIDER:
if (data == null) {
return;
}
PhotoProvider.getResultPathListAsync(data, new Function1<List<String>, Unit>() {
@Override
public Unit invoke(List<String> list) {
List<String> paths = list;
if (paths.isEmpty()) {
return null;
} else {
if (mJob != null) {
mJob.cancel(null);
} else {
mJob = PhotoCompressUtil.compress(PublishActivity.this, paths,
PhotoCompressUtil.getCompressCachePath("publish")
, new PhotosCompressCallback() {
@Override
public void onSuccess(@NonNull ArrayList<String> compressedImgList) {
List<String> pathResult = compressedImgList;
LogUtil.print(pathResult);
}
@Override
public void onFail(@NonNull Throwable e) {
}
}, 200, false, Constants.UPLOAD_IMAGE_MAX_SIZE, Constants.UPLOAD_IMAGE_MAX_FILE_LENGTH);
}
}
return null;
}
});
break;
case ConstantValue.CODE_CHOOSE_PHOTO:
String mimeType = Matisse.obtainMineResult(data);
List<CustomItem> pathResult = Matisse.obtainPathResult(data);
@@ -597,74 +544,4 @@ public class PublishActivity extends BaseMvpActivity<IPublishView, PublishPresen
StatusBarUtil.StatusBarLightMode(this);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
if (requestCode == PERMISSION_CODE_STORAGE) {
checkStoragePermission();
}
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
if (requestCode == PERMISSION_CODE_STORAGE) {
String requestTip = getString(R.string.permission_storage_denied);
CommonTipDialog mPrivacyDialog = new CommonTipDialog(context);
mPrivacyDialog.setTipMsg(requestTip);
mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update));
mPrivacyDialog.setOnActionListener(new CommonTipDialog.OnActionListener() {
@Override
public void onOk() {
//同意跳到应用详情页面
Uri packageUri = Uri.parse("package:${packageName}");
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
);
startActivityForResult(
intent, REQUEST_CODE_STORAGE
);
}
@Override
public void onCancel() {
CommonTipDialog.OnActionListener.super.onCancel();
//取消跳到应用详情页面
ToastUtils.show(getString(R.string.permission_storage_refused));
}
});
mPrivacyDialog.show();
}
}
private void checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
);
} else {
PhotoProvider.photoProvider(
this,
9,
true,
REQUEST_CODE_OPEN_PHOTO_PROVIDER,
true
);
}
}
}

View File

@@ -28,5 +28,5 @@ COMPILE_SDK_VERSION=32
MIN_SDK_VERSION=21
TARGET_SDK_VERSION=32
version_name=1.2.1
version_code=121
version_name=1.3.0
version_code=130

View File

@@ -24,7 +24,7 @@ import java.io.File
* Created by wushaocheng on 2022/11/15
* Desc图片选择二次封装
*/
object PhotoProvider {
object PhotoProviderNew {
private const val TAG = "PhotoProvider"
//上一次选择的时间,避免用户连续进入选择图片页导致删除缓存

View File

@@ -1,12 +1,13 @@
package com.netease.nim.uikit.business.session.actions;
import androidx.annotation.NonNull;
import com.netease.nim.uikit.R;
import com.netease.nim.uikit.business.session.event.ActiveEvent;
import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder;
import com.netease.nimlib.sdk.msg.MessageBuilder;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.yizhuan.xchat_android_library.common.util.Logger;
import org.greenrobot.eventbus.EventBus;
@@ -15,14 +16,14 @@ import java.io.File;
/**
* Created by hzxuwen on 2015/6/12.
*/
public class ImageAction extends PickImageActionNew{
public class ImageAction extends PickImageAction {
public ImageAction() {
super(R.drawable.chat_icon_photo, R.string.input_panel_photo, true);
}
@Override
protected void onPicked(File file) {
protected void onPicked(@NonNull File file) {
IMMessage message;
if (getContainer() != null && getContainer().sessionType == SessionTypeEnum.ChatRoom) {
message = ChatRoomMessageBuilder.createChatRoomImageMessage(getAccount(), file, file.getName());

View File

@@ -3,11 +3,8 @@ package com.netease.nim.uikit.business.session.actions
import android.content.Intent
import com.netease.nim.uikit.R
import com.netease.nim.uikit.business.session.helper.SendImageHelper
import com.yizhuan.xchat_android_library.common.application.BaseApp
import com.yizhuan.xchat_android_library.common.base.BaseDialogFragment
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider
import com.yizhuan.xchat_android_library.common.util.PhotoCompressUtil
import com.yizhuan.xchat_android_library.common.util.PhotosCompressCallback
import com.yizhuan.xchat_android_library.common.photo.PhotoProviderNew
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import java.io.File
@@ -31,7 +28,7 @@ abstract class PickImageActionNew protected constructor(
}
private fun checkStoragePermission() {
PhotoProvider.photoProvider(
PhotoProviderNew.photoProvider(
activity,
maxSelect = 9,
resultCode = makeRequestCode(REQUEST_CODE_OPEN_PHOTO_PROVIDER)
@@ -43,33 +40,34 @@ abstract class PickImageActionNew protected constructor(
when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> {
if (data == null) return
PhotoProvider.getResultPathListAsync(data) { list ->
PhotoProviderNew.getResultPathListAsync(data) { list ->
val paths = list?.toMutableList() ?: ArrayList()
if (paths.isEmpty()) {
SingleToastUtil.showToastShort(R.string.picker_image_error)
} else {
PhotoCompressUtil.compress(
BaseApp.getContext(),
paths,
PhotoCompressUtil.getCompressCachePath(),
object : PhotosCompressCallback {
override fun onSuccess(compressedImgList: ArrayList<String>) {
sendImageAfterSelfImagePicker(compressedImgList)
// for (path in compressedImgList) {
// val file = File(path)
// if (TextUtils.isEmpty(path) || !file.exists()) {
// SingleToastUtil.showToastShort(path + ResUtil.getString(R.string.xchat_android_core_file_filemodel_01))
// return
// }
// onPicked(file)
// }
}
override fun onFail(e: Throwable) {
SingleToastUtil.showToastShort(R.string.picker_image_error)
}
})
sendImageAfterSelfImagePicker(paths)
// PhotoCompressUtil.compress(
// BaseApp.getContext(),
// paths,
// PhotoCompressUtil.getCompressCachePath(),
// object : PhotosCompressCallback {
// override fun onSuccess(compressedImgList: ArrayList<String>) {
// sendImageAfterSelfImagePicker(compressedImgList)
//// for (path in compressedImgList) {
//// val file = File(path)
//// if (TextUtils.isEmpty(path) || !file.exists()) {
//// SingleToastUtil.showToastShort(path + ResUtil.getString(R.string.xchat_android_core_file_filemodel_01))
//// return
//// }
//// onPicked(file)
//// }
// }
//
// override fun onFail(e: Throwable) {
// SingleToastUtil.showToastShort(R.string.picker_image_error)
// }
//
// })
}
}
}

View File

@@ -128,22 +128,22 @@ public class SendImageHelper {
}
return new File(origMD5Path);
} else {
// File imageFile = new File(photoPath);
// extension = FileUtil.getExtensionName(photoPath);
// imageFile = ImageUtil.getScaledImageFileWithMD5(imageFile, extension);
// if (imageFile == null) {
// new Handler(context.getMainLooper()).post(new Runnable() {
// @Override
// public void run() {
// SingleToastUtil.showToastShort("是会计法规很少看见");
// }
// });
// return null;
// } else {
// ImageUtil.makeThumbnail(context, imageFile);
// }
File imageFile = new File(photoPath);
extension = FileUtil.getExtensionName(photoPath);
imageFile = ImageUtil.getScaledImageFileWithMD5(imageFile, extension);
if (imageFile == null) {
new Handler(context.getMainLooper()).post(new Runnable() {
@Override
public void run() {
SingleToastUtil.showToastShort("俺是個發生過");
}
});
return null;
} else {
ImageUtil.makeThumbnail(context, imageFile);
}
return new File(photoPath);
return imageFile;
}
}