diff --git a/README.md b/README.md index 66c1feae..c7e79da5 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ allprojects { ```gradle dependencies { - implementation 'com.github.HuanTanSheng:EasyPhotos:3.1.1' //androidx版本,支持android 10、11,永久维护 + implementation 'com.github.HuanTanSheng:EasyPhotos:3.1.2' //androidx版本,支持android 10、11,永久维护 //implementation 'com.github.HuanTanSheng:EasyPhotos:2.4.5' //还没有升级到androidx的同学可以用这个版本,但不支持android 10,暂停维护   @@ -151,16 +151,20 @@ QQ交流群:[288600953](https://jq.qq.com/?_wv=1027&k=5QGgCDe) ## 更新日志 +**3.1.2:** +- 优化:线程安全 +- 优化:防止用户在外部多次点击重复打开相册页 + **3.1.1:** -- 修复:在Q平台直接调用相机时的空指针问题。 +- 修复:在Q平台直接调用相机时的空指针问题 **3.1.0:** - 适配:android 11 - 重要:createAlbum方法新增useWidth参数 - 意义:是否需要使用图片的宽高数据。 - true:会保证宽高数据的正确性,耗时,扫描图片慢。 - false:不需要,宽高数据返回为0。 - 特别声明:如果使用到宽高限制,则useWidth会强制为true。 + 意义:是否需要使用图片的宽高数据 + true:会保证宽高数据的正确性,耗时,扫描图片慢 + false:不需要,宽高数据返回为0 + 特别声明:如果使用到宽高限制,则useWidth会强制为true - 重要:新增API:preLoad(Context cxt),预加载,不调用该方法也不影响程序使用。单类型选择建议不调用该方法,某些机型第一次扫描多类型文件可能会慢,可以在app主页面或调用EasyPhotos的上一页做一次预加载,若未授权读取权限该功能失效但不影响程序使用。 - 重要:start的链式回调模式,增加onCancel状态回调 - 重要:EasyPhotos.addWatermark方法,新增返回Bitmap(既加水印后的Bitmap),新增orientation参数,int类型,Bitmap的旋转角度。当useWidth为true时,Photo实体类中会有orientation,若bitmap不是用户手机内图片,填0即可。 diff --git a/demo/release/demo-release.apk b/demo/release/demo-release.apk index 23f5823e..4ed37353 100644 Binary files a/demo/release/demo-release.apk and b/demo/release/demo-release.apk differ diff --git a/easyPhotos/src/main/java/com/huantansheng/easyphotos/EasyPhotos.java b/easyPhotos/src/main/java/com/huantansheng/easyphotos/EasyPhotos.java index cd336e2a..ef9fd8cd 100644 --- a/easyPhotos/src/main/java/com/huantansheng/easyphotos/EasyPhotos.java +++ b/easyPhotos/src/main/java/com/huantansheng/easyphotos/EasyPhotos.java @@ -40,7 +40,10 @@ public class EasyPhotos { /** * 预加载 - * 第一次扫描可能会慢,建议在启动app时做一次预加载 + * 调不调用该方法都可以,不调用不影响EasyPhotos正常使用 + * 第一次扫描媒体库可能会慢,调用预加载会使真正打开相册的速度加快 + * 若调用该方法,建议自行判断代码书写位置,建议在用户打开相册的3秒前调用,比如app主页面或调用相册的上一页 + * 该方法如果没有授权读取权限的话,是无效的,所以外部加不加权限控制都可以,加的话保证执行,不加也不影响程序正常使用 * * @param cxt 上下文 */ @@ -50,7 +53,10 @@ public static void preLoad(Context cxt) { /** * 预加载 - * 第一次扫描可能会慢,建议在启动app时做一次预加载 + * 调不调用该方法都可以,不调用不影响EasyPhotos正常使用 + * 第一次扫描媒体库可能会慢,调用预加载会使真正打开相册的速度加快 + * 若调用该方法,建议自行判断代码书写位置,建议在用户打开相册的3秒前调用,比如app主页面或调用相册的上一页 + * 该方法如果没有授权读取权限的话,是无效的,所以外部加不加权限控制都可以,加的话保证执行,不加也不影响程序正常使用 * * @param cxt 上下文 * @param callBack 预加载完成的回调,若进行UI操作,需自行切回主线程。 diff --git a/easyPhotos/src/main/java/com/huantansheng/easyphotos/models/album/AlbumModel.java b/easyPhotos/src/main/java/com/huantansheng/easyphotos/models/album/AlbumModel.java index 9166ea65..44771ddd 100644 --- a/easyPhotos/src/main/java/com/huantansheng/easyphotos/models/album/AlbumModel.java +++ b/easyPhotos/src/main/java/com/huantansheng/easyphotos/models/album/AlbumModel.java @@ -60,7 +60,7 @@ public static AlbumModel getInstance() { * @param context 调用查询方法的context * @param callBack 查询完成后的回调 */ - public boolean canRun = true; + public volatile boolean canRun = true; public void query(final Context context, final CallBack callBack) { if (PermissionChecker.checkSelfPermission(context, @@ -72,7 +72,6 @@ public void query(final Context context, final CallBack callBack) { new Thread(new Runnable() { @Override public void run() { - album.clear(); initAlbum(context); if (null != callBack) callBack.onAlbumWorkedCallBack(); } @@ -83,7 +82,9 @@ public void stopQuery() { canRun = false; } - private void initAlbum(Context context) { + private synchronized void initAlbum(Context context) { + album.clear(); +// long now = System.currentTimeMillis(); if (Setting.selectedPhotos.size() > Setting.count) { throw new RuntimeException("AlbumBuilder: 默认勾选的图片张数不能大于设置的选择数!" + "|默认勾选图片张数:" + Setting.selectedPhotos.size() + "|设置的选择数:" + Setting.count); } @@ -113,7 +114,6 @@ private void initAlbum(Context context) { ContentResolver contentResolver = context.getContentResolver(); - long now = System.currentTimeMillis(); List projectionList = new ArrayList(); projectionList.add(MediaStore.Files.FileColumns._ID); @@ -289,7 +289,7 @@ private void initAlbum(Context context) { } while (cursor.moveToNext() && canRun); cursor.close(); } - Log.d(TAG, "initAlbum: " + (System.currentTimeMillis() - now)); +// Log.d(TAG, "initAlbum: " + (System.currentTimeMillis() - now)); } /** diff --git a/easyPhotos/src/main/java/com/huantansheng/easyphotos/ui/EasyPhotosActivity.java b/easyPhotos/src/main/java/com/huantansheng/easyphotos/ui/EasyPhotosActivity.java index c5a17364..c9fc9dcd 100644 --- a/easyPhotos/src/main/java/com/huantansheng/easyphotos/ui/EasyPhotosActivity.java +++ b/easyPhotos/src/main/java/com/huantansheng/easyphotos/ui/EasyPhotosActivity.java @@ -110,17 +110,31 @@ public class EasyPhotosActivity extends AppCompatActivity implements AlbumItemsA private boolean isQ = false; + public static long startTime = 0; + + public static boolean doubleClick() { + long now = System.currentTimeMillis(); + if (now - startTime < 600) { + return true; + } + startTime = now; + return false; + } + public static void start(Activity activity, int requestCode) { + if (doubleClick()) return; Intent intent = new Intent(activity, EasyPhotosActivity.class); activity.startActivityForResult(intent, requestCode); } public static void start(Fragment fragment, int requestCode) { + if (doubleClick()) return; Intent intent = new Intent(fragment.getActivity(), EasyPhotosActivity.class); fragment.startActivityForResult(intent, requestCode); } public static void start(androidx.fragment.app.Fragment fragment, int requestCode) { + if (doubleClick()) return; Intent intent = new Intent(fragment.getContext(), EasyPhotosActivity.class); fragment.startActivityForResult(intent, requestCode); } @@ -596,7 +610,8 @@ public void run() { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(mTempImageFile.getAbsolutePath(), options); - MediaScannerConnectionUtils.refresh(EasyPhotosActivity.this, mTempImageFile);// 更新媒体库 + MediaScannerConnectionUtils.refresh(EasyPhotosActivity.this, mTempImageFile);// + // 更新媒体库 Uri uri = UriUtils.getUri(EasyPhotosActivity.this, mTempImageFile); int width = 0; @@ -621,10 +636,12 @@ public void run() { } } - final Photo photo = new Photo(mTempImageFile.getName(), uri, mTempImageFile.getAbsolutePath(), + final Photo photo = new Photo(mTempImageFile.getName(), uri, + mTempImageFile.getAbsolutePath(), mTempImageFile.lastModified() / 1000, width, height, orientation, mTempImageFile.length(), - DurationUtils.getDuration(mTempImageFile.getAbsolutePath()), options.outMimeType); + DurationUtils.getDuration(mTempImageFile.getAbsolutePath()), + options.outMimeType); runOnUiThread(new Runnable() { @Override @@ -637,7 +654,8 @@ public void run() { data.putParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS, resultList); - data.putExtra(EasyPhotos.RESULT_SELECTED_ORIGINAL, Setting.selectedOriginal); + data.putExtra(EasyPhotos.RESULT_SELECTED_ORIGINAL, + Setting.selectedOriginal); setResult(RESULT_OK, data); finish();