diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a39656ac0..2c97a745b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -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" diff --git a/app/src/main/java/com/yizhuan/erban/common/dialog/PhotoDialog.kt b/app/src/main/java/com/yizhuan/erban/common/dialog/PhotoDialog.kt index c97b0031d..9e943d43f 100644 --- a/app/src/main/java/com/yizhuan/erban/common/dialog/PhotoDialog.kt +++ b/app/src/main/java/com/yizhuan/erban/common/dialog/PhotoDialog.kt @@ -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(), 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(), EasyPermissions.Pe Manifest.permission.READ_EXTERNAL_STORAGE ) } else { - PhotoProvider.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER) + PhotoProviderNew.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER) } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoModifyActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoModifyActivity.kt index bed296baf..2d0401597 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoModifyActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/ui/user/UserInfoModifyActivity.kt @@ -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 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) diff --git a/app/src/main/java/com/yizhuan/erban/ui/user/UserModifyPhotosActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/user/UserModifyPhotosActivity.kt index 48d4b7e33..cc4c1ce9f 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/user/UserModifyPhotosActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/ui/user/UserModifyPhotosActivity.kt @@ -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) diff --git a/app/src/module_community/java/com/yizhuan/erban/community/publish/view/PublishActivity.java b/app/src/module_community/java/com/yizhuan/erban/community/publish/view/PublishActivity.java index ff47489ed..1b17c3f94 100644 --- a/app/src/module_community/java/com/yizhuan/erban/community/publish/view/PublishActivity.java +++ b/app/src/module_community/java/com/yizhuan/erban/community/publish/view/PublishActivity.java @@ -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 - 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 { 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) uploadList, position, new PagerOption().setDelete(true)); @@ -344,45 +328,8 @@ public class PublishActivity extends BaseMvpActivity, Unit>() { - @Override - public Unit invoke(List list) { - List 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 compressedImgList) { - List 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 pathResult = Matisse.obtainPathResult(data); @@ -597,74 +544,4 @@ public class PublishActivity extends BaseMvpActivity perms) { - if (requestCode == PERMISSION_CODE_STORAGE) { - checkStoragePermission(); - } - } - - @Override - public void onPermissionsDenied(int requestCode, @NonNull List 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 - ); - } - } - } diff --git a/gradle.properties b/gradle.properties index 443d72c34..b94783c11 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,5 +28,5 @@ COMPILE_SDK_VERSION=32 MIN_SDK_VERSION=21 TARGET_SDK_VERSION=32 -version_name=1.2.1 -version_code=121 \ No newline at end of file +version_name=1.3.0 +version_code=130 \ No newline at end of file diff --git a/library/src/module_common/java/com/yizhuan/xchat_android_library/common/photo/PhotoProvider.kt b/library/src/module_common/java/com/yizhuan/xchat_android_library/common/photo/PhotoProviderNew.kt similarity index 99% rename from library/src/module_common/java/com/yizhuan/xchat_android_library/common/photo/PhotoProvider.kt rename to library/src/module_common/java/com/yizhuan/xchat_android_library/common/photo/PhotoProviderNew.kt index ecb3e5c8f..86a7e3c33 100644 --- a/library/src/module_common/java/com/yizhuan/xchat_android_library/common/photo/PhotoProvider.kt +++ b/library/src/module_common/java/com/yizhuan/xchat_android_library/common/photo/PhotoProviderNew.kt @@ -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" //上一次选择的时间,避免用户连续进入选择图片页导致删除缓存 diff --git a/nim_uikit/src/com/netease/nim/uikit/business/session/actions/ImageAction.java b/nim_uikit/src/com/netease/nim/uikit/business/session/actions/ImageAction.java index 0f78aa00e..64ba77f6e 100644 --- a/nim_uikit/src/com/netease/nim/uikit/business/session/actions/ImageAction.java +++ b/nim_uikit/src/com/netease/nim/uikit/business/session/actions/ImageAction.java @@ -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()); diff --git a/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt b/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt index 233a36fdb..a154d7d71 100644 --- a/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt +++ b/nim_uikit/src/com/netease/nim/uikit/business/session/actions/PickImageActionNew.kt @@ -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) { - 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) { +// 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) +// } +// +// }) } } } diff --git a/nim_uikit/src/com/netease/nim/uikit/business/session/helper/SendImageHelper.java b/nim_uikit/src/com/netease/nim/uikit/business/session/helper/SendImageHelper.java index 13b4e189d..c0051399a 100644 --- a/nim_uikit/src/com/netease/nim/uikit/business/session/helper/SendImageHelper.java +++ b/nim_uikit/src/com/netease/nim/uikit/business/session/helper/SendImageHelper.java @@ -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; } }