Skip to content

Commit 7f42b53

Browse files
author
teach
committed
同步主分支的修改
1 parent d5b989c commit 7f42b53

File tree

6 files changed

+84
-59
lines changed

6 files changed

+84
-59
lines changed

imageselector/src/main/AndroidManifest.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.donkingliang.imageselector">
33

4-
<application
5-
android:label="@string/app_name">
4+
<application>
65
<provider
76
android:name="com.donkingliang.imageselector.provider.ImageSelectorProvider"
87
android:authorities="${applicationId}.imageSelectorProvider"

imageselector/src/main/java/com/donkingliang/imageselector/ImageSelectorActivity.java

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.donkingliang.imageselector.model.ImageModel;
4545
import com.donkingliang.imageselector.utils.DateUtils;
4646
import com.donkingliang.imageselector.utils.ImageSelector;
47+
import com.donkingliang.imageselector.utils.ImageUtil;
4748
import com.donkingliang.imageselector.utils.UriUtils;
4849
import com.donkingliang.imageselector.utils.VersionUtils;
4950

@@ -79,6 +80,7 @@ public class ImageSelectorActivity extends AppCompatActivity {
7980
private static final int CAMERA_REQUEST_CODE = 0x00000010;
8081
private Uri mCameraUri;
8182
private String mCameraImagePath;
83+
private long mTakeTime;
8284

8385
private boolean isOpenFolder;
8486
private boolean isShowTime;
@@ -451,41 +453,6 @@ private void saveImageAndFinish(final ArrayList<String> images, final boolean is
451453
//点击确定,把选中的图片通过Intent传给上一个Activity。
452454
setResult(images, isCameraImage);
453455
finish();
454-
455-
// if (!VersionUtils.isAndroidQ() || images.isEmpty()) {
456-
// //点击确定,把选中的图片通过Intent传给上一个Activity。
457-
// setResult(images, isCameraImage);
458-
// finish();
459-
// }
460-
//
461-
// // 适配android 10,先把图片拷贝到app私有目录
462-
// new Thread(new Runnable() {
463-
// @Override
464-
// public void run() {
465-
// final ArrayList<String> newImages = new ArrayList<>();
466-
// Context context = ImageSelectorActivity.this;
467-
// String dir = ImageUtil.getImageCacheDir(context);
468-
// for (String image : images) {
469-
// String md5 = MD5Utils.md5(image);
470-
// if (md5 != null) {
471-
// Bitmap bitmap = ImageUtil.getBitmapFromUri(context, UriUtils.getImageContentUri(context, image), null);
472-
// if (bitmap != null) {
473-
// String newImage = ImageUtil.saveImage(bitmap, dir, md5);
474-
// if (!StringUtils.isEmptyString(newImage)) {
475-
// newImages.add(newImage);
476-
// }
477-
// }
478-
// }
479-
// }
480-
// runOnUiThread(new Runnable() {
481-
// @Override
482-
// public void run() {
483-
// setResult(newImages, isCameraImage);
484-
// finish();
485-
// }
486-
// });
487-
// }
488-
// }).start();
489456
}
490457

491458
private void setResult(ArrayList<String> images, boolean isCameraImage) {
@@ -537,13 +504,15 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
537504
} else if (requestCode == CAMERA_REQUEST_CODE) {
538505
if (resultCode == RESULT_OK) {
539506
ArrayList<String> images = new ArrayList<>();
507+
Uri savePictureUri = null;
540508
if (VersionUtils.isAndroidQ()) {
541-
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mCameraUri));
509+
savePictureUri = mCameraUri;
542510
images.add(UriUtils.getPathForUri(this, mCameraUri));
543511
} else {
544-
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(mCameraImagePath))));
512+
savePictureUri = Uri.fromFile(new File(mCameraImagePath));
545513
images.add(mCameraImagePath);
546514
}
515+
ImageUtil.savePicture(this,savePictureUri,mTakeTime);
547516
saveImageAndFinish(images, true);
548517
} else {
549518
if (onlyTakePhoto) {
@@ -732,6 +701,7 @@ private void openCamera() {
732701
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
733702
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
734703
startActivityForResult(captureIntent, CAMERA_REQUEST_CODE);
704+
mTakeTime = System.currentTimeMillis();
735705
}
736706
}
737707
}

imageselector/src/main/java/com/donkingliang/imageselector/model/ImageModel.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import com.donkingliang.imageselector.utils.ImageUtil;
1717
import com.donkingliang.imageselector.utils.StringUtils;
1818
import com.donkingliang.imageselector.utils.UriUtils;
19-
import com.donkingliang.imageselector.utils.VersionUtils;
2019

2120
import java.io.File;
2221
import java.util.ArrayList;
@@ -102,7 +101,6 @@ private static void loadImageForSDCard(final Context context, final boolean isPr
102101
@Override
103102
public void run() {
104103
synchronized (ImageModel.class) {
105-
boolean isAndroidQ = VersionUtils.isAndroidQ();
106104
String imageCacheDir = ImageUtil.getImageCacheDir(context);
107105
ArrayList<Folder> folders = null;
108106
if (cacheImageList == null || isPreload) {
@@ -122,12 +120,11 @@ public int compare(Image image, Image t1) {
122120
ArrayList<Image> images = new ArrayList<>();
123121

124122
for (Image image : imageList) {
125-
//过滤未下载完成或者不存在的文件
126-
boolean isEffective = isAndroidQ ? true // 由于在Android Q用uri判断图片是否有效的方法耗时,所以去掉判断。
127-
: ImageUtil.isEffective(image.getPath());
123+
// 过滤不存在或未下载完成的图片
124+
boolean exists = !"downloading".equals(getExtensionName(image.getPath())) && checkImgExists(image.getPath());
128125
//过滤剪切保存的图片;
129126
boolean isCutImage = ImageUtil.isCutImage(imageCacheDir, image.getPath());
130-
if (isEffective && !isCutImage) {
127+
if (!isCutImage && exists) {
131128
images.add(image);
132129
}
133130
}
@@ -165,10 +162,11 @@ private static synchronized ArrayList<Image> loadImage(Context context) {
165162
MediaStore.Images.Media.DISPLAY_NAME,
166163
MediaStore.Images.Media.DATE_ADDED,
167164
MediaStore.Images.Media._ID,
168-
MediaStore.Images.Media.MIME_TYPE},
165+
MediaStore.Images.Media.MIME_TYPE,
166+
MediaStore.Images.Media.SIZE},
167+
MediaStore.MediaColumns.SIZE + ">0",
169168
null,
170-
null,
171-
MediaStore.Images.Media.DATE_ADDED);
169+
MediaStore.Images.Media.DATE_ADDED + " DESC");
172170

173171
ArrayList<Image> images = new ArrayList<>();
174172

imageselector/src/main/java/com/donkingliang/imageselector/utils/ImageUtil.java

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
package com.donkingliang.imageselector.utils;
22

33
import android.annotation.SuppressLint;
4+
import android.content.ContentResolver;
45
import android.content.Context;
6+
import android.content.Intent;
7+
import android.database.Cursor;
58
import android.graphics.Bitmap;
69
import android.graphics.BitmapFactory;
710
import android.graphics.Matrix;
811
import android.media.ExifInterface;
912
import android.net.Uri;
1013
import android.os.Environment;
1114
import android.os.ParcelFileDescriptor;
12-
import android.text.format.DateFormat;
15+
import android.provider.MediaStore;
1316
import android.util.Log;
1417

1518
import java.io.File;
1619
import java.io.FileDescriptor;
1720
import java.io.FileNotFoundException;
1821
import java.io.FileOutputStream;
1922
import java.io.IOException;
23+
import java.sql.Time;
24+
import java.text.SimpleDateFormat;
25+
import java.util.Date;
2026

2127
public class ImageUtil {
2228

@@ -27,19 +33,20 @@ public class ImageUtil {
2733
* @return
2834
*/
2935
public static String getImageCacheDir(Context context) {
30-
String cachePath;
36+
File file = null;
3137
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
3238
|| !Environment.isExternalStorageRemovable()) {
33-
// context.getFilesDir().getPath(); 不这样写 有些机型会报错
3439
if (VersionUtils.isAndroidQ()) {
35-
cachePath = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath();
40+
file = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
3641
} else {
37-
cachePath = context.getExternalCacheDir().getPath();
42+
file = context.getExternalCacheDir();
3843
}
39-
} else {
40-
cachePath = context.getCacheDir().getPath();
4144
}
42-
return cachePath + File.separator + "image_select";
45+
46+
if (file == null) {
47+
file = context.getCacheDir();
48+
}
49+
return file.getPath() + File.separator + "image_select";
4350
}
4451

4552
/**
@@ -280,16 +287,18 @@ public static boolean isEffective(Context context, Uri uri) {
280287

281288
/**
282289
* 是否是剪切返回的图片
290+
*
283291
* @param context
284292
* @param path
285293
* @return
286294
*/
287295
public static boolean isCutImage(Context context, String path) {
288-
return isCutImage(getImageCacheDir(context),path);
296+
return isCutImage(getImageCacheDir(context), path);
289297
}
290298

291299
/**
292300
* 是否是剪切返回的图片
301+
*
293302
* @param dir
294303
* @param path
295304
* @return
@@ -300,4 +309,55 @@ public static boolean isCutImage(String dir, String path) {
300309
}
301310
return false;
302311
}
312+
313+
/**
314+
* 保存拍照的图片
315+
*
316+
* @param context
317+
* @param uri
318+
* @param takeTime 调起相机拍照的时间
319+
*/
320+
public static void savePicture(final Context context, final Uri uri, final long takeTime) {
321+
new Thread(new Runnable() {
322+
@Override
323+
public void run() {
324+
if (isNeedSavePicture(context, takeTime)) {
325+
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
326+
}
327+
}
328+
}).start();
329+
}
330+
331+
/**
332+
* 是否需要保存拍照的图片
333+
*
334+
* @param context
335+
* @return
336+
*/
337+
private static boolean isNeedSavePicture(Context context, long takeTime) {
338+
//扫描图片
339+
Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
340+
ContentResolver mContentResolver = context.getContentResolver();
341+
Cursor mCursor = mContentResolver.query(mImageUri, new String[]{
342+
MediaStore.Images.Media.DATE_ADDED,
343+
MediaStore.Images.Media._ID,
344+
MediaStore.Images.Media.SIZE},
345+
MediaStore.MediaColumns.SIZE + ">0",
346+
null,
347+
MediaStore.Files.FileColumns._ID + " DESC limit 1 offset 0");
348+
349+
//读取扫描到的图片
350+
if (mCursor != null && mCursor.getCount() > 0 && mCursor.moveToFirst()) {
351+
//获取图片时间
352+
long time = mCursor.getLong(mCursor.getColumnIndex(MediaStore.Images.Media.DATE_ADDED));
353+
int id = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Images.Media._ID));
354+
if (String.valueOf(time).length() < 13) {
355+
time *= 1000;
356+
}
357+
mCursor.close();
358+
// 如果照片的插入时间大于相机的拍照时间,就认为是拍照图片已插入
359+
return time + 1000 < takeTime;
360+
}
361+
return true;
362+
}
303363
}

imageselector/src/main/res/values-en/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<resources>
2-
<string name="app_name">imageselector</string>
32
<string name="selector_image">Photos</string>
43
<string name="selector_send">Send</string>
54
<string name="selector_preview">Preview</string>

imageselector/src/main/res/values/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<resources>
2-
<string name="app_name">imageselector</string>
32
<string name="selector_image">图片</string>
43
<string name="selector_send">确定</string>
54
<string name="selector_preview">预览</string>

0 commit comments

Comments
 (0)