[Modify]修改图片选择的逻辑

This commit is contained in:
wushaocheng
2022-12-01 20:35:52 +08:00
parent 2c398f8c8c
commit c10aa4af68
31 changed files with 440 additions and 59 deletions

View File

@@ -261,9 +261,6 @@ dependencies {
//Google Play Referrer API //Google Play Referrer API
implementation 'com.android.installreferrer:installreferrer:2.2' implementation 'com.android.installreferrer:installreferrer:2.2'
//mmkv
implementation 'com.tencent:mmkv:1.2.13'
implementation 'com.github.yalantis:ucrop:2.2.7' implementation 'com.github.yalantis:ucrop:2.2.7'
} }

View File

@@ -58,7 +58,7 @@ import com.yizhuan.erban.utils.PushMessageHandler;
import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.Constants; import com.yizhuan.xchat_android_core.Constants;
import com.yizhuan.xchat_android_core.DemoCache; import com.yizhuan.xchat_android_core.DemoCache;
import com.yizhuan.xchat_android_core.Env; import com.yizhuan.xchat_android_library.common.application.Env;
import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.UriProvider;
import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult; import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
@@ -85,6 +85,7 @@ import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.user.event.NeedCompleteInfoEvent; import com.yizhuan.xchat_android_core.user.event.NeedCompleteInfoEvent;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.net.ServerException; import com.yizhuan.xchat_android_core.utils.net.ServerException;
import com.yizhuan.xchat_android_library.common.application.BaseApp;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet; import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import com.yizhuan.xchat_android_library.net.rxnet.converter.GsonConverterPlugins; import com.yizhuan.xchat_android_library.net.rxnet.converter.GsonConverterPlugins;
import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil; import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil;
@@ -113,7 +114,7 @@ import io.realm.RealmConfiguration;
* @date 2017/2/11 * @date 2017/2/11
*/ */
public class XChatApplication extends Application { public class XChatApplication extends BaseApp {
public static final String TAG = "XChatApplication"; public static final String TAG = "XChatApplication";
public static Application gContext; public static Application gContext;
private static final MessageNotifierCustomization messageNotifierCustomization = new MessageNotifierCustomization() { private static final MessageNotifierCustomization messageNotifierCustomization = new MessageNotifierCustomization() {
@@ -528,6 +529,7 @@ public class XChatApplication extends Application {
initOtherSDK(); initOtherSDK();
} }
initContext(this); initContext(this);
BaseApp.init(this);
} }
/** /**

View File

@@ -3,7 +3,7 @@ package com.yizhuan.erban.avroom.adapter
import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.erban.R import com.yizhuan.erban.R
import com.yizhuan.erban.common.glide.GlideUtils import com.yizhuan.xchat_android_library.common.glide.GlideUtils
import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2 import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
import com.yizhuan.xchat_android_core.room.game.GameInfo import com.yizhuan.xchat_android_core.room.game.GameInfo

View File

@@ -15,12 +15,12 @@ import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import com.yizhuan.erban.R import com.yizhuan.erban.R
import com.yizhuan.erban.application.XChatApplication import com.yizhuan.erban.application.XChatApplication
import com.yizhuan.xchat_android_library.common.base.BaseDialogFragment import com.yizhuan.xchat_android_library.common.base.BaseDialogFragment
import com.yizhuan.erban.common.photo.PhotoProvider
import com.yizhuan.erban.common.util.PhotoCompressCallback import com.yizhuan.erban.common.util.PhotoCompressCallback
import com.yizhuan.erban.common.util.PhotoCompressUtil import com.yizhuan.erban.common.util.PhotoCompressUtil
import com.yizhuan.erban.common.util.PhotosCompressCallback import com.yizhuan.erban.common.util.PhotosCompressCallback
import com.yizhuan.erban.databinding.PhotoDialogBinding import com.yizhuan.erban.databinding.PhotoDialogBinding
import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider
/** /**
* 该对话框的功能提供拍摄和选择图片 * 该对话框的功能提供拍摄和选择图片

View File

@@ -1,4 +1,4 @@
package com.yizhuan.erban.common.photo package com.yizhuan.xchat_android_library.common.photo
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
@@ -7,14 +7,14 @@ import android.os.Build
import android.os.Environment import android.os.Environment
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import com.yizhuan.xchat_android_library.common.application.BaseApp
import com.yizhuan.xchat_android_library.common.delegate.SpDelegate
import com.yizhuan.xchat_android_library.common.file.FileHelper
import com.yizhuan.xchat_android_library.common.glide.GlideEngine
import com.yizhuan.xchat_android_library.common.util.Logger
import com.yizhuan.xchat_android_library.easyphoto.EasyPhotos import com.yizhuan.xchat_android_library.easyphoto.EasyPhotos
import com.yizhuan.xchat_android_library.easyphoto.constant.Type.* import com.yizhuan.xchat_android_library.easyphoto.constant.Type.*
import com.yizhuan.xchat_android_library.easyphoto.models.album.entity.Photo import com.yizhuan.xchat_android_library.easyphoto.models.album.entity.Photo
import com.yizhuan.erban.application.XChatApplication
import com.yizhuan.erban.common.delegate.SpDelegate
import com.yizhuan.erban.common.file.FileHelper
import com.yizhuan.erban.common.glide.GlideEngine
import com.yizhuan.xchat_android_core.utils.Logger
import com.yizhuan.xchat_android_library.utils.TimeUtils import com.yizhuan.xchat_android_library.utils.TimeUtils
import com.yizhuan.xchat_android_library.utils.TimeUtils.TIME_FORMAT import com.yizhuan.xchat_android_library.utils.TimeUtils.TIME_FORMAT
import kotlinx.coroutines.* import kotlinx.coroutines.*
@@ -45,7 +45,7 @@ object PhotoProvider {
withContext(Dispatchers.IO) { clearCache() } withContext(Dispatchers.IO) { clearCache() }
} }
EasyPhotos.createCamera(fragment, false)//参数说明:上下文,是否使用宽高数据false时宽高数据为0扫描速度更快 EasyPhotos.createCamera(fragment, false)//参数说明:上下文,是否使用宽高数据false时宽高数据为0扫描速度更快
.setFileProviderAuthority("${XChatApplication.getApplication().packageName}.fileprovider")//参数说明:见下方`FileProvider的配置` .setFileProviderAuthority("${BaseApp.getApplication().packageName}.fileprovider")//参数说明:见下方`FileProvider的配置`
.start(resultCode) .start(resultCode)
} }
} }

View File

@@ -6,7 +6,7 @@ import android.text.TextUtils
import android.util.Log import android.util.Log
import com.yizhuan.xchat_android_library.luban.Luban import com.yizhuan.xchat_android_library.luban.Luban
import com.yizhuan.erban.application.XChatApplication import com.yizhuan.erban.application.XChatApplication
import com.yizhuan.erban.common.file.FileHelper import com.yizhuan.xchat_android_library.common.file.FileHelper
import com.yizhuan.xchat_android_core.Constants import com.yizhuan.xchat_android_core.Constants
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File import java.io.File

View File

@@ -8,7 +8,7 @@ import android.widget.RadioGroup;
import com.yizhuan.erban.R; import com.yizhuan.erban.R;
import com.yizhuan.erban.base.BaseActivity; import com.yizhuan.erban.base.BaseActivity;
import com.yizhuan.erban.ui.utils.ImageLoadKt; import com.yizhuan.erban.ui.utils.ImageLoadKt;
import com.yizhuan.xchat_android_core.Env; import com.yizhuan.xchat_android_library.common.application.Env;
import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_library.utils.ResUtil; import com.yizhuan.xchat_android_library.utils.ResUtil;

View File

@@ -24,8 +24,7 @@ import com.yizhuan.erban.UIHelper
import com.yizhuan.erban.application.XChatApplication import com.yizhuan.erban.application.XChatApplication
import com.yizhuan.erban.audio.RecordingVoiceActivity import com.yizhuan.erban.audio.RecordingVoiceActivity
import com.yizhuan.erban.base.BaseViewBindingActivity import com.yizhuan.erban.base.BaseViewBindingActivity
import com.yizhuan.erban.common.file.FileHelper import com.yizhuan.xchat_android_library.common.file.FileHelper
import com.yizhuan.erban.common.photo.PhotoProvider
import com.yizhuan.erban.common.util.BitmapUtil import com.yizhuan.erban.common.util.BitmapUtil
import com.yizhuan.erban.common.util.PhotoCompressCallback import com.yizhuan.erban.common.util.PhotoCompressCallback
import com.yizhuan.erban.common.util.PhotoCompressUtil import com.yizhuan.erban.common.util.PhotoCompressUtil
@@ -41,6 +40,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.UserInfo
import com.yizhuan.xchat_android_core.user.bean.UserPhoto import com.yizhuan.xchat_android_core.user.bean.UserPhoto
import com.yizhuan.xchat_android_core.utils.Logger import com.yizhuan.xchat_android_core.utils.Logger
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import com.yizhuan.xchat_android_library.utils.ResUtil import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.xchat_android_library.utils.TimeUtils import com.yizhuan.xchat_android_library.utils.TimeUtils

View File

@@ -20,12 +20,10 @@ import com.yalantis.ucrop.UCrop
import com.yizhuan.erban.R import com.yizhuan.erban.R
import com.yizhuan.erban.application.XChatApplication import com.yizhuan.erban.application.XChatApplication
import com.yizhuan.erban.base.TitleBar import com.yizhuan.erban.base.TitleBar
import com.yizhuan.erban.common.file.FileHelper import com.yizhuan.xchat_android_library.common.file.FileHelper
import com.yizhuan.erban.common.photo.PhotoProvider
import com.yizhuan.erban.common.util.BitmapUtil import com.yizhuan.erban.common.util.BitmapUtil
import com.yizhuan.erban.common.util.PhotoCompressCallback import com.yizhuan.erban.common.util.PhotoCompressCallback
import com.yizhuan.erban.common.util.PhotoCompressUtil import com.yizhuan.erban.common.util.PhotoCompressUtil
import com.yizhuan.erban.ui.user.UserModifyPhotosActivity
import com.yizhuan.erban.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener import com.yizhuan.erban.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener
import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog import com.yizhuan.erban.ui.widget.dialog.CommonTipDialog
import com.yizhuan.xchat_android_core.file.FileModel import com.yizhuan.xchat_android_core.file.FileModel
@@ -33,6 +31,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.UserInfo
import com.yizhuan.xchat_android_core.user.bean.UserPhoto import com.yizhuan.xchat_android_core.user.bean.UserPhoto
import com.yizhuan.xchat_android_core.utils.net.BeanObserver import com.yizhuan.xchat_android_core.utils.net.BeanObserver
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import com.yizhuan.xchat_android_library.utils.ResUtil import com.yizhuan.xchat_android_library.utils.ResUtil
import kotlinx.coroutines.Job import kotlinx.coroutines.Job

View File

@@ -89,7 +89,6 @@ import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver;
import com.yizhuan.xchat_android_core.utils.net.RxHelper; import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.callback.CallBack; import com.yizhuan.xchat_android_library.net.rxnet.callback.CallBack;
import com.yizhuan.xchat_android_library.utils.ListUtils; import com.yizhuan.xchat_android_library.utils.ListUtils;
import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig; import com.yizhuan.xchat_android_library.utils.config.BasicConfig;

View File

@@ -29,7 +29,6 @@ import com.netease.nim.uikit.common.util.log.LogUtil;
import com.trello.rxlifecycle3.android.ActivityEvent; import com.trello.rxlifecycle3.android.ActivityEvent;
import com.yizhuan.erban.R; import com.yizhuan.erban.R;
import com.yizhuan.erban.base.BaseMvpActivity; import com.yizhuan.erban.base.BaseMvpActivity;
import com.yizhuan.erban.common.photo.PhotoProvider;
import com.yizhuan.erban.common.util.PhotoCompressUtil; import com.yizhuan.erban.common.util.PhotoCompressUtil;
import com.yizhuan.erban.common.util.PhotosCompressCallback; import com.yizhuan.erban.common.util.PhotosCompressCallback;
import com.yizhuan.erban.common.widget.dialog.ChooseWorldsDialog; import com.yizhuan.erban.common.widget.dialog.ChooseWorldsDialog;
@@ -55,6 +54,7 @@ import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver; import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver;
import com.yizhuan.xchat_android_library.base.factory.CreatePresenter; import com.yizhuan.xchat_android_library.base.factory.CreatePresenter;
import com.yizhuan.xchat_android_library.common.photo.PhotoProvider;
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions; import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions;
import com.yizhuan.xchat_android_library.utils.ResUtil; import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import com.yizhuan.xchat_android_library.utils.SingleToastUtil;

View File

@@ -3,7 +3,7 @@ package com.yizhuan.xchat_android_core;
import android.text.TextUtils; import android.text.TextUtils;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.utils.Logger; import com.yizhuan.xchat_android_library.common.application.Env;
/** /**
* 请求接口接口地址 * 请求接口接口地址

View File

@@ -6,7 +6,7 @@ import android.util.Log;
import com.tencent.bugly.crashreport.CrashReport; import com.tencent.bugly.crashreport.CrashReport;
import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.BuildConfig; import com.yizhuan.xchat_android_core.BuildConfig;
import com.yizhuan.xchat_android_core.Env; import com.yizhuan.xchat_android_library.common.application.Env;
import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.BaseEngine; import com.yizhuan.xchat_android_core.manager.BaseEngine;

View File

@@ -1,6 +1,7 @@
package com.yizhuan.xchat_android_core; package com.yizhuan.xchat_android_core;
import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_library.common.application.Env;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig; import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.yizhuan.xchat_android_library.utils.pref.CommonPref; import com.yizhuan.xchat_android_library.utils.pref.CommonPref;

View File

@@ -60,7 +60,7 @@ android {
dependencies { dependencies {
def glideVersion = "4.13.1" def glideVersion = "4.13.2"
def retrofitVersion = "2.9.0" def retrofitVersion = "2.9.0"
def okhttp3 = "4.9.3" def okhttp3 = "4.9.3"
def okio = "2.8.0" def okio = "2.8.0"
@@ -73,6 +73,7 @@ dependencies {
def SmartRefreshLayoutVersion = "1.0.3" def SmartRefreshLayoutVersion = "1.0.3"
def eventbusVersion = "3.0.0" def eventbusVersion = "3.0.0"
def fragment_version = "1.3.6" def fragment_version = "1.3.6"
def GlideTransformationsVersion = "3.0.1"
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
@@ -124,6 +125,11 @@ dependencies {
api 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' api 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0'
api 'com.github.chrisbanes:PhotoView:2.3.0' api 'com.github.chrisbanes:PhotoView:2.3.0'
//mmkv
api 'com.tencent:mmkv:1.2.13'
api "jp.wasabeef:glide-transformations:${GlideTransformationsVersion}"
} }
repositories { repositories {
mavenCentral() mavenCentral()

View File

@@ -0,0 +1,38 @@
package com.yizhuan.xchat_android_library.common.application;
import android.app.Application;
import android.content.Context;
/**
* Application的代理类
*/
public abstract class BaseApp extends Application{
private static final String TAG = "BaseApp";
public static Application gContext;
/**
* @return 获取Application上下文对象
*/
public static Context getContext() {
return gContext;
}
/**
* @return 获取Application实例
*/
public static Application getApplication() {
return gContext;
}
public static void init(Application application) {
gContext = application;
}
/**
* debug 环境 受到实验室模式影响
*/
public static boolean isDebug() {
return Env.isDebug();
}
}

View File

@@ -1,5 +1,6 @@
package com.yizhuan.xchat_android_core; package com.yizhuan.xchat_android_library.common.application;
import com.yizhuan.xchat_android_library.R;
import com.yizhuan.xchat_android_library.utils.ResUtil; import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig; import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.yizhuan.xchat_android_library.utils.pref.CommonPref; import com.yizhuan.xchat_android_library.utils.pref.CommonPref;

View File

@@ -0,0 +1,12 @@
package com.yizhuan.xchat_android_library.common.application;
import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
public interface IAppLifeCycle {
void init(Application application);
}

View File

@@ -1,7 +1,7 @@
package com.yizhuan.erban.common.delegate package com.yizhuan.xchat_android_library.common.delegate
import com.yizhuan.erban.application.XChatApplication import com.yizhuan.xchat_android_library.common.application.BaseApp
import com.yizhuan.erban.common.util.SPUtils import com.yizhuan.xchat_android_library.common.util.SPUtils
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
@@ -21,7 +21,7 @@ class SpDelegate<T>(private val key: String, private val default: T) : ReadWrite
is Double -> SPUtils.getDouble(key, default) is Double -> SPUtils.getDouble(key, default)
is ByteArray -> SPUtils.getBytes(key, default) is ByteArray -> SPUtils.getBytes(key, default)
else -> { else -> {
if (XChatApplication.isDebug()) { if (BaseApp.isDebug()) {
throw IllegalArgumentException("SpDelegate: this type is no supported") throw IllegalArgumentException("SpDelegate: this type is no supported")
} else { } else {
null null
@@ -41,7 +41,7 @@ class SpDelegate<T>(private val key: String, private val default: T) : ReadWrite
is Double -> SPUtils.putDouble(key, value) is Double -> SPUtils.putDouble(key, value)
is ByteArray -> SPUtils.putBytes(key, value) is ByteArray -> SPUtils.putBytes(key, value)
else -> { else -> {
if (XChatApplication.isDebug()) { if (BaseApp.isDebug()) {
throw IllegalArgumentException("SpDelegate: this type is no supported") throw IllegalArgumentException("SpDelegate: this type is no supported")
} }
} }

View File

@@ -1,13 +1,13 @@
package com.yizhuan.erban.common.file; package com.yizhuan.xchat_android_library.common.file;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.os.Environment; import android.os.Environment;
import android.text.TextUtils; import android.text.TextUtils;
import com.yizhuan.erban.application.XChatApplication; import com.qiniu.android.utils.StringUtils;
import com.yizhuan.erban.common.util.StringUtils; import com.yizhuan.xchat_android_library.common.application.BaseApp;
import com.yizhuan.xchat_android_core.utils.Logger; import com.yizhuan.xchat_android_library.common.util.Logger;
import com.yizhuan.xchat_android_library.utils.FP; import com.yizhuan.xchat_android_library.utils.FP;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
@@ -66,7 +66,7 @@ public class FileHelper {
return rootCacheDir; return rootCacheDir;
} }
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = XChatApplication.gContext.getExternalCacheDir(); File file = BaseApp.getContext().getExternalCacheDir();
if (file != null) { if (file != null) {
createNoMediaFile(file); createNoMediaFile(file);
//因为频繁调用getExternalCacheDir方法会在某些机器上面出现ANR所以这里降低频率调用 //因为频繁调用getExternalCacheDir方法会在某些机器上面出现ANR所以这里降低频率调用
@@ -74,7 +74,7 @@ public class FileHelper {
return file; return file;
} }
} }
File file = XChatApplication.gContext.getCacheDir(); File file = BaseApp.getContext().getCacheDir();
createNoMediaFile(file); createNoMediaFile(file);
//因为频繁调用getExternalCacheDir方法会在某些机器上面出现ANR所以这里降低频率调用 //因为频繁调用getExternalCacheDir方法会在某些机器上面出现ANR所以这里降低频率调用
rootCacheDir = file; rootCacheDir = file;
@@ -114,7 +114,7 @@ public class FileHelper {
} }
} }
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = XChatApplication.gContext.getExternalFilesDir(dirName); File file = BaseApp.getContext().getExternalFilesDir(dirName);
if (file != null) { if (file != null) {
createNoMediaFile(file); createNoMediaFile(file);
//因为频繁调用getExternalFilesDir方法会在某些机器上面出现ANR所以这里降低频率调用 //因为频繁调用getExternalFilesDir方法会在某些机器上面出现ANR所以这里降低频率调用
@@ -126,7 +126,7 @@ public class FileHelper {
return file; return file;
} }
} }
File file = XChatApplication.gContext.getFilesDir(); File file = BaseApp.getContext().getFilesDir();
createNoMediaFile(file); createNoMediaFile(file);
//因为频繁调用getExternalFilesDir方法会在某些机器上面出现ANR所以这里降低频率调用 //因为频繁调用getExternalFilesDir方法会在某些机器上面出现ANR所以这里降低频率调用
rootFileDirMap.put("empty", file); rootFileDirMap.put("empty", file);
@@ -623,7 +623,7 @@ public class FileHelper {
public static String getStringFromAssets(String fileName) { public static String getStringFromAssets(String fileName) {
String result = ""; String result = "";
try { try {
InputStream is = XChatApplication.gContext.getAssets().open(fileName); InputStream is = BaseApp.getContext().getAssets().open(fileName);
int length = is.available(); int length = is.available();
byte[] buffer = new byte[length]; byte[] buffer = new byte[length];
is.read(buffer); is.read(buffer);
@@ -654,7 +654,7 @@ public class FileHelper {
return false; return false;
} }
file.createNewFile(); file.createNewFile();
InputStream in = XChatApplication.gContext.getAssets().open(fileName); InputStream in = BaseApp.getContext().getAssets().open(fileName);
OutputStream out = new FileOutputStream(file); OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[4096]; byte[] buffer = new byte[4096];
int n; int n;
@@ -793,7 +793,7 @@ public class FileHelper {
if (!FileHelper.ensureDirExists(file.getParentFile().getAbsolutePath())) { if (!FileHelper.ensureDirExists(file.getParentFile().getAbsolutePath())) {
return false; return false;
} }
InputStream stream = XChatApplication.gContext.getContentResolver().openInputStream(uri); InputStream stream = BaseApp.getContext().getContentResolver().openInputStream(uri);
if (stream != null) { if (stream != null) {
file.createNewFile(); file.createNewFile();
OutputStream out = new FileOutputStream(file); OutputStream out = new FileOutputStream(file);

View File

@@ -1,4 +1,4 @@
package com.yizhuan.erban.common.glide; package com.yizhuan.xchat_android_library.common.glide;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;

View File

@@ -1,4 +1,4 @@
package com.yizhuan.erban.common.glide package com.yizhuan.xchat_android_library.common.glide
import android.app.Activity import android.app.Activity
import android.app.Application import android.app.Application
@@ -27,11 +27,11 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.DrawableImageViewTarget import com.bumptech.glide.request.target.DrawableImageViewTarget
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
import com.yizhuan.erban.common.transform.AssignScaleTransformation import com.yizhuan.xchat_android_library.common.transform.AssignScaleTransformation
import com.yizhuan.erban.common.transform.ComplexTransformation import com.yizhuan.xchat_android_library.common.transform.ComplexTransformation
import com.yizhuan.xchat_android_library.common.util.ActivityHelper import com.yizhuan.xchat_android_library.common.util.ActivityHelper
import com.yizhuan.erban.common.util.Utils import com.yizhuan.xchat_android_library.common.util.Logger
import com.yizhuan.xchat_android_core.utils.Logger import com.yizhuan.xchat_android_library.common.util.Utils
import jp.wasabeef.glide.transformations.RoundedCornersTransformation import jp.wasabeef.glide.transformations.RoundedCornersTransformation
import java.io.File import java.io.File

View File

@@ -0,0 +1,226 @@
package com.yizhuan.xchat_android_library.common.photo
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Environment
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.yizhuan.xchat_android_library.common.application.BaseApp
import com.yizhuan.xchat_android_library.common.delegate.SpDelegate
import com.yizhuan.xchat_android_library.common.file.FileHelper
import com.yizhuan.xchat_android_library.common.glide.GlideEngine
import com.yizhuan.xchat_android_library.common.util.Logger
import com.yizhuan.xchat_android_library.easyphoto.EasyPhotos
import com.yizhuan.xchat_android_library.easyphoto.constant.Type.*
import com.yizhuan.xchat_android_library.easyphoto.models.album.entity.Photo
import com.yizhuan.xchat_android_library.utils.TimeUtils
import com.yizhuan.xchat_android_library.utils.TimeUtils.TIME_FORMAT
import kotlinx.coroutines.*
import java.io.File
/**
* Created by wushaocheng on 2022/11/15
* Desc图片选择二次封装
*/
object PhotoProvider {
private const val TAG = "PhotoProvider"
//上一次选择的时间,避免用户连续进入选择图片页导致删除缓存
private var mLastSelectTime: Long by SpDelegate("PhotoProvider_last_select_time", 0L)
/**
* easyPhoto库选择文件copy到内部的目录名
*/
private const val FOLD_EASY_PHOTO_INTERNAL = "selectPhotoTemp"
private var mPhotoJob: Job? = null
@JvmStatic
@JvmOverloads
fun photoCamera(fragment: Fragment, resultCode: Int, isClearCache: Boolean = true) {
cancelJop()
mPhotoJob = MainScope().launch {
if (isClearCache && isClearByTime()) {
withContext(Dispatchers.IO) { clearCache() }
}
EasyPhotos.createCamera(fragment, false)//参数说明:上下文,是否使用宽高数据false时宽高数据为0扫描速度更快
.setFileProviderAuthority("${BaseApp.getApplication().packageName}.fileprovider")//参数说明:见下方`FileProvider的配置`
.start(resultCode)
}
}
/**
* 喵圈发布动态专用去掉bmp格式的图片
*/
@JvmStatic
@JvmOverloads
fun photoProviderPublish(activity: Activity, maxSelect: Int = 1, canChooseGif: Boolean = false, resultCode: Int, isClearCache: Boolean = true) {
cancelJop()
mPhotoJob = MainScope().launch {
if (isClearCache && isClearByTime()) {
withContext(Dispatchers.IO) { clearCache() }
}
EasyPhotos.createAlbum(activity, false, false, GlideEngine())//参数说明上下文是否显示相机按钮是否使用宽高数据false时宽高数据为0扫描速度更快[配置Glide为图片加载引擎](https://github.com/HuanTanSheng/EasyPhotos/wiki/12-%E9%85%8D%E7%BD%AEImageEngine%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93)
.setCount(maxSelect)//参数说明最大可选数默认1
.setGif(canChooseGif)
.filter(JPEG, JPG, PNG, WEBP)
.setPuzzleMenu(false)
.setCleanMenu(false)
.start(resultCode)
}
}
@JvmStatic
@JvmOverloads
fun videoProvider(activity: Activity, maxSelect: Int = 1, resultCode: Int, isClearCache: Boolean = true) {
cancelJop()
mPhotoJob = MainScope().launch {
if (isClearCache && isClearByTime()) {
withContext(Dispatchers.IO) { clearCache() }
}
EasyPhotos.createAlbum(activity, false, false, GlideEngine())
.setCount(maxSelect)//参数说明最大可选数默认1
.setPuzzleMenu(false)
.onlyVideo()
.setCleanMenu(false)
.start(resultCode)
}
}
@JvmStatic
@JvmOverloads
fun photoProvider(activity: Activity, maxSelect: Int = 1, canChooseGif: Boolean = false, resultCode: Int, isClearCache: Boolean = true) {
cancelJop()
mPhotoJob = MainScope().launch {
if (isClearCache && isClearByTime()) {
withContext(Dispatchers.IO) { clearCache() }
}
EasyPhotos.createAlbum(activity, false, false, GlideEngine())//参数说明上下文是否显示相机按钮是否使用宽高数据false时宽高数据为0扫描速度更快[配置Glide为图片加载引擎](https://github.com/HuanTanSheng/EasyPhotos/wiki/12-%E9%85%8D%E7%BD%AEImageEngine%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93)
.setCount(maxSelect)//参数说明最大可选数默认1
.setGif(canChooseGif)
.setPuzzleMenu(false)
.setCleanMenu(false)
.start(resultCode)
}
}
@JvmStatic
@JvmOverloads
fun photoProvider(activity: FragmentActivity, maxSelect: Int = 1, canChooseGif: Boolean = false, resultCode: Int, isClearCache: Boolean = true) {
cancelJop()
mPhotoJob = MainScope().launch {
if (isClearCache && isClearByTime()) {
withContext(Dispatchers.IO) { clearCache() }
}
EasyPhotos.createAlbum(activity, false, false, GlideEngine())//参数说明上下文是否显示相机按钮是否使用宽高数据false时宽高数据为0扫描速度更快[配置Glide为图片加载引擎](https://github.com/HuanTanSheng/EasyPhotos/wiki/12-%E9%85%8D%E7%BD%AEImageEngine%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93)
.setCount(maxSelect)//参数说明最大可选数默认1
.setGif(canChooseGif)
.setPuzzleMenu(false)
.setCleanMenu(false)
.start(resultCode)
}
}
@JvmStatic
@JvmOverloads
fun photoProvider(fragment: Fragment, maxSelect: Int = 1, canChooseGif: Boolean = false, resultCode: Int, isClearCache: Boolean = true, minFileSize: Long = 0L) {
cancelJop()
mPhotoJob = MainScope().launch {
if (isClearCache && isClearByTime()) {
withContext(Dispatchers.IO) { clearCache() }
}
EasyPhotos.createAlbum(fragment, false, false, GlideEngine())//参数说明上下文是否显示相机按钮是否使用宽高数据false时宽高数据为0扫描速度更快[配置Glide为图片加载引擎](https://github.com/HuanTanSheng/EasyPhotos/wiki/12-%E9%85%8D%E7%BD%AEImageEngine%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93)
.setCount(maxSelect)//参数说明最大可选数默认1
.setGif(canChooseGif)
.setMinFileSize(minFileSize)
.setPuzzleMenu(false)
.setCleanMenu(false)
.start(resultCode)
}
}
@JvmStatic
fun getResultUriList(data: Intent?): List<Uri>? {
val list: List<Photo>? = data?.getParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS)
return list?.takeIf { it.isNotEmpty() }?.map { it.uri }
}
@JvmStatic
fun getResultPhotoList(data: Intent?): List<Photo>? {
return data?.getParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS)
}
@JvmStatic
fun getResultPathListAsync(data: Intent?, resultListener: ((List<String>?) -> Unit)) {
cancelJop()
mPhotoJob = MainScope().launch {
val list: List<Photo>? = data?.getParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS)
val result = withContext(Dispatchers.IO) { copyToInternalCache(list) }
resultListener.invoke(result)
}
}
/**
* 外部的文件复制到项目目录下,再获取对应路径
* 修改方案原因:
* 1. android Q 外部文件path变更为类似这种结构/external/images/media/{文件id}导致无法通过path读取文件信息文件名字及格式
* 2. android Q 支持Uri获取文件但uri获取不到文件类型及不少自身或者sdk的函数从参数需要用到path
* 3. 原本项目功能逻辑很多用到了path(包括不仅仅文件大小,文件类型,作为参数传给其他函数使用(比如BitmapFactory.decodeFile))直接全局替换为Uri,影响面过大直接copy一份到自己内部返回内部的路径使得外部调用无感知
*
* 发现几个重点问题:
* 1. 项目使用到BitmapFactory.decodeFile(imgPath, options)之类的方法该方法在android Q直接使用外部path测试中发现获取图片信息失败
*
*/
private fun copyToInternalCache(photos: List<Photo>?): List<String>? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val foldPath = getInternalPath() + File.separator
val newPaths = ArrayList<String>()
photos?.forEach {
if (it.uri != null && !it.name.isNullOrEmpty()) {
val path = "$foldPath${it.name}"
if (FileHelper.copyFileFromUri(it.uri, path, true)) {
newPaths.add(path)
Logger.debug(TAG, "path: ${it.path} , displayName: ${it.name} , newPath: $path ")
}
}
}
newPaths
} else {
photos?.takeIf { it.isNotEmpty() }?.map { it.path }
}
}
/**
* 清除复制缓存
*/
fun clearCache() {
Logger.debug(
TAG, "clearCache => mLastSelectTime: ${TimeUtils.getDateTimeString(
mLastSelectTime, TIME_FORMAT)}")
FileHelper.removeAllFile(getInternalPath() + File.separator)
}
/**
* 检查时间,判断是否要删除缓冲
*/
private fun isClearByTime(): Boolean {
val currentTime = System.currentTimeMillis()
val isClear = currentTime - mLastSelectTime > 10 * 60 * 1000
mLastSelectTime = currentTime
return isClear
}
private fun cancelJop() {
if (mPhotoJob?.isActive == true) {
mPhotoJob?.cancel()
}
}
/**
* easyPhoto内部复制缓存的路径
*/
private fun getInternalPath(): String {
return ("${FileHelper.getRootFilesDir(Environment.DIRECTORY_PICTURES).absolutePath}${File.separator}$FOLD_EASY_PHOTO_INTERNAL")
}
}

View File

@@ -1,4 +1,4 @@
package com.yizhuan.erban.common.transform package com.yizhuan.xchat_android_library.common.transform
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas

View File

@@ -1,4 +1,4 @@
package com.yizhuan.erban.common.transform; package com.yizhuan.xchat_android_library.common.transform;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapShader; import android.graphics.BitmapShader;

View File

@@ -1,4 +1,4 @@
package com.yizhuan.erban.common.util; package com.yizhuan.xchat_android_library.common.util;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;

View File

@@ -1,8 +1,8 @@
package com.yizhuan.erban.common.util; package com.yizhuan.xchat_android_library.common.util;
import android.os.Parcelable; import android.os.Parcelable;
import com.yizhuan.erban.application.XChatApplication; import com.yizhuan.xchat_android_library.common.application.BaseApp;
import com.yizhuan.xchat_android_library.utils.TimeUtils; import com.yizhuan.xchat_android_library.utils.TimeUtils;
import java.util.Date; import java.util.Date;
@@ -15,7 +15,7 @@ import java.util.Set;
*/ */
public class SPUtils { public class SPUtils {
private static Config sConfig = Config.getInstance(XChatApplication.gContext); private static Config sConfig = Config.getInstance(BaseApp.getContext());
public static void putBytes(String key, byte[] bytes) { public static void putBytes(String key, byte[] bytes) {
sConfig.putBytes(key, bytes); sConfig.putBytes(key, bytes);

View File

@@ -1,4 +1,7 @@
<resources> <resources>
<string name="text_bitmap_too_large">上傳失敗,圖片太大啦~</string> <string name="text_bitmap_too_large">上傳失敗,圖片太大啦~</string>
<string name="text_bitmap_too_small">上傳圖片不能小於20kb</string> <string name="text_bitmap_too_small">上傳圖片不能小於20kb</string>
<string name="yizhuan_xchat_android_core_env_01">請輸入正確的環境</string>
<string name="yizhuan_xchat_android_core_env_02">請輸入正確的環境</string>
<string name="yizhuan_xchat_android_core_env_03">請先初始化環境</string>
</resources> </resources>

View File

@@ -14,7 +14,7 @@ import java.io.File;
/** /**
* Created by hzxuwen on 2015/6/12. * Created by hzxuwen on 2015/6/12.
*/ */
public class ImageAction extends PickImageAction { public class ImageAction extends PickImageActionNew{
public ImageAction() { public ImageAction() {
super(R.drawable.chat_icon_photo, R.string.input_panel_photo, true); super(R.drawable.chat_icon_photo, R.string.input_panel_photo, true);
@@ -32,5 +32,6 @@ public class ImageAction extends PickImageAction {
EventBus.getDefault().post(new ActiveEvent()); EventBus.getDefault().post(new ActiveEvent());
} }
} }

View File

@@ -44,8 +44,6 @@ public abstract class PickImageAction extends BaseAction {
public void onClick() { public void onClick() {
int requestCode = makeRequestCode(RequestCode.PICK_IMAGE); int requestCode = makeRequestCode(RequestCode.PICK_IMAGE);
showSelector(getTitleId(), requestCode, multiSelect, tempFile()); showSelector(getTitleId(), requestCode, multiSelect, tempFile());
} }
private String tempFile() { private String tempFile() {
@@ -111,7 +109,6 @@ public abstract class PickImageAction extends BaseAction {
private boolean handleImagePath(Intent intent, Intent data) { private boolean handleImagePath(Intent intent, Intent data) {
String photoPath = data.getStringExtra(Extras.EXTRA_FILE_PATH); String photoPath = data.getStringExtra(Extras.EXTRA_FILE_PATH);
if (TextUtils.isEmpty(photoPath)) { if (TextUtils.isEmpty(photoPath)) {
// Toast.makeText(getActivity(), R.string.picker_image_error, Toast.LENGTH_LONG).show();
SingleToastUtil.showToastShort(R.string.picker_image_error); SingleToastUtil.showToastShort(R.string.picker_image_error);
return false; return false;
} }

View File

@@ -0,0 +1,99 @@
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.constant.Extras
import com.netease.nim.uikit.business.session.constant.RequestCode
import com.netease.nim.uikit.business.session.helper.SendImageHelper
import com.yizhuan.xchat_android_library.easypermisssion.EasyPermissions
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import java.io.File
/**
* Created by zhoujianghua on 2015/7/31.
*/
abstract class PickImageActionNew protected constructor(
iconResId: Int,
titleId: Int,
private val multiSelect: Boolean
) : BaseAction(iconResId, titleId), EasyPermissions.PermissionCallbacks {
companion object{
private const val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择
}
protected abstract fun onPicked(file: File)
override fun onClick() {
checkStoragePermission()
}
private fun 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,
// resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
// )
// }
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
}
override fun onPermissionsGranted(requestCode: Int, perms: List<String>) {
}
override fun onPermissionsDenied(requestCode: Int, perms: List<String>) {
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
when (requestCode) {
RequestCode.PICK_IMAGE -> onPickImageActivityResult(requestCode, data)
}
}
/**
* 图片选取回调
*/
private fun onPickImageActivityResult(requestCode: Int, data: Intent?) {
if (data == null) {
SingleToastUtil.showToastShort(R.string.picker_image_error)
return
}
val local = data.getBooleanExtra(Extras.EXTRA_FROM_LOCAL, false)
if (local) {
// 本地相册
sendImageAfterSelfImagePicker(data)
}
}
/**
* 发送图片
*/
private fun sendImageAfterSelfImagePicker(data: Intent) {
SendImageHelper.sendImageAfterSelfImagePicker(activity, data) { file, isOrig ->
onPicked(
file
)
}
}
}