diff --git a/README.md b/README.md index 04900a2..7a8cb59 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ Android 照片选择器 ,支持单图、多图、视频、gif选择,内置 简书:[PhotoPicker](http://www.jianshu.com/p/a6b5831797d0) ### 各位读者来点Star支持一下吧 -==如使用请尽快更新到2.0.0版本+,本版本新增多个功能,修复旧版本已知问题== 参考项目: - https://github.com/donglua/PhotoPicker @@ -52,7 +51,10 @@ allprojects { **在APP目录下的build.gradle中添加依赖** ```java -implementation 'com.github.yudu233:PhotoPicker:2.0.3' +//support版本 +implementation 'com.github.yudu233:PhotoPicker:2.0.4' +//androidx版本 +implementation 'com.github.yudu233:PhotoPicker:3.0.0' ``` **AndroidManifest.xml 配置** @@ -101,7 +103,7 @@ new PhotoPickConfig > **pickMode(PhotoPickConfig.MODE_PICK_SINGLE)**
设置照片选择模式(单选、多选),默认为单选 - + > **maxPickSize(9)**
多选时可以选择的图片数量,当pickMode为多选时默认为9张,单选默认为1 @@ -116,17 +118,17 @@ new PhotoPickConfig > **showOriginal(true)**
是否显示原图按钮,默认显示,选中后若开启了图片压缩将不再压缩图片,返回原图 - + > **startCompression(true)**
是否启动图片压缩功能,默认开启(目前图片裁剪后没有再做压缩处理) - + > **selectedMimeType(List data)**
传入上一次选中的数据,用于判断下次进入是否可展示其他类型文件。如类似朋友圈,第一次选择了图片,此时数据类型为MimeType.TYPE_ALL,打开时将过滤视频文件。
**==注:如果没有多类型的文件限制,可以不加该api==** - + > **setCallback(new PhotoSelectCallback())**
回调方式1:setCallback();回调方式2:onActivityResult() - + ### 初始化 > 在Application中初始化: ``` @@ -145,8 +147,8 @@ new PhotoPickConfig //自定义主题颜色 同步APP options.photoPickThemeColor = R.color.colorAccent; return options; - } - + } + ``` ### 回调方式 @@ -158,7 +160,7 @@ new PhotoPickConfig .setCallback(new PhotoSelectCallback() { @Override public void selectResult(ArrayList photos) { - + }).build(); ``` #### 方式二: @@ -199,12 +201,20 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { [ucrop](https://github.com/Yalantis/uCrop) ## 更新日志 -# 当前版本:v2.0.3(紧急修复) -* 修复部分小米手机打开相册直接崩溃问题 +# 当前版本:v3.0.0 +* 支持AndroidX +* 修复已知的问题 +* 移除无效代码 # 历史版本 -### v2.0.3 +### v2.0.4 +* 新增文件夹有效性校验 +--- +### v2.0.3(紧急修复) +* 修复部分小米手机打开相册直接崩溃问题 +--- +### v2.0.2 * 优化裁剪时不显示其他类型文件(video、gif) * 优化选择gif时默认原图,非原图时不压缩 --- diff --git a/app/build.gradle b/app/build.gradle index 386c459..b982e30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,14 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.sdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { - applicationId "com.rain.photopicker" - minSdkVersion 15 - targetSdkVersion rootProject.ext.sdkVersion - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + minSdkVersion 19 + targetSdkVersion 28 + versionCode 23 + versionName "2.0.3" + multiDexEnabled true } buildTypes { release { @@ -18,16 +16,19 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "com.android.support:appcompat-v7:$supportLibVersion" - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.1' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + implementation project(':photopicker') + + implementation 'androidx.multidex:multidex:2.0.1' implementation 'com.github.bumptech.glide:glide:4.8.0' - implementation 'com.android.support:multidex:1.0.1' - //PhotoView - implementation project(':library') + implementation "com.github.chrisbanes:PhotoView:2.3.0" + implementation 'androidx.appcompat:appcompat:1.2.0' + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7e0c3c4..96d05f0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,11 +22,11 @@ diff --git a/app/src/main/java/com/rain/photopicker/MainActivity.java b/app/src/main/java/com/rain/photopicker/MainActivity.java index 44da8dc..43f7b6a 100644 --- a/app/src/main/java/com/rain/photopicker/MainActivity.java +++ b/app/src/main/java/com/rain/photopicker/MainActivity.java @@ -2,16 +2,16 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.TextView; -import com.rain.library.bean.MediaData; -import com.rain.library.controller.PhotoPickConfig; -import com.rain.library.impl.PhotoSelectCallback; -import com.rain.library.utils.MimeType; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.controller.PhotoPickConfig; import com.rain.photopicker.glide.GlideImageLoader; +import com.rain.photopicker.impl.PhotoSelectCallback; +import com.rain.photopicker.utils.MimeType; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/rain/photopicker/MyApplication.java b/app/src/main/java/com/rain/photopicker/MyApplication.java index 6fbaa25..c511a72 100644 --- a/app/src/main/java/com/rain/photopicker/MyApplication.java +++ b/app/src/main/java/com/rain/photopicker/MyApplication.java @@ -2,9 +2,9 @@ import android.app.Application; import android.content.Context; -import android.support.multidex.MultiDex; -import com.rain.library.PhotoPick; +import androidx.multidex.MultiDex; + /** * Describe: diff --git a/app/src/main/java/com/rain/photopicker/NineGridImageView/GridImageView.java b/app/src/main/java/com/rain/photopicker/NineGridImageView/GridImageView.java index 1b5235e..84d2b93 100644 --- a/app/src/main/java/com/rain/photopicker/NineGridImageView/GridImageView.java +++ b/app/src/main/java/com/rain/photopicker/NineGridImageView/GridImageView.java @@ -6,13 +6,12 @@ import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; -import android.widget.ImageView; /** * Descriptions :自定义ImageView * Created by Rain on 16-9-14. */ -public class GridImageView extends ImageView { +public class GridImageView extends androidx.appcompat.widget.AppCompatImageView { public GridImageView(Context context, AttributeSet attrs) { super(context, attrs); diff --git a/app/src/main/java/com/rain/photopicker/PhotoPickOptionsConfig.java b/app/src/main/java/com/rain/photopicker/PhotoPickOptionsConfig.java index e6d791f..a72217d 100644 --- a/app/src/main/java/com/rain/photopicker/PhotoPickOptionsConfig.java +++ b/app/src/main/java/com/rain/photopicker/PhotoPickOptionsConfig.java @@ -4,7 +4,6 @@ import android.os.Environment; import android.text.TextUtils; -import com.rain.library.PhotoPickOptions; import java.io.File; import java.io.IOException; @@ -23,7 +22,6 @@ public static PhotoPickOptions getPhotoPickOptions(Context context) { PhotoPickOptions options = new PhotoPickOptions(); options.filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "eWorld/"; options.imagePath = options.filePath + "cytx/"; - options.photoPickAuthority = context.getString(R.string.file_provider_authorities); options.photoPickThemeColor = R.color.colorAccent; return options; } diff --git a/app/src/main/java/com/rain/photopicker/Utils/ImageUtils.java b/app/src/main/java/com/rain/photopicker/Utils/ImageUtils.java index cd3cca4..72990e8 100644 --- a/app/src/main/java/com/rain/photopicker/Utils/ImageUtils.java +++ b/app/src/main/java/com/rain/photopicker/Utils/ImageUtils.java @@ -8,7 +8,8 @@ import android.os.Environment; import android.text.TextUtils; -import com.rain.library.utils.UtilsHelper; + +import com.rain.photopicker.utils.UtilsHelper; import java.io.File; import java.io.FileOutputStream; diff --git a/app/src/main/java/com/rain/photopicker/glide/GlideImageLoader.java b/app/src/main/java/com/rain/photopicker/glide/GlideImageLoader.java index 44df05c..571936a 100644 --- a/app/src/main/java/com/rain/photopicker/glide/GlideImageLoader.java +++ b/app/src/main/java/com/rain/photopicker/glide/GlideImageLoader.java @@ -9,8 +9,8 @@ import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import com.bumptech.glide.request.RequestOptions; -import com.rain.library.loader.ImageLoader; import com.rain.photopicker.R; +import com.rain.photopicker.loader.ImageLoader; /** * Describe :GlideImageLoader diff --git a/app/src/main/java/com/rain/photopicker/lookBigImage/ViewBigImageActivity.java b/app/src/main/java/com/rain/photopicker/lookBigImage/ViewBigImageActivity.java index 24a63b8..ec97a9e 100644 --- a/app/src/main/java/com/rain/photopicker/lookBigImage/ViewBigImageActivity.java +++ b/app/src/main/java/com/rain/photopicker/lookBigImage/ViewBigImageActivity.java @@ -4,11 +4,11 @@ import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentActivity; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v4.view.ViewPager.OnPageChangeListener; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; +import androidx.viewpager.widget.ViewPager.OnPageChangeListener; import android.util.Log; import android.view.LayoutInflater; import android.view.View; diff --git a/app/src/main/res/layout/activity_view_big_image.xml b/app/src/main/res/layout/activity_view_big_image.xml index 81bdac9..c211de6 100644 --- a/app/src/main/res/layout/activity_view_big_image.xml +++ b/app/src/main/res/layout/activity_view_big_image.xml @@ -4,7 +4,7 @@ android:layout_height="match_parent" android:background="#000000"> - getDataFromCursor(Context context, Cursor data, boolean checkImageStatus) { - List directories = new ArrayList<>(); - MediaDirectory photoDirectoryAll = new MediaDirectory(); - photoDirectoryAll.setName(context.getString(R.string.all_photo)); - photoDirectoryAll.setId("ALL"); - - while (data.moveToNext()) { - int originalImageId = data.getInt(data.getColumnIndexOrThrow(_ID)); - String originalImagePath = data.getString(data.getColumnIndexOrThrow(DATA)); - String bucketId = data.getString(data.getColumnIndexOrThrow(BUCKET_ID)); - String directoryName = data.getString(data.getColumnIndexOrThrow(BUCKET_DISPLAY_NAME)); - long originalImageSize = data.getLong(data.getColumnIndexOrThrow(SIZE)); - int imageWidth = data.getInt(data.getColumnIndexOrThrow(WIDTH)); - int imageHeight = data.getInt(data.getColumnIndexOrThrow(HEIGHT)); - String photoDirectoryPath = originalImagePath.substring(0, originalImagePath.lastIndexOf(File.separator)); - - MediaData photo = getPhoto(originalImageId, originalImagePath, originalImageSize, imageWidth, imageHeight); - - if (checkImageStatus) { - MediaDirectory mediaDirectory = new MediaDirectory(); - mediaDirectory.setId(bucketId); - mediaDirectory.setName(directoryName); - mediaDirectory.setDirPath(photoDirectoryPath); - if (!directories.contains(mediaDirectory)) { - mediaDirectory.setCoverPath(originalImagePath); - mediaDirectory.addMediaData(originalImageId, originalImagePath); - directories.add(mediaDirectory); - } else { - directories.get(directories.indexOf(mediaDirectory)).addMediaData(photo); - } - photoDirectoryAll.addMediaData(photo); - } - } - if (photoDirectoryAll.getPhotoPaths().size() > 0) { - photoDirectoryAll.setCoverPath(photoDirectoryAll.getPhotoPaths().get(0)); - } - directories.add(INDEX_ALL_PHOTOS, photoDirectoryAll); - - return directories; - } - - @NonNull - private static MediaData getPhoto(int originalImageId, String originalImagePath, long originalImageSize, int imageWidth, int imageHeight) { - MediaData photo = new MediaData(); - photo.setMediaId(originalImageId); - photo.setOriginalPath(originalImagePath); - photo.setOriginalSize(originalImageSize); - photo.setImageWidth(imageWidth); - photo.setImageHeight(imageHeight); - return photo; - } -} diff --git a/library/src/main/java/com/rain/library/loader/MediaStoreHelper.java b/library/src/main/java/com/rain/library/loader/MediaStoreHelper.java deleted file mode 100644 index 3f8f697..0000000 --- a/library/src/main/java/com/rain/library/loader/MediaStoreHelper.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.rain.library.loader; - -import android.app.Activity; -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.graphics.BitmapFactory; -import android.os.Bundle; -import android.provider.MediaStore; -import android.support.v4.app.LoaderManager; -import android.support.v4.content.Loader; -import android.support.v7.app.AppCompatActivity; - -import com.rain.library.bean.MediaData; -import com.rain.library.bean.MediaDirectory; -import com.rain.library.data.Data; -import com.rain.library.utils.ExternalStorage; -import com.rain.library.utils.MimeType; -import com.rain.library.utils.Rlog; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - - -public class MediaStoreHelper { - - /** - * 第一种方式 - * - * @param context Activity - * @param resultCallback PhotosResultCallback - */ - public static void getPhotoDirs(final Activity context, final PhotosResultCallback resultCallback) { - getPhotoDirs(context, resultCallback, true); - } - - public static void getPhotoDirs(final Activity context, final PhotosResultCallback resultCallback, final boolean checkImageStatus) { - new Thread(new Runnable() { - @Override - public void run() { - PhotoCursorLoader loader = new PhotoCursorLoader(); - ContentResolver contentResolver = context.getContentResolver(); - Cursor cursor = contentResolver.query(loader.getUri(), loader.getProjection(), loader.getSelection(), loader.getSelectionArgs(), loader.getSortOrder()); - - Cursor thumbnailCursor = contentResolver.query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Thumbnails.DATA}, null, null, null); - if (cursor == null) return; - - List directories = Data.getDataFromCursor(context, cursor, checkImageStatus); - cursor.close(); - if (resultCallback != null) { - resultCallback.onResultCallback(directories); - } - } - }).start(); - } - - /** - * 第二种方式 - * - * @param activity AppCompatActivity - * @param resultCallback PhotosResultCallback - */ - public static void getData(final AppCompatActivity activity, int type, boolean showGif, final PhotosResultCallback resultCallback) { - activity.getSupportLoaderManager() - .initLoader(type, null, new PhotoDirLoaderCallbacks(activity, type, showGif, resultCallback)); - - } - - static class PhotoDirLoaderCallbacks implements LoaderManager.LoaderCallbacks { - - private Context context; - private boolean showGif; //是否展示gif - private int mineType; //文件类型 - private PhotosResultCallback resultCallback; - - public PhotoDirLoaderCallbacks(Context context, int type, boolean showGif, PhotosResultCallback resultCallback) { - this.context = context; - this.resultCallback = resultCallback; - this.showGif = showGif; - this.mineType = type; - } - - @Override - public Loader onCreateLoader(int id, Bundle args) { - return new LocalMediaLoader(context, mineType, showGif); - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - if (data == null || data.isClosed()) return; - List directories = new ArrayList<>(); - MediaDirectory photoDirectoryAll = new MediaDirectory(); - - - while (data.moveToNext()) { - int media_id = data.getInt(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[0])); - int media_width = data.getInt(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[1])); - int media_height = data.getInt(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[2])); - // 使用DURATION获取的时长不准确 - // media_duration = data.getLong(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[3])); - String media_path = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[4])); - String media_type = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[5])); - long media_size = data.getLong(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[6])); - String media_dirId = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[7])); - String media_dirName = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[8])); - String media_directoryPath = media_path.substring(0, media_path.lastIndexOf(File.separator)); - - long media_duration = MimeType.isVideo(media_type) ? MimeType.getVideoDuration(media_path) : 0; - - //判断文件是否损坏 - boolean isDamage = ExternalStorage.getInstance().checkImageIsDamage(media_width, media_path); - if (isDamage) continue; - MediaData mediaData = getMediaData(media_id, media_path, media_size, media_duration, mineType, media_type, media_width, media_height); - MediaDirectory mediaDirectory = new MediaDirectory(); - mediaDirectory.setId(media_dirId); - mediaDirectory.setDirPath(media_directoryPath); - mediaDirectory.setName(media_dirName); - - if (!directories.contains(mediaDirectory)) { - mediaDirectory.setCoverPath(media_path); - mediaDirectory.addMediaData(mediaData); - directories.add(mediaDirectory); - } else { - directories.get(directories.indexOf(mediaDirectory)).addMediaData(mediaData); - } - photoDirectoryAll.addMediaData(mediaData); - } - - photoDirectoryAll.setName(MimeType.getTitle(mineType, context)); - photoDirectoryAll.setId("ALL"); - if (photoDirectoryAll.getPhotoPaths().size() > 0) { - photoDirectoryAll.setCoverPath(photoDirectoryAll.getPhotoPaths().get(0)); - } - directories.add(0, photoDirectoryAll); - data.close(); - - if (resultCallback != null) { - resultCallback.onResultCallback(directories); - } - } - - @Override - public void onLoaderReset(Loader loader) { - - } - } - - - public interface PhotosResultCallback { - void onResultCallback(List directories); - } - - private static MediaData getMediaData(int mediaId, String mediaPath, long mediaSize, long duration, int mimeType, String mediaType, int mediaWidth, int mediaHeight) { - MediaData mediaData = new MediaData(); - mediaData.setMediaId(mediaId); - mediaData.setOriginalPath(mediaPath); - mediaData.setOriginalSize(mediaSize); - mediaData.setDuration(duration); - mediaData.setMimeType(mimeType); - mediaData.setImageType(mediaType); - mediaData.setImageWidth(mediaWidth); - mediaData.setImageHeight(mediaHeight); - return mediaData; - } - -} diff --git a/library/src/main/java/com/rain/library/loader/PhotoCursorLoader.java b/library/src/main/java/com/rain/library/loader/PhotoCursorLoader.java deleted file mode 100644 index 51366dd..0000000 --- a/library/src/main/java/com/rain/library/loader/PhotoCursorLoader.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.rain.library.loader; - -import android.net.Uri; -import android.provider.MediaStore; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import static android.provider.MediaStore.MediaColumns.MIME_TYPE; - -public class PhotoCursorLoader { - - @NonNull - private Uri uri; - @Nullable - private String[] projection; - @Nullable - private String selection; - @Nullable - private String[] selectionArgs; - @Nullable - private String sortOrder; - - private boolean showGif; - - public PhotoCursorLoader() { - //default ,默认配置 - setShowGif(true);//展示gif - setUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - setProjection(IMAGE_PROJECTION); - setSelection(MIME_TYPE + "=? or " + MIME_TYPE + "=? " + (showGif ? ("or " + MIME_TYPE + "=?") : "")); - setShowGif(isShowGif()); - setSelectionArgs(selectionArgs); - setSortOrder(MediaStore.Images.Media.DATE_ADDED + " DESC"); -// setSortOrder(MediaStore.Images.Media.DATE_MODIFIED); - } - - /** - * 图片缩略图 - * @param uri EXTERNAL_CONTENT_URI - * @param projection new String[]{Thumbnails.IMAGE_ID,Thumbnails.DATA} - * @param selection null - * @param selectionArgs null - * @param sortOrder null - */ - public PhotoCursorLoader(@NonNull Uri uri, @Nullable String[] projection, - @Nullable String selection, @Nullable String[] selectionArgs, - @Nullable String sortOrder) { - this.uri = uri; - this.projection = projection; - this.selection = selection; - this.selectionArgs = selectionArgs; - this.sortOrder = sortOrder; - } - - private final static String IMAGE_JPEG = "image/jpeg"; - private final static String IMAGE_PNG = "image/png"; - private final static String IMAGE_GIF = "image/gif"; - - private final String[] IMAGE_PROJECTION = { - MediaStore.Images.Thumbnails.DATA, - MediaStore.Images.Media._ID, - MediaStore.Images.Media.DATA, - MediaStore.Images.Media.BUCKET_ID, - MediaStore.Images.Media.BUCKET_DISPLAY_NAME, - MediaStore.Images.Media.DATE_ADDED, - MediaStore.Images.Media.SIZE, - MediaStore.Images.Media.WIDTH, - MediaStore.Images.Media.HEIGHT - }; - - @NonNull - public Uri getUri() { - return uri; - } - - public void setUri(@NonNull Uri uri) { - this.uri = uri; - } - - @Nullable - public String[] getProjection() { - return projection; - } - - public void setProjection(@Nullable String[] projection) { - this.projection = projection; - } - - @Nullable - public String getSelection() { - return selection; - } - - public void setSelection(@Nullable String selection) { - this.selection = selection; - } - - @Nullable - public String[] getSelectionArgs() { - return selectionArgs; - } - - public void setSelectionArgs(@Nullable String[] selectionArgs) { - this.selectionArgs = selectionArgs; - } - - @Nullable - public String getSortOrder() { - return sortOrder; - } - - public void setSortOrder(@Nullable String sortOrder) { - this.sortOrder = sortOrder; - } - - public boolean isShowGif() { - return showGif; - } - - public void setShowGif(boolean showGif) { - this.showGif = showGif; - if (showGif) { - selectionArgs = new String[]{IMAGE_JPEG, IMAGE_PNG, IMAGE_GIF}; - } else { - selectionArgs = new String[]{IMAGE_JPEG, IMAGE_PNG}; - } - } -} diff --git a/library/src/main/java/com/rain/library/loader/PhotoDirectoryLoader.java b/library/src/main/java/com/rain/library/loader/PhotoDirectoryLoader.java deleted file mode 100644 index 3036c2f..0000000 --- a/library/src/main/java/com/rain/library/loader/PhotoDirectoryLoader.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.rain.library.loader; - -import android.content.Context; -import android.net.Uri; -import android.provider.MediaStore; -import android.provider.MediaStore.Images.Media; -import android.provider.MediaStore.Images.Thumbnails; -import android.support.v4.content.CursorLoader; - -import static android.provider.MediaStore.MediaColumns.MIME_TYPE; - -public class PhotoDirectoryLoader extends CursorLoader { - - public static final String BUCKET_ID = "bucket_id"; - public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; - - - private final static String IMAGE_JPEG = "image/jpeg"; - private final static String IMAGE_PNG = "image/png"; - private final static String IMAGE_GIF = "image/gif"; - - final String[] IMAGE_PROJECTION = { - MediaStore.Files.FileColumns._ID, - MediaStore.MediaColumns.DATA, - BUCKET_ID, - BUCKET_DISPLAY_NAME, - }; - - public PhotoDirectoryLoader(Context context) { - this(context, false); - } - - public PhotoDirectoryLoader(Context context, boolean showGif) { - super(context); - - setProjection(IMAGE_PROJECTION); - setUri(Media.EXTERNAL_CONTENT_URI); - setSortOrder(Media.DATE_ADDED + " DESC"); - - setSelection(MIME_TYPE + "=? or " + MIME_TYPE + "=? " + (showGif ? ("or " + MIME_TYPE + "=?") : "")); - String[] selectionArgs; - if (showGif) { - selectionArgs = new String[]{IMAGE_JPEG, IMAGE_PNG, IMAGE_GIF}; - } else { - selectionArgs = new String[]{IMAGE_JPEG, IMAGE_PNG}; - } - setSelectionArgs(selectionArgs); - } - - - private PhotoDirectoryLoader(Context context, Uri uri, String[] projection, String selection, - String[] selectionArgs, String sortOrder) { - super(context, uri, projection, selection, selectionArgs, sortOrder); - } - - -} diff --git a/photopicker/.gitignore b/photopicker/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/photopicker/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/photopicker/build.gradle b/photopicker/build.gradle new file mode 100644 index 0000000..d4ec334 --- /dev/null +++ b/photopicker/build.gradle @@ -0,0 +1,39 @@ +plugins { + id 'com.android.library' +} + +android { + compileSdkVersion 28 + buildToolsVersion "28.0.3" + + defaultConfig { + minSdkVersion 19 + targetSdkVersion 28 + versionCode 23 + versionName "2.0.3" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation "com.github.chrisbanes:PhotoView:2.3.0" + implementation "top.zibin:Luban:1.1.8" + implementation "com.github.yalantis:ucrop:2.2.4" + implementation "com.sothree.slidinguppanel:library:3.4.0" + implementation "com.davemorrissey.labs:subsampling-scale-image-view:3.10.0" +} \ No newline at end of file diff --git a/photopicker/consumer-rules.pro b/photopicker/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/library/proguard-rules.pro b/photopicker/proguard-rules.pro similarity index 94% rename from library/proguard-rules.pro rename to photopicker/proguard-rules.pro index f1b4245..481bb43 100644 --- a/library/proguard-rules.pro +++ b/photopicker/proguard-rules.pro @@ -18,4 +18,4 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/library/src/androidTest/java/com/rain/library/ExampleInstrumentedTest.java b/photopicker/src/androidTest/java/com/rain/photopicker/ExampleInstrumentedTest.java similarity index 53% rename from library/src/androidTest/java/com/rain/library/ExampleInstrumentedTest.java rename to photopicker/src/androidTest/java/com/rain/photopicker/ExampleInstrumentedTest.java index 5eecb8c..78cbb4e 100644 --- a/library/src/androidTest/java/com/rain/library/ExampleInstrumentedTest.java +++ b/photopicker/src/androidTest/java/com/rain/photopicker/ExampleInstrumentedTest.java @@ -1,8 +1,9 @@ -package com.rain.library; +package com.rain.photopicker; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; @@ -17,10 +18,9 @@ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test - public void useAppContext() throws Exception { + public void useAppContext() { // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.rain.library.test", appContext.getPackageName()); + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.rain.photopicker.test", appContext.getPackageName()); } -} +} \ No newline at end of file diff --git a/library/src/main/AndroidManifest.xml b/photopicker/src/main/AndroidManifest.xml similarity index 65% rename from library/src/main/AndroidManifest.xml rename to photopicker/src/main/AndroidManifest.xml index 9384f6a..9107ebd 100644 --- a/library/src/main/AndroidManifest.xml +++ b/photopicker/src/main/AndroidManifest.xml @@ -1,23 +1,22 @@ + + package="com.rain.photopicker"> + - - - + - - - + \ No newline at end of file diff --git a/library/src/main/java/com/rain/library/PhotoPick.java b/photopicker/src/main/java/com/rain/photopicker/PhotoPick.java similarity index 71% rename from library/src/main/java/com/rain/library/PhotoPick.java rename to photopicker/src/main/java/com/rain/photopicker/PhotoPick.java index eda21d7..c783b9d 100644 --- a/library/src/main/java/com/rain/library/PhotoPick.java +++ b/photopicker/src/main/java/com/rain/photopicker/PhotoPick.java @@ -1,20 +1,22 @@ -package com.rain.library; +package com.rain.photopicker; import android.app.Activity; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.provider.Settings; -import android.support.v7.app.AlertDialog; import android.widget.Toast; -import com.rain.library.bean.MediaData; -import com.rain.library.impl.CommonResult; -import com.rain.library.utils.ExternalStorage; -import com.rain.library.utils.MimeType; -import com.rain.library.utils.Rlog; -import com.rain.library.utils.UtilsHelper; +import androidx.appcompat.app.AlertDialog; + + +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.controller.CameraConfig; +import com.rain.photopicker.controller.PhotoPickConfig; +import com.rain.photopicker.impl.CommonResult; +import com.rain.photopicker.utils.ExternalStorage; +import com.rain.photopicker.utils.Rlog; +import com.rain.photopicker.utils.UtilsHelper; import java.io.File; import java.util.ArrayList; @@ -26,6 +28,7 @@ public final class PhotoPick { + private static Context mContext; public static void init(Context context) { @@ -40,6 +43,15 @@ public static void init(Context context, PhotoPickOptions options) { mContext = context.getApplicationContext(); } + public static PhotoPickConfig.Builder from(Activity activity) { + return new PhotoPickConfig.Builder(activity); + } + + public static CameraConfig.Builder useCamera(Activity activity){ + return new CameraConfig.Builder(activity); + } + + public static int getToolbarBackGround() { return mContext.getResources().getColor(PhotoPickOptions.DEFAULT.photoPickThemeColor); } @@ -55,24 +67,25 @@ public static void checkInit() { } public static void startCompression(Context context, ArrayList mediaData, final CommonResult result) { + Rlog.d("compression image size is " + mediaData.size()); List paths = new ArrayList<>(); for (MediaData data : mediaData) { if (data.isCamera()) { paths.add(data.getCameraImagePath()); } else if (data.isClip()) { paths.add(data.getClipImagePath()); - } else{ + } else { paths.add(data.getOriginalPath()); } } - + ExternalStorage.getInstance().checkStorageValid(); Luban.with(context) .load(paths) .setTargetDir(PhotoPickOptions.DEFAULT.imagePath) .setCompressListener(new OnCompressListener() { @Override public void onStart() { - Rlog.e("Rain", "Luban compression start"); + Rlog.d("Luban compression start"); } @Override @@ -83,7 +96,7 @@ public void onSuccess(File file) { @Override public void onError(Throwable e) { result.onSuccess(null, false); - Rlog.e("Rain", "onError:" + e.getMessage()); + Rlog.d("onError:" + e.getMessage()); } }).launch(); @@ -93,19 +106,11 @@ public static AlertDialog.Builder showDialog(final Activity activity, int resId) AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(UtilsHelper.getString(R.string.permission_tip_title)); builder.setMessage(UtilsHelper.getString(resId)); - builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - activity.finish(); - } - }); - builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.setData(Uri.parse("package:" + activity.getPackageName())); - activity.startActivity(intent); - } + builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> activity.finish()); + builder.setPositiveButton(R.string.settings, (dialogInterface, i) -> { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.parse("package:" + activity.getPackageName())); + activity.startActivity(intent); }); builder.setCancelable(false); return builder; @@ -131,4 +136,6 @@ public static boolean isTimeEnabled() { lastClickTime = time; return false; } + + } diff --git a/library/src/main/java/com/rain/library/PhotoPickOptions.java b/photopicker/src/main/java/com/rain/photopicker/PhotoPickOptions.java similarity index 84% rename from library/src/main/java/com/rain/library/PhotoPickOptions.java rename to photopicker/src/main/java/com/rain/photopicker/PhotoPickOptions.java index c2c760e..93ad4e2 100644 --- a/library/src/main/java/com/rain/library/PhotoPickOptions.java +++ b/photopicker/src/main/java/com/rain/photopicker/PhotoPickOptions.java @@ -1,4 +1,4 @@ -package com.rain.library; +package com.rain.photopicker; import android.os.Environment; @@ -27,11 +27,6 @@ public class PhotoPickOptions { public String imagePath = filePath + "image"; - /** - * 适配Android7.0文件共享 - */ - public String photoPickAuthority = "com.rain.photopicker.provider"; - /** * 自定义PhotoPick主题色 */ diff --git a/library/src/main/java/com/rain/library/bean/MediaData.java b/photopicker/src/main/java/com/rain/photopicker/bean/MediaData.java similarity index 99% rename from library/src/main/java/com/rain/library/bean/MediaData.java rename to photopicker/src/main/java/com/rain/photopicker/bean/MediaData.java index fd64ee5..29defb1 100644 --- a/library/src/main/java/com/rain/library/bean/MediaData.java +++ b/photopicker/src/main/java/com/rain/photopicker/bean/MediaData.java @@ -1,4 +1,4 @@ -package com.rain.library.bean; +package com.rain.photopicker.bean; import android.os.Parcel; import android.os.Parcelable; diff --git a/library/src/main/java/com/rain/library/bean/MediaDirectory.java b/photopicker/src/main/java/com/rain/photopicker/bean/MediaDirectory.java similarity index 97% rename from library/src/main/java/com/rain/library/bean/MediaDirectory.java rename to photopicker/src/main/java/com/rain/photopicker/bean/MediaDirectory.java index 5eefdb5..19bf5cc 100644 --- a/library/src/main/java/com/rain/library/bean/MediaDirectory.java +++ b/photopicker/src/main/java/com/rain/photopicker/bean/MediaDirectory.java @@ -1,6 +1,4 @@ -package com.rain.library.bean; - -import com.rain.library.utils.Rlog; +package com.rain.photopicker.bean; import java.util.ArrayList; import java.util.List; diff --git a/library/src/main/java/com/rain/library/bean/PhotoPickBean.java b/photopicker/src/main/java/com/rain/photopicker/bean/PhotoPickBean.java similarity index 97% rename from library/src/main/java/com/rain/library/bean/PhotoPickBean.java rename to photopicker/src/main/java/com/rain/photopicker/bean/PhotoPickBean.java index 5ad239a..6a06c52 100644 --- a/library/src/main/java/com/rain/library/bean/PhotoPickBean.java +++ b/photopicker/src/main/java/com/rain/photopicker/bean/PhotoPickBean.java @@ -1,11 +1,10 @@ -package com.rain.library.bean; +package com.rain.photopicker.bean; import android.os.Parcel; import android.os.Parcelable; -import com.rain.library.impl.PhotoSelectCallback; -import com.rain.library.loader.ImageLoader; - +import com.rain.photopicker.impl.PhotoSelectCallback; +import com.rain.photopicker.loader.ImageLoader; /** * Descriptions 照片选择器Bean类 diff --git a/library/src/main/java/com/rain/library/bean/PhotoPreviewBean.java b/photopicker/src/main/java/com/rain/photopicker/bean/PhotoPreviewBean.java similarity index 98% rename from library/src/main/java/com/rain/library/bean/PhotoPreviewBean.java rename to photopicker/src/main/java/com/rain/photopicker/bean/PhotoPreviewBean.java index ab5b2b9..5035e65 100644 --- a/library/src/main/java/com/rain/library/bean/PhotoPreviewBean.java +++ b/photopicker/src/main/java/com/rain/photopicker/bean/PhotoPreviewBean.java @@ -1,4 +1,4 @@ -package com.rain.library.bean; +package com.rain.photopicker.bean; import android.os.Parcel; import android.os.Parcelable; diff --git a/photopicker/src/main/java/com/rain/photopicker/controller/CameraConfig.java b/photopicker/src/main/java/com/rain/photopicker/controller/CameraConfig.java new file mode 100644 index 0000000..63b6b10 --- /dev/null +++ b/photopicker/src/main/java/com/rain/photopicker/controller/CameraConfig.java @@ -0,0 +1,110 @@ +package com.rain.photopicker.controller; + +import android.app.Activity; +import android.content.Intent; + +import com.rain.photopicker.bean.PhotoPickBean; +import com.rain.photopicker.impl.PhotoSelectCallback; +import com.rain.photopicker.ui.activity.CameraActivity; + +import java.lang.ref.WeakReference; + +/** + * @Author : Rain + * @CreateDate : 2020/8/26 11:12 + * @Version : 1.0 + * @Descroption : + */ +public class CameraConfig { + + public static boolean DEFAULT_SHOW_CLIP = false; //默认开启裁剪图片功能 + + public static boolean DEFAULT_START_COMPRESSION = false; //默认开启图片压缩 + + public static boolean CLIP_CIRCLE = false; //裁剪方式 圆形 + + public static PhotoPickBean photoPickBean = new PhotoPickBean(); + + public static final int CAMERA_REQUEST_CODE = 10001; + + + public CameraConfig(Activity activity,Builder builder){ + if (builder.pickBean == null) { + throw new NullPointerException("builder#pickBean is null"); + } else { + photoPickBean = builder.pickBean; + } + int requestCode = CAMERA_REQUEST_CODE; + startCamera(activity, requestCode); + } + + + private void startCamera(Activity activity, int requestCode) { + + Intent intent1 = new Intent(activity, CameraActivity.class); + activity.startActivity(intent1); + + + } + + public static class Builder{ + private WeakReference activity; + private PhotoPickBean pickBean; + + public Builder(Activity activity){ + if (activity == null) { + throw new NullPointerException("context is null"); + } + this.activity = new WeakReference<>(activity);; + this.pickBean = new PhotoPickBean(); + pickBean.setClipPhoto(DEFAULT_SHOW_CLIP); + pickBean.setClipMode(CLIP_CIRCLE); + pickBean.setStartCompression(DEFAULT_START_COMPRESSION); + } + + /** + * 是否开启选择照片后开启裁剪功能 + * 默认关闭 + * + * @param clipPhoto + * @return + */ + public Builder clipPhoto(boolean clipPhoto) { + pickBean.setClipPhoto(clipPhoto); + return this; + } + + /** + * 设置裁剪方式(圆形,矩形) + * 默认矩形 + * + * @param showClipCircle + * @return + */ + public Builder clipCircle(boolean showClipCircle) { + pickBean.setClipMode(showClipCircle); + return this; + } + + /** + * 启动图片压缩功能 + * 默认开启 + * + * @param compression + * @return + */ + public Builder startCompression(boolean compression) { + pickBean.setStartCompression(compression); + return this; + } + + public Builder setCallback(PhotoSelectCallback callback) { + pickBean.setCallback(callback); + return this; + } + + public CameraConfig build(){ + return new CameraConfig(activity.get(),this); + } + } +} diff --git a/library/src/main/java/com/rain/library/controller/PhotoPickConfig.java b/photopicker/src/main/java/com/rain/photopicker/controller/PhotoPickConfig.java similarity index 93% rename from library/src/main/java/com/rain/library/controller/PhotoPickConfig.java rename to photopicker/src/main/java/com/rain/photopicker/controller/PhotoPickConfig.java index a4cdb1b..50442b2 100644 --- a/library/src/main/java/com/rain/library/controller/PhotoPickConfig.java +++ b/photopicker/src/main/java/com/rain/photopicker/controller/PhotoPickConfig.java @@ -1,16 +1,17 @@ -package com.rain.library.controller; +package com.rain.photopicker.controller; import android.app.Activity; import android.content.Intent; -import com.rain.library.R; -import com.rain.library.bean.MediaData; -import com.rain.library.bean.PhotoPickBean; -import com.rain.library.impl.PhotoSelectCallback; -import com.rain.library.loader.ImageLoader; -import com.rain.library.ui.PhotoPickActivity; -import com.rain.library.utils.MimeType; +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.PhotoPickBean; +import com.rain.photopicker.impl.PhotoSelectCallback; +import com.rain.photopicker.loader.ImageLoader; +import com.rain.photopicker.ui.activity.PhotoPickActivity; +import com.rain.photopicker.utils.MimeType; +import java.lang.ref.WeakReference; import java.util.List; @@ -70,14 +71,14 @@ private void startPick(Activity activity, int requestCode) { } public static class Builder { - private Activity activity; + private WeakReference activity; private PhotoPickBean pickBean; public Builder(Activity activity) { if (activity == null) { throw new NullPointerException("context is null"); } - this.activity = activity; + this.activity = new WeakReference<>(activity);; pickBean = new PhotoPickBean(); pickBean.setSpanCount(GRID_SPAN_COUNT); //默认gridView列数->3 pickBean.setMaxPickSize(DEFAULT_CHOOSE_SIZE); //默认可以选择的图片数目->1 @@ -260,7 +261,7 @@ public PhotoPickConfig build() { pickBean.setShowGif(false); } - return new PhotoPickConfig(activity, this); + return new PhotoPickConfig(activity.get(), this); } } diff --git a/library/src/main/java/com/rain/library/controller/PhotoPreviewConfig.java b/photopicker/src/main/java/com/rain/photopicker/controller/PhotoPreviewConfig.java similarity index 93% rename from library/src/main/java/com/rain/library/controller/PhotoPreviewConfig.java rename to photopicker/src/main/java/com/rain/photopicker/controller/PhotoPreviewConfig.java index 5dfef5b..ca0338a 100644 --- a/library/src/main/java/com/rain/library/controller/PhotoPreviewConfig.java +++ b/photopicker/src/main/java/com/rain/photopicker/controller/PhotoPreviewConfig.java @@ -1,14 +1,14 @@ -package com.rain.library.controller; +package com.rain.photopicker.controller; import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import com.rain.library.PhotoPick; -import com.rain.library.R; -import com.rain.library.bean.MediaData; -import com.rain.library.bean.PhotoPreviewBean; -import com.rain.library.ui.PhotoPreviewActivity; +import com.rain.photopicker.PhotoPick; +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.PhotoPreviewBean; +import com.rain.photopicker.ui.activity.PhotoPreviewActivity; import java.util.ArrayList; diff --git a/library/src/main/java/com/rain/library/impl/CommonResult.java b/photopicker/src/main/java/com/rain/photopicker/impl/CommonResult.java similarity index 87% rename from library/src/main/java/com/rain/library/impl/CommonResult.java rename to photopicker/src/main/java/com/rain/photopicker/impl/CommonResult.java index 71f5c77..e875439 100644 --- a/library/src/main/java/com/rain/library/impl/CommonResult.java +++ b/photopicker/src/main/java/com/rain/photopicker/impl/CommonResult.java @@ -1,4 +1,4 @@ -package com.rain.library.impl; +package com.rain.photopicker.impl; /** * @author:duyu diff --git a/library/src/main/java/com/rain/library/impl/PhotoSelectCallback.java b/photopicker/src/main/java/com/rain/photopicker/impl/PhotoSelectCallback.java similarity index 80% rename from library/src/main/java/com/rain/library/impl/PhotoSelectCallback.java rename to photopicker/src/main/java/com/rain/photopicker/impl/PhotoSelectCallback.java index 561410a..6467c44 100644 --- a/library/src/main/java/com/rain/library/impl/PhotoSelectCallback.java +++ b/photopicker/src/main/java/com/rain/photopicker/impl/PhotoSelectCallback.java @@ -1,6 +1,7 @@ -package com.rain.library.impl; +package com.rain.photopicker.impl; -import com.rain.library.bean.MediaData; + +import com.rain.photopicker.bean.MediaData; import java.io.Serializable; import java.util.ArrayList; diff --git a/library/src/main/java/com/rain/library/loader/ImageLoader.java b/photopicker/src/main/java/com/rain/photopicker/loader/ImageLoader.java similarity index 81% rename from library/src/main/java/com/rain/library/loader/ImageLoader.java rename to photopicker/src/main/java/com/rain/photopicker/loader/ImageLoader.java index d8bbca3..6857ff3 100644 --- a/library/src/main/java/com/rain/library/loader/ImageLoader.java +++ b/photopicker/src/main/java/com/rain/photopicker/loader/ImageLoader.java @@ -1,17 +1,19 @@ -package com.rain.library.loader; +package com.rain.photopicker.loader; import android.content.Context; -import android.view.View; import android.widget.ImageView; import java.io.Serializable; - /** - * Describe :自定义图片加载框架 - * Email:baossrain99@163.com - * Created by Rain on 17-5-3. + * @author:duyu + * @org : www.yudu233.com + * @email : yudu233@gmail.com + * @date : 2017/05/03 + * @filename : LocalMediaLoader + * @describe : 自定义图片加载框架支持Glide、Picasso等框架 */ + public interface ImageLoader extends Serializable { void displayImage(Context context, String originalImagePath, String thumbnailsImagePath, ImageView imageView, boolean resize, boolean loadThumbnailsImage); diff --git a/library/src/main/java/com/rain/library/loader/LocalMediaLoader.java b/photopicker/src/main/java/com/rain/photopicker/loader/LocalMediaLoader.java similarity index 93% rename from library/src/main/java/com/rain/library/loader/LocalMediaLoader.java rename to photopicker/src/main/java/com/rain/photopicker/loader/LocalMediaLoader.java index ebc8b69..df83943 100644 --- a/library/src/main/java/com/rain/library/loader/LocalMediaLoader.java +++ b/photopicker/src/main/java/com/rain/photopicker/loader/LocalMediaLoader.java @@ -1,28 +1,31 @@ -package com.rain.library.loader; +package com.rain.photopicker.loader; import android.content.Context; import android.net.Uri; import android.provider.MediaStore; -import android.support.annotation.NonNull; -import android.support.v4.content.CursorLoader; -import com.rain.library.utils.MimeType; +import androidx.annotation.NonNull; +import androidx.loader.content.CursorLoader; + + +import com.rain.photopicker.utils.MimeType; import java.util.Locale; /** - * @author:duyu + * @author: duyu * @org : www.yudu233.com * @email : yudu233@gmail.com * @date : 2019/7/10 21:13 * @filename : LocalMediaLoader - * @describe : + * @describe : 数据库读取获取Cursor的Loader类 */ + public class LocalMediaLoader extends CursorLoader { private static final Uri QUERY_URI = MediaStore.Files.getContentUri("external"); - private static final String ORDER_BY = MediaStore.Files.FileColumns._ID + " DESC"; + private static final String ORDER_BY = MediaStore.Images.Media.DATE_TAKEN + " DESC"; private static final String NOT_GIF = "!='image/gif'"; diff --git a/photopicker/src/main/java/com/rain/photopicker/loader/MediaStoreHelper.java b/photopicker/src/main/java/com/rain/photopicker/loader/MediaStoreHelper.java new file mode 100644 index 0000000..445fc80 --- /dev/null +++ b/photopicker/src/main/java/com/rain/photopicker/loader/MediaStoreHelper.java @@ -0,0 +1,151 @@ +package com.rain.photopicker.loader; + +import android.content.Context; +import android.database.Cursor; +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.Loader; + + +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.MediaDirectory; +import com.rain.photopicker.utils.ExternalStorage; +import com.rain.photopicker.utils.MimeType; + +import java.io.File; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +/** + * @author: duyu + * @org : www.yudu233.com + * @email : yudu233@gmail.com + * @date : 2019/7/10 21:13 + * @filename : LocalMediaLoader + * @describe : 媒体资源获取 + */ + +public class MediaStoreHelper implements LoaderManager.LoaderCallbacks { + + private LoaderManager mLoaderManager; + private WeakReference mContext; + private boolean showGif; //是否展示gif + private int mineType; //文件类型 + private PhotosResultCallback mResultCallback; + + /** + * 获取媒体资源 + * + * @param activity 上下文 + * @param type 媒体类型 + * @param showGif 是否获取Gif资源 + * @param resultCallback 回调 + */ + public void getData(final AppCompatActivity activity, int type, boolean showGif, final PhotosResultCallback resultCallback) { + this.mContext = new WeakReference<>(activity); + this.mResultCallback = resultCallback; + this.showGif = showGif; + this.mineType = type; + this.mLoaderManager = activity.getSupportLoaderManager(); + this.mLoaderManager.initLoader(type, null, this); + } + + @Override + public Loader onCreateLoader(int id, Bundle args) { + Context context = mContext.get(); + if (context == null) { + return null; + } + return new LocalMediaLoader(context, mineType, showGif); + } + + @Override + public void onLoadFinished(Loader loader, Cursor data) { + Context context = mContext.get(); + if (context == null) return; + if (data == null || data.isClosed()) return; + List directories = new ArrayList<>(); + MediaDirectory photoDirectoryAll = new MediaDirectory(); + + + while (data.moveToNext()) { + int media_id = data.getInt(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[0])); + int media_width = data.getInt(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[1])); + int media_height = data.getInt(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[2])); + // 使用DURATION获取的时长不准确 + // media_duration = data.getLong(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[3])); + String media_path = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[4])); + String media_type = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[5])); + long media_size = data.getLong(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[6])); + String media_dirId = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[7])); + String media_dirName = data.getString(data.getColumnIndexOrThrow(LocalMediaLoader.FILE_PROJECTION[8])); + String media_directoryPath = media_path.substring(0, media_path.lastIndexOf(File.separator)); + + long media_duration = MimeType.isVideo(media_type) ? MimeType.getVideoDuration(media_path) : 0; + + //判断文件是否损坏 + boolean isDamage = ExternalStorage.getInstance().checkImageIsDamage(media_width, media_path); + if (isDamage) continue; + MediaData mediaData = getMediaData(media_id, media_path, media_size, media_duration, mineType, media_type, media_width, media_height); + MediaDirectory mediaDirectory = new MediaDirectory(); + mediaDirectory.setId(media_dirId); + mediaDirectory.setDirPath(media_directoryPath); + mediaDirectory.setName(media_dirName); + + if (!directories.contains(mediaDirectory)) { + mediaDirectory.setCoverPath(media_path); + mediaDirectory.addMediaData(mediaData); + directories.add(mediaDirectory); + } else { + directories.get(directories.indexOf(mediaDirectory)).addMediaData(mediaData); + } + photoDirectoryAll.addMediaData(mediaData); + } + + photoDirectoryAll.setName(MimeType.getTitle(mineType, context)); + photoDirectoryAll.setId("ALL"); + if (photoDirectoryAll.getPhotoPaths().size() > 0) { + photoDirectoryAll.setCoverPath(photoDirectoryAll.getPhotoPaths().get(0)); + } + directories.add(0, photoDirectoryAll); + data.close(); + + if (mResultCallback != null) { + mResultCallback.onResultCallback(directories); + } + } + + @Override + public void onLoaderReset(Loader loader) { + + } + + public void onDestory() { + if (mLoaderManager != null) { + mLoaderManager.destroyLoader(mineType); + } + mResultCallback = null; + } + + + public interface PhotosResultCallback { + void onResultCallback(List directories); + } + + private static MediaData getMediaData(int mediaId, String mediaPath, long mediaSize, long duration, int mimeType, String mediaType, int mediaWidth, int mediaHeight) { + MediaData mediaData = new MediaData(); + mediaData.setMediaId(mediaId); + mediaData.setOriginalPath(mediaPath); + mediaData.setOriginalSize(mediaSize); + mediaData.setDuration(duration); + mediaData.setMimeType(mimeType); + mediaData.setImageType(mediaType); + mediaData.setImageWidth(mediaWidth); + mediaData.setImageHeight(mediaHeight); + return mediaData; + } + +} diff --git a/library/src/main/java/com/rain/library/observer/UpdateUIObserver.java b/photopicker/src/main/java/com/rain/photopicker/observer/UpdateUIObserver.java similarity index 94% rename from library/src/main/java/com/rain/library/observer/UpdateUIObserver.java rename to photopicker/src/main/java/com/rain/photopicker/observer/UpdateUIObserver.java index 4654aaa..65e209b 100644 --- a/library/src/main/java/com/rain/library/observer/UpdateUIObserver.java +++ b/photopicker/src/main/java/com/rain/photopicker/observer/UpdateUIObserver.java @@ -1,6 +1,7 @@ -package com.rain.library.observer; +package com.rain.photopicker.observer; -import com.rain.library.bean.MediaData; + +import com.rain.photopicker.bean.MediaData; import java.util.Observable; diff --git a/library/src/main/java/com/rain/library/BaseActivity.java b/photopicker/src/main/java/com/rain/photopicker/ui/activity/BaseActivity.java similarity index 73% rename from library/src/main/java/com/rain/library/BaseActivity.java rename to photopicker/src/main/java/com/rain/photopicker/ui/activity/BaseActivity.java index 8f23dfa..85f1d19 100644 --- a/library/src/main/java/com/rain/library/BaseActivity.java +++ b/photopicker/src/main/java/com/rain/photopicker/ui/activity/BaseActivity.java @@ -1,15 +1,19 @@ -package com.rain.library; +package com.rain.photopicker.ui.activity; import android.graphics.Color; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.WindowManager; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.rain.photopicker.PhotoPick; +import com.rain.photopicker.R; + /** * Descriptions : Activity基类 * GitHub : https://github.com/Rain0413 @@ -31,6 +35,11 @@ protected void onCreate(Bundle savedInstanceState) { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); } + //如果主题色为白色,设置状态栏字体为深色 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && PhotoPick.getToolbarBackGround() == getResources().getColor(R.color.color_white)) { + this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } } protected void setContentView(int layoutId, boolean hasTitle) { diff --git a/photopicker/src/main/java/com/rain/photopicker/ui/activity/CameraActivity.java b/photopicker/src/main/java/com/rain/photopicker/ui/activity/CameraActivity.java new file mode 100644 index 0000000..3f00f0c --- /dev/null +++ b/photopicker/src/main/java/com/rain/photopicker/ui/activity/CameraActivity.java @@ -0,0 +1,91 @@ +package com.rain.photopicker.ui.activity; + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import com.rain.photopicker.PhotoPick; +import com.rain.photopicker.R; +import com.rain.photopicker.controller.CameraConfig; +import com.rain.photopicker.utils.PhotoPickerHelper; +import com.yalantis.ucrop.UCrop; + +import java.io.File; + +/** + * @Author : Rain + * @CreateDate : 2020/8/26 11:49 + * @Version : 1.0 + * @Descroption : + */ +public class CameraActivity extends BaseActivity { + + public static final int REQUEST_CODE_CAMERA = 200; //拍照权限请求码 + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + //申请权限 + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PhotoPickerHelper.REQUEST_CODE_CAMERA); + } else { + PhotoPickerHelper.startCamera(this); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode != RESULT_OK) return; + switch (requestCode) { + case PhotoPickerHelper.CAMERA_REQUEST_CODE: + findCameraPhoto(); + break; + case UCrop.REQUEST_CROP: //裁剪 + PhotoPickerHelper.sendClipImage(this, CameraConfig.photoPickBean); + finish(); + break; + } + } + + private void findCameraPhoto() { + if (PhotoPickerHelper.getCameraUri() == null || + !new File(PhotoPickerHelper.getCameraImagePath()).exists()) { + PhotoPick.toast(R.string.unable_find_pic); + } else { + if (CameraConfig.photoPickBean.isClipPhoto()) { + //裁剪照片 + PhotoPickerHelper.startClipPic(this, + CameraConfig.photoPickBean, PhotoPickerHelper.getCameraImagePath()); + } else { + if (CameraConfig.photoPickBean.isStartCompression()) { + //压缩 + PhotoPickerHelper.startCompress(this, CameraConfig.photoPickBean); + } else { + //发送相机图片 + PhotoPickerHelper.sendCameraImage(this, CameraConfig.photoPickBean, PhotoPickerHelper.getCameraImagePath()); + } + finish(); + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == REQUEST_CODE_CAMERA) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + PhotoPickerHelper.startCamera(this); + } else { + PhotoPick.showDialog(this, R.string.permission_tip_video).show(); + } + } + } +} diff --git a/library/src/main/java/com/rain/library/ui/PhotoPickActivity.java b/photopicker/src/main/java/com/rain/photopicker/ui/activity/PhotoPickActivity.java similarity index 53% rename from library/src/main/java/com/rain/library/ui/PhotoPickActivity.java rename to photopicker/src/main/java/com/rain/photopicker/ui/activity/PhotoPickActivity.java index 78b93bf..f7f9430 100644 --- a/library/src/main/java/com/rain/library/ui/PhotoPickActivity.java +++ b/photopicker/src/main/java/com/rain/photopicker/ui/activity/PhotoPickActivity.java @@ -1,4 +1,4 @@ -package com.rain.library.ui; +package com.rain.photopicker.ui.activity; import android.Manifest; import android.app.Activity; @@ -6,49 +6,48 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import com.rain.library.BaseActivity; -import com.rain.library.PhotoGalleryAdapter; -import com.rain.library.PhotoPick; -import com.rain.library.PhotoPickAdapter; -import com.rain.library.PhotoPickOptions; -import com.rain.library.R; -import com.rain.library.bean.MediaData; -import com.rain.library.bean.MediaDirectory; -import com.rain.library.bean.PhotoPickBean; -import com.rain.library.controller.PhotoPickConfig; -import com.rain.library.controller.PhotoPreviewConfig; -import com.rain.library.impl.CommonResult; -import com.rain.library.loader.MediaStoreHelper; -import com.rain.library.observer.UpdateUIObserver; -import com.rain.library.utils.MimeType; -import com.rain.library.utils.Rlog; -import com.rain.library.utils.UtilsHelper; -import com.rain.library.weidget.LoadingDialog; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.rain.photopicker.PhotoPick; +import com.rain.photopicker.PhotoPickOptions; +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.MediaDirectory; +import com.rain.photopicker.controller.CameraConfig; +import com.rain.photopicker.controller.PhotoPickConfig; +import com.rain.photopicker.controller.PhotoPreviewConfig; +import com.rain.photopicker.impl.CommonResult; +import com.rain.photopicker.loader.MediaStoreHelper; +import com.rain.photopicker.observer.UpdateUIObserver; +import com.rain.photopicker.ui.adapter.PhotoGalleryAdapter; +import com.rain.photopicker.ui.adapter.PhotoPickAdapter; +import com.rain.photopicker.utils.MimeType; +import com.rain.photopicker.utils.PhotoPickerHelper; +import com.rain.photopicker.utils.Rlog; +import com.rain.photopicker.utils.UtilsHelper; +import com.rain.photopicker.weidget.LoadingDialog; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import com.yalantis.ucrop.UCrop; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.ListIterator; import java.util.Observable; import java.util.Observer; /** * Descriptions :照片选择器 - * GitHub : https://github.com/Rain0413 + * GitHub : https://github.com/yudu233 * Blog : http://blog.csdn.net/sinat_33680954 * Created by Rain on 16-12-7. */ @@ -56,12 +55,6 @@ public class PhotoPickActivity extends BaseActivity implements Observer { public static final String TAG = PhotoPickActivity.class.getSimpleName(); - //权限相关 - public static final int REQUEST_CODE_SDCARD = 100; //读写权限请求码 - public static final int REQUEST_CODE_CAMERA = 200; //拍照权限请求码 - - public static final int REQUEST_CODE_SHOW_CAMERA = 0; // 拍照 - private SlidingUpPanelLayout slidingUpPanelLayout; private PhotoGalleryAdapter galleryAdapter; private PhotoPickAdapter adapter; @@ -69,6 +62,7 @@ public class PhotoPickActivity extends BaseActivity implements Observer { private ArrayList photoList = new ArrayList<>(); private ArrayList photoDirectoryList = new ArrayList<>(); private LoadingDialog loadingDialog; + private MediaStoreHelper mediaStoreHelper; @Override protected void onCreate(Bundle savedInstanceState) { @@ -89,6 +83,7 @@ protected void onCreate(Bundle savedInstanceState) { * 初始化控件 */ private void init() { + mediaStoreHelper = new MediaStoreHelper(); //获取全部媒体文件 loadMediaData(); @@ -112,23 +107,15 @@ private void init() { gallery_rv.setAdapter(galleryAdapter); //当选择照片的时候更新toolbar的标题 - adapter.setOnUpdateListener(new PhotoPickAdapter.OnUpdateListener() { - @Override - public void updateToolBarTitle(String title) { - menuItem.setTitle(title); - } - }); + adapter.setOnUpdateListener(title -> menuItem.setTitle(title)); //相册列表item选择的时候关闭slidingUpPanelLayout并更新照片adapter - galleryAdapter.setOnItemClickListener(new PhotoGalleryAdapter.OnItemClickListener() { - @Override - public void onClick(ArrayList photos, int position) { - if (adapter != null) { - PhotoPreviewConfig.setPreviewPhotos(photos); - slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); - toolbar.setTitle(photoDirectoryList.get(position).getName()); - adapter.refresh(photos); - } + galleryAdapter.setOnItemClickListener((photos, position) -> { + if (adapter != null) { + PhotoPreviewConfig.setPreviewPhotos(photos); + slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + toolbar.setTitle(photoDirectoryList.get(position).getName()); + adapter.refresh(photos); } }); @@ -140,15 +127,11 @@ public void onPanelSlide(View panel, float slideOffset) { } @Override - public void onPanelStateChanged(View panel, SlidingUpPanelLayout.PanelState previousState, SlidingUpPanelLayout.PanelState newState) { - } - }); - slidingUpPanelLayout.setFadeOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + public void onPanelStateChanged(View panel, SlidingUpPanelLayout.PanelState previousState, + SlidingUpPanelLayout.PanelState newState) { } }); + slidingUpPanelLayout.setFadeOnClickListener(v -> slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED)); UpdateUIObserver.getInstance().addObserver(this); } @@ -156,31 +139,23 @@ public void onClick(View v) { * 获取媒体文件 */ private void loadMediaData() { - MediaStoreHelper.getData(this, PhotoPickConfig.getInstance().getMimeType(), - PhotoPickConfig.getInstance().isShowGif(), new MediaStoreHelper.PhotosResultCallback() { - @Override - public void onResultCallback(final List directories) { - runOnUiThread(new Runnable() { - @Override - public void run() { - List photos = directories.get(0).getMediaData(); - for (int i = 0; i < photos.size(); i++) { - if (UtilsHelper.isFileExist(photos.get(i).getOriginalPath())) - photoList.add(photos.get(i)); - } - photoDirectoryList.add(directories.get(0)); - for (int i = 1; i < directories.size(); i++) { - if (UtilsHelper.isFileExist(directories.get(i).getDirPath())) { - photoDirectoryList.add(directories.get(i)); - } - } - PhotoPreviewConfig.setPreviewPhotos(photoList); - adapter.refresh(photoList); - galleryAdapter.refresh(photoDirectoryList); - } - }); + mediaStoreHelper.getData(this, PhotoPickConfig.getInstance().getMimeType(), + PhotoPickConfig.getInstance().isShowGif(), directories -> runOnUiThread(() -> { + List photos = directories.get(0).getMediaData(); + for (int i = 0; i < photos.size(); i++) { + if (UtilsHelper.isFileExist(photos.get(i).getOriginalPath())) + photoList.add(photos.get(i)); + } + photoDirectoryList.add(directories.get(0)); + for (int i = 1; i < directories.size(); i++) { + if (UtilsHelper.isFileExist(directories.get(i).getDirPath())) { + photoDirectoryList.add(directories.get(i)); + } } - }); + PhotoPreviewConfig.setPreviewPhotos(photoList); + adapter.refresh(photoList); + galleryAdapter.refresh(photoDirectoryList); + })); } //请求权限(先检查) @@ -189,7 +164,7 @@ private void requestPermission() { != PackageManager.PERMISSION_GRANTED) { //申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_SDCARD); + Manifest.permission.READ_EXTERNAL_STORAGE}, PhotoPickerHelper.REQUEST_CODE_SDCARD); } else { init(); } @@ -205,15 +180,15 @@ private void requestPermission() { */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - if (requestCode == REQUEST_CODE_SDCARD) { + if (requestCode == PhotoPickerHelper.REQUEST_CODE_SDCARD) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { init(); } else { PhotoPick.showDialog(PhotoPickActivity.this, R.string.permission_tip_SD).show(); } - } else if (requestCode == REQUEST_CODE_CAMERA) { + } else if (requestCode == PhotoPickerHelper.REQUEST_CODE_CAMERA) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - adapter.selectPicFromCamera(); + PhotoPickerHelper.startCamera(this); } else { PhotoPick.showDialog(PhotoPickActivity.this, R.string.permission_tip_video).show(); } @@ -235,10 +210,12 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(MenuItem item) { if (PhotoPick.isTimeEnabled()) { if (item.getItemId() == R.id.ok) { - checkImages(); + index = 0; if (adapter != null && !adapter.getSelectPhotosInfo().isEmpty()) { + PhotoPickerHelper.checkImages(adapter.getSelectPhotosInfo()); MediaData mediaData = adapter.getSelectPhotosInfo().get(0); - if (PhotoPickConfig.getInstance().isStartCompression() && !MimeType.isVideo(mediaData.getImageType())) { + if (PhotoPickConfig.getInstance().isStartCompression() && + !MimeType.isVideo(mediaData.getImageType())) { if (loadingDialog != null) { loadingDialog.show(); } @@ -247,7 +224,7 @@ public boolean onOptionsItemSelected(MenuItem item) { //不做压缩处理 直接发送原图信息 sendImages(); } - }else { + } else { PhotoPick.toast(getString(R.string.tips_no)); finish(); } @@ -265,13 +242,13 @@ public void onSuccess(File file, boolean success) { loadingDialog.dismiss(); } if (success && file.exists()) { - Rlog.e(TAG, "Luban compression success:" + file.getAbsolutePath() + " ; image length = " + file.length()); + Rlog.d(TAG, "Luban compression success:" + file.getAbsolutePath() + " ; image length = " + file.length()); MediaData mediaData = adapter.getSelectPhotosInfo().get(index); mediaData.setCompressionPath(file.getAbsolutePath()); mediaData.setCompressed(true); index++; if (index > 0 && index == adapter.getSelectPhotosInfo().size()) { - Rlog.e(TAG, "all select image compression success!"); + Rlog.d(TAG, "all select image compression success!"); sendImages(); } } else { @@ -296,15 +273,17 @@ public void onBackPressed() { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) { return; } switch (requestCode) { - case REQUEST_CODE_SHOW_CAMERA://相机 + case PhotoPickerHelper.CAMERA_REQUEST_CODE://相机 findPhoto(); break; case UCrop.REQUEST_CROP: //裁剪 - findClipPhoto(); + PhotoPickerHelper.sendClipImage(this,PhotoPickConfig.getInstance()); + finish(); break; case UCrop.RESULT_ERROR: Throwable cropError = UCrop.getError(data); @@ -317,95 +296,29 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } } - private void findClipPhoto() { - MediaData mediaData = new MediaData(); - mediaData.setClip(true); - mediaData.setClipImagePath(adapter.getClipImagePath()); - mediaData.setImageType(MimeType.createImageType(adapter.getCameraImagePath())); - mediaData.setMimeType(MimeType.TYPE_IMAGE); - adapter.getSelectPhotosInfo().add(mediaData); - sendImages(); - } - - private void findPhoto() { - if (adapter.getCameraUri() == null || TextUtils.isEmpty(adapter.getCameraImagePath())) { + if (PhotoPickerHelper.getCameraUri() == null || TextUtils.isEmpty(PhotoPickerHelper.getCameraImagePath())) { PhotoPick.toast(R.string.unable_find_pic); } else { if (PhotoPickConfig.getInstance().isClipPhoto()) { - //拍完照之后,如果要启动裁剪,则去裁剪再把地址传回来 - adapter.startClipPic(adapter.getCameraImagePath()); + //裁剪照片 + PhotoPickerHelper.startClipPic(this, + CameraConfig.photoPickBean, PhotoPickerHelper.getCameraImagePath()); } else { if (PhotoPickConfig.getInstance().isStartCompression()) { - final MediaData photo = new MediaData(); - photo.setCamera(true); - photo.setCameraImagePath(adapter.getCameraImagePath()); - photo.setImageType(MimeType.createImageType(adapter.getCameraImagePath())); - photo.setMimeType(MimeType.TYPE_IMAGE); - PhotoPick.startCompression(PhotoPickActivity.this, - new ArrayList<>(Arrays.asList(photo)), new CommonResult() { - @Override - public void onSuccess(File data, boolean success) { - if (success) { - photo.setCompressed(true); - photo.setCompressionPath(data.getAbsolutePath()); - } else { - photo.setCompressed(false); - } - adapter.getSelectPhotosInfo().add(photo); - sendImages(); - } - }); + //压缩 + PhotoPickerHelper.startCompress(this,PhotoPickConfig.getInstance()); } else { - MediaData mediaData = new MediaData(); - mediaData.setCamera(true); - mediaData.setMimeType(MimeType.TYPE_IMAGE); - mediaData.setImageType(MimeType.createImageType(adapter.getCameraImagePath())); - mediaData.setCameraImagePath(adapter.getCameraImagePath()); - adapter.getSelectPhotosInfo().add(mediaData); - sendImages(); + + PhotoPickerHelper.sendCameraImage(this,PhotoPickConfig.getInstance(),PhotoPickerHelper.getCameraImagePath()); } } } } - /** - * 检测图片是否存在/损坏 - */ - private void checkImages() { - ListIterator iterator = adapter.getSelectPhotosInfo().listIterator(); - while (iterator.hasNext()) { - String mediaPath; - MediaData media = iterator.next(); - if (media.isClip()) { - mediaPath = media.getClipImagePath(); - } else if (media.isCamera()) { - mediaPath = media.getCameraImagePath(); - } else if (media.isCompressed()) { - mediaPath = media.getCompressionPath(); - } else { - mediaPath = media.getOriginalPath(); - } - - if (!new File(mediaPath).exists()) { - iterator.remove(); - } - } - } private void sendImages() { - if (!PhotoPickConfig.getInstance().isStartCompression()) { - checkImages(); - } - - if (PhotoPickConfig.getInstance().getCallback() != null) { - PhotoPickConfig.getInstance().getCallback().selectResult(adapter.getSelectPhotosInfo()); - } else { - Intent intent = new Intent(); - intent.putParcelableArrayListExtra(PhotoPickConfig.EXTRA_SELECT_PHOTOS, adapter.getSelectPhotosInfo()); - setResult(Activity.RESULT_OK, intent); - } - + PhotoPickerHelper.sendImages(this,PhotoPickConfig.getInstance(),adapter.getSelectPhotosInfo()); finish(); } diff --git a/library/src/main/java/com/rain/library/ui/PhotoPreviewActivity.java b/photopicker/src/main/java/com/rain/photopicker/ui/activity/PhotoPreviewActivity.java similarity index 89% rename from library/src/main/java/com/rain/library/ui/PhotoPreviewActivity.java rename to photopicker/src/main/java/com/rain/photopicker/ui/activity/PhotoPreviewActivity.java index 5d5a231..7207d41 100644 --- a/library/src/main/java/com/rain/library/ui/PhotoPreviewActivity.java +++ b/photopicker/src/main/java/com/rain/photopicker/ui/activity/PhotoPreviewActivity.java @@ -1,13 +1,10 @@ -package com.rain.library.ui; +package com.rain.photopicker.ui.activity; import android.app.Activity; import android.content.Intent; import android.graphics.PointF; import android.net.Uri; import android.os.Bundle; -import android.support.v4.content.FileProvider; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; @@ -18,31 +15,34 @@ import android.widget.ImageView; import android.widget.RadioButton; +import androidx.core.content.FileProvider; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + import com.davemorrissey.labs.subscaleview.ImageSource; import com.davemorrissey.labs.subscaleview.ImageViewState; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.github.chrisbanes.photoview.OnPhotoTapListener; import com.github.chrisbanes.photoview.PhotoView; -import com.rain.library.BaseActivity; -import com.rain.library.PhotoPick; -import com.rain.library.PhotoPickOptions; -import com.rain.library.R; -import com.rain.library.bean.MediaData; -import com.rain.library.bean.PhotoPreviewBean; -import com.rain.library.controller.PhotoPickConfig; -import com.rain.library.controller.PhotoPreviewConfig; -import com.rain.library.impl.CommonResult; -import com.rain.library.impl.PhotoSelectCallback; -import com.rain.library.observer.UpdateUIObserver; -import com.rain.library.utils.MimeType; -import com.rain.library.utils.Rlog; -import com.rain.library.utils.UtilsHelper; -import com.rain.library.weidget.HackyViewPager; -import com.rain.library.weidget.LoadingDialog; +import com.rain.photopicker.PhotoPick; +import com.rain.photopicker.PhotoPickOptions; +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.PhotoPreviewBean; +import com.rain.photopicker.controller.PhotoPickConfig; +import com.rain.photopicker.controller.PhotoPreviewConfig; +import com.rain.photopicker.impl.CommonResult; +import com.rain.photopicker.impl.PhotoSelectCallback; +import com.rain.photopicker.observer.UpdateUIObserver; +import com.rain.photopicker.utils.MimeType; +import com.rain.photopicker.utils.PhotoPickerHelper; +import com.rain.photopicker.utils.Rlog; +import com.rain.photopicker.utils.UtilsHelper; +import com.rain.photopicker.weidget.HackyViewPager; +import com.rain.photopicker.weidget.LoadingDialog; import java.io.File; import java.util.ArrayList; -import java.util.ListIterator; /** @@ -262,7 +262,7 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onOptionsItemSelected(MenuItem item) { if (PhotoPick.isTimeEnabled()) { if (item.getItemId() == R.id.ok) { - checkImages(); + PhotoPickerHelper.checkImages(selectPhotosInfo); if (!selectPhotosInfo.isEmpty()) { if (PhotoPickConfig.getInstance().isStartCompression() && !photoPreviewBean.isSelectOrigin() && !MimeType.isVideo(selectPhotosInfo.get(0).getImageType())) { @@ -302,31 +302,6 @@ private void sendImage() { finish(); } - private void checkImages() { - //检测图片是否存在/损坏 - ListIterator iterator = selectPhotosInfo.listIterator(); - while (iterator.hasNext()) { - String mediaPath; - MediaData media = iterator.next(); - if (media.isClip()) { - mediaPath = media.getClipImagePath(); - } else if (media.isCamera()) { - mediaPath = media.getCameraImagePath(); - } else if (media.isCompressed()) { - mediaPath = media.getCompressionPath(); - } else { - mediaPath = media.getOriginalPath(); - } - - if (!new File(mediaPath).exists()) { - Rlog.e("文件不存在"); - iterator.remove(); - - } - - } - } - private int index = 0; private CommonResult compressResult = new CommonResult() { @@ -334,7 +309,7 @@ private void checkImages() { public void onSuccess(File file, boolean success) { if (success && file.exists()) { - Rlog.e("Rain", "Luban compression success:" + file.getAbsolutePath() + " ; image length = " + file.length()); + Rlog.d("Rain", "Luban compression success:" + file.getAbsolutePath() + " ; image length = " + file.length()); MediaData photo = selectPhotosInfo.get(index); photo.setCompressed(true); if (MimeType.isGif(photo.getImageType())) { @@ -345,7 +320,7 @@ public void onSuccess(File file, boolean success) { index++; if (index > 0 && index == selectPhotosInfo.size()) { - Rlog.e("Rain", "all select image compression success!"); + Rlog.d("Rain", "all select image compression success!"); if (loadingDialog != null) { loadingDialog.dismiss(); } @@ -387,7 +362,7 @@ public void onPhotoTap(ImageView view, float x, float y) { if (MimeType.isPictureType(photos.get(pos).getImageType()) == MimeType.ofVideo()) { Intent intent = new Intent(Intent.ACTION_VIEW); String type = "video/*"; - Uri uri = FileProvider.getUriForFile(this, PhotoPickOptions.DEFAULT.photoPickAuthority, new File(photos.get(pos).getOriginalPath())); + Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", new File(photos.get(pos).getOriginalPath())); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.setDataAndType(uri, type); startActivity(intent); diff --git a/library/src/main/java/com/rain/library/PhotoGalleryAdapter.java b/photopicker/src/main/java/com/rain/photopicker/ui/adapter/PhotoGalleryAdapter.java similarity index 92% rename from library/src/main/java/com/rain/library/PhotoGalleryAdapter.java rename to photopicker/src/main/java/com/rain/photopicker/ui/adapter/PhotoGalleryAdapter.java index de5b8aa..cd35e6f 100644 --- a/library/src/main/java/com/rain/library/PhotoGalleryAdapter.java +++ b/photopicker/src/main/java/com/rain/photopicker/ui/adapter/PhotoGalleryAdapter.java @@ -1,9 +1,8 @@ -package com.rain.library; +package com.rain.photopicker.ui.adapter; import android.app.Activity; import android.content.Context; -import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.Display; import android.view.LayoutInflater; @@ -12,11 +11,14 @@ import android.widget.ImageView; import android.widget.TextView; -import com.rain.library.bean.MediaData; -import com.rain.library.bean.MediaDirectory; -import com.rain.library.controller.PhotoPickConfig; -import com.rain.library.utils.UtilsHelper; -import com.rain.library.weidget.GalleryImageView; +import androidx.recyclerview.widget.RecyclerView; + +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.MediaDirectory; +import com.rain.photopicker.controller.PhotoPickConfig; +import com.rain.photopicker.utils.UtilsHelper; +import com.rain.photopicker.weidget.GalleryImageView; import java.util.ArrayList; import java.util.List; diff --git a/library/src/main/java/com/rain/library/PhotoPickAdapter.java b/photopicker/src/main/java/com/rain/photopicker/ui/adapter/PhotoPickAdapter.java similarity index 64% rename from library/src/main/java/com/rain/library/PhotoPickAdapter.java rename to photopicker/src/main/java/com/rain/photopicker/ui/adapter/PhotoPickAdapter.java index fbdeb9b..9ff9bd1 100644 --- a/library/src/main/java/com/rain/library/PhotoPickAdapter.java +++ b/photopicker/src/main/java/com/rain/photopicker/ui/adapter/PhotoPickAdapter.java @@ -1,17 +1,8 @@ -package com.rain.library; +package com.rain.photopicker.ui.adapter; import android.Manifest; import android.app.Activity; -import android.content.Context; -import android.content.Intent; import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Build; -import android.provider.MediaStore; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v4.content.FileProvider; -import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.Display; @@ -20,17 +11,25 @@ import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; -import android.widget.Toast; - -import com.rain.library.bean.MediaData; -import com.rain.library.bean.PhotoPickBean; -import com.rain.library.controller.PhotoPickConfig; -import com.rain.library.controller.PhotoPreviewConfig; -import com.rain.library.ui.PhotoPickActivity; -import com.rain.library.utils.MimeType; -import com.rain.library.utils.UCropUtils; -import com.rain.library.utils.UtilsHelper; -import com.rain.library.weidget.GalleryImageView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + + +import com.rain.photopicker.PhotoPick; +import com.rain.photopicker.PhotoPickOptions; +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.PhotoPickBean; +import com.rain.photopicker.controller.PhotoPickConfig; +import com.rain.photopicker.controller.PhotoPreviewConfig; +import com.rain.photopicker.utils.MimeType; +import com.rain.photopicker.utils.PhotoPickerHelper; +import com.rain.photopicker.utils.UCropUtils; +import com.rain.photopicker.utils.UtilsHelper; +import com.rain.photopicker.weidget.GalleryImageView; import java.io.File; import java.util.ArrayList; @@ -42,19 +41,16 @@ */ public class PhotoPickAdapter extends RecyclerView.Adapter { - private Context context; + private AppCompatActivity context; private ArrayList photos = new ArrayList<>(); private ArrayList selectPhotosInfo = new ArrayList<>(); private int imageSize; - private Uri cameraUri; - private String cameraImagePath; - private String clipImagePath; private PhotoPickBean photoPickBean; private PhotoPreviewConfig.Builder previewBuilder; - public PhotoPickAdapter(Context context, PhotoPickBean pickBean) { + public PhotoPickAdapter(AppCompatActivity context, PhotoPickBean pickBean) { this.context = context; DisplayMetrics metrics = new DisplayMetrics(); Display display = ((Activity) context).getWindowManager().getDefaultDisplay(); @@ -111,18 +107,10 @@ public PhotoPickViewHolder(View view) { imageView.getLayoutParams().height = imageSize; imageView.getLayoutParams().width = imageSize; - checkbox.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - changeBoxState(getItem(getAdapterPosition())); - } - }); - itemView.findViewById(R.id.photo_pick_rl).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (PhotoPick.isTimeEnabled()) { - doSomeThing(); - } + checkbox.setOnClickListener(v -> changeBoxState(getItem(getAdapterPosition()))); + itemView.findViewById(R.id.photo_pick_rl).setOnClickListener(v -> { + if (PhotoPick.isTimeEnabled()) { + doSomeThing(); } }); } @@ -131,13 +119,13 @@ private void doSomeThing() { if (photoPickBean.isShowCamera() && getAdapterPosition() == 0) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //申请权限 - ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA}, PhotoPickActivity.REQUEST_CODE_CAMERA); + ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA}, PhotoPickerHelper.REQUEST_CODE_CAMERA); } else { - selectPicFromCamera(); + PhotoPickerHelper.startCamera(context); } } else if (photoPickBean.isClipPhoto()) { //头像裁剪 - startClipPic(getItem(getAdapterPosition()).getOriginalPath()); + PhotoPickerHelper.startClipPic(context, photoPickBean, getItem(getAdapterPosition()).getOriginalPath()); } else { //查看大图 previewBuilder.setPosition(photoPickBean.isShowCamera() ? getAdapterPosition() - 1 : getAdapterPosition()) @@ -198,50 +186,9 @@ public void showData(int position) { photoPickBean.getImageLoader().displayImage(context, photo.getOriginalPath(), imageView, true); } - } } - - /** - * 裁剪图片 - * - * @param picPath - */ - public void startClipPic(String picPath) { - String clipImageName = "clip_" + (System.currentTimeMillis() / 1000) + ".jpg"; - File clipImage = new File(PhotoPickOptions.DEFAULT.imagePath, clipImageName); - clipImagePath = clipImage.getAbsolutePath(); - UCropUtils.start((Activity) context, new File(picPath), clipImage, photoPickBean.getClipMode()); - } - - /** - * 启动Camera拍照 - */ - public void selectPicFromCamera() { - if (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { - Toast.makeText(context, R.string.cannot_take_pic, Toast.LENGTH_SHORT).show(); - return; - } - - //保存到自定义目录 - String cameraImageName = "camera_" + (System.currentTimeMillis() / 1000) + ".jpg"; - File imageFile = new File(PhotoPickOptions.DEFAULT.imagePath, cameraImageName); - cameraImagePath = imageFile.getAbsolutePath(); - Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - // Android7.0以上URI - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - //通过FileProvider创建一个content类型的Uri - cameraUri = FileProvider.getUriForFile(context, PhotoPickOptions.DEFAULT.photoPickAuthority, imageFile); - //添加这一句表示对目标应用临时授权该Uri所代表的文件,私有目录读写权限 - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - } else { - cameraUri = Uri.fromFile(imageFile); - } - intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); - ((Activity) context).startActivityForResult(intent, PhotoPickActivity.REQUEST_CODE_SHOW_CAMERA); - } - //如果是多选title才会变化,要不然单选的没有变 public String getTitle() { String title = context.getString(R.string.send); @@ -251,15 +198,6 @@ public String getTitle() { return title; } - /** - * get selected photos path - * - * @return selected photos - */ -// public ArrayList getSelectPhotos() { -// return selectPhotos; -// } - /** * get selected photos info * @@ -269,34 +207,6 @@ public ArrayList getSelectPhotosInfo() { return selectPhotosInfo; } - /** - * get camera image uri - * - * @return - */ - public Uri getCameraUri() { - return cameraUri; - } - - /** - * get clip image path - * - * @return - */ - public String getClipImagePath() { - return clipImagePath; - } - - /** - * get camera image path - * - * @return - */ - public String getCameraImagePath() { - return cameraImagePath; - } - - private OnUpdateListener onUpdateListener; public void setOnUpdateListener(OnUpdateListener onUpdateListener) { diff --git a/library/src/main/java/com/rain/library/utils/ExternalStorage.java b/photopicker/src/main/java/com/rain/photopicker/utils/ExternalStorage.java similarity index 98% rename from library/src/main/java/com/rain/library/utils/ExternalStorage.java rename to photopicker/src/main/java/com/rain/photopicker/utils/ExternalStorage.java index 5d255a2..ddb8870 100644 --- a/library/src/main/java/com/rain/library/utils/ExternalStorage.java +++ b/photopicker/src/main/java/com/rain/photopicker/utils/ExternalStorage.java @@ -1,4 +1,4 @@ -package com.rain.library.utils; +package com.rain.photopicker.utils; import android.Manifest; import android.content.Context; @@ -9,7 +9,8 @@ import android.text.TextUtils; import android.util.Log; -import com.rain.library.PhotoPickOptions; + +import com.rain.photopicker.PhotoPickOptions; import java.io.File; import java.io.IOException; diff --git a/library/src/main/java/com/rain/library/utils/MimeType.java b/photopicker/src/main/java/com/rain/photopicker/utils/MimeType.java similarity index 96% rename from library/src/main/java/com/rain/library/utils/MimeType.java rename to photopicker/src/main/java/com/rain/photopicker/utils/MimeType.java index 3318933..9cb97f5 100644 --- a/library/src/main/java/com/rain/library/utils/MimeType.java +++ b/photopicker/src/main/java/com/rain/photopicker/utils/MimeType.java @@ -1,11 +1,11 @@ -package com.rain.library.utils; +package com.rain.photopicker.utils; import android.content.Context; import android.media.MediaMetadataRetriever; import android.text.TextUtils; -import com.rain.library.R; -import com.rain.library.bean.MediaData; +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; import java.io.File; @@ -195,7 +195,7 @@ public static String createImageType(String path) { File file = new File(path); String fileName = file.getName(); int last = fileName.lastIndexOf(".") + 1; - String temp = fileName.substring(last, fileName.length()); + String temp = fileName.substring(last); return "image/" + temp; } } catch (Exception e) { @@ -245,7 +245,7 @@ public static String getLastImgType(String path) { try { int index = path.lastIndexOf("."); if (index > 0) { - String imageType = path.substring(index, path.length()); + String imageType = path.substring(index); switch (imageType) { case ".png": case ".PNG": diff --git a/photopicker/src/main/java/com/rain/photopicker/utils/PhotoPickerHelper.java b/photopicker/src/main/java/com/rain/photopicker/utils/PhotoPickerHelper.java new file mode 100644 index 0000000..804f4d3 --- /dev/null +++ b/photopicker/src/main/java/com/rain/photopicker/utils/PhotoPickerHelper.java @@ -0,0 +1,199 @@ +package com.rain.photopicker.utils; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.provider.MediaStore; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.FileProvider; + + +import com.rain.photopicker.PhotoPick; +import com.rain.photopicker.PhotoPickOptions; +import com.rain.photopicker.R; +import com.rain.photopicker.bean.MediaData; +import com.rain.photopicker.bean.PhotoPickBean; +import com.rain.photopicker.controller.PhotoPickConfig; +import com.rain.photopicker.impl.CommonResult; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.ListIterator; + +/** + * @Author : Rain + * @CreateDate : 2020/8/26 11:54 + * @Version : 1.0 + * @Descroption : + */ +public class PhotoPickerHelper { + + //相机图片Uri + private static Uri cameraUri; + + //相机图片路径 + private static String cameraImagePath; + + //裁剪图片路径 + private static String clipImagePath; + + //权限相关 + public static final int REQUEST_CODE_SDCARD = 100; //读写权限请求码 + public static final int REQUEST_CODE_CAMERA = 200; //拍照权限请求码 + + + public static final int CAMERA_REQUEST_CODE = 10001; + + + /** + * 开启拍照 + * + * @param context + */ + public static void startCamera(Activity context) { + if (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { + Toast.makeText(context, R.string.cannot_take_pic, Toast.LENGTH_SHORT).show(); + return; + } + + //保存到自定义目录 + String cameraImageName = "camera_" + (System.currentTimeMillis() / 1000) + ".jpg"; + File imageFile = new File(PhotoPickOptions.DEFAULT.imagePath, cameraImageName); + cameraImagePath = imageFile.getAbsolutePath(); + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + // Android7.0以上URI + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + //通过FileProvider创建一个content类型的Uri + cameraUri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", imageFile); + //添加这一句表示对目标应用临时授权该Uri所代表的文件,私有目录读写权限 + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + } else { + cameraUri = Uri.fromFile(imageFile); + } + intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); + context.startActivityForResult(intent, CAMERA_REQUEST_CODE); + + } + + + /** + * 裁剪图片 + * + * @param picPath + */ + public static void startClipPic(AppCompatActivity activity, PhotoPickBean photoPickBean, String picPath) { + String clipImageName = "clip_" + (System.currentTimeMillis() / 1000) + ".jpg"; + File clipImage = new File(PhotoPickOptions.DEFAULT.imagePath, clipImageName); + clipImagePath = clipImage.getAbsolutePath(); + UCropUtils.start(activity, new File(picPath), clipImage, photoPickBean.getClipMode()); + } + + /** + * 压缩并发送 + * + * @param context + */ + public static void startCompress(Activity context, PhotoPickBean pickBean) { + MediaData photo = new MediaData(); + photo.setCamera(true); + photo.setCameraImagePath(PhotoPickerHelper.getCameraImagePath()); + photo.setImageType(MimeType.createImageType(PhotoPickerHelper.getCameraImagePath())); + photo.setMimeType(MimeType.TYPE_IMAGE); + PhotoPick.startCompression(context, + new ArrayList<>(Arrays.asList(photo)), (CommonResult) (data, success) -> { + photo.setCompressed(success ? true : false); + photo.setCompressionPath(success ? data.getAbsolutePath() : + PhotoPickerHelper.getCameraImagePath()); + sendImages(context, pickBean, new ArrayList<>(Arrays.asList(photo))); + }); + } + + + /** + * 检测图片是否存在/损坏 + */ + public static void checkImages(ArrayList data) { + ListIterator iterator = data.listIterator(); + while (iterator.hasNext()) { + String mediaPath; + MediaData media = iterator.next(); + if (media.isClip()) { + mediaPath = media.getClipImagePath(); + } else if (media.isCamera()) { + mediaPath = media.getCameraImagePath(); + } else if (media.isCompressed()) { + mediaPath = media.getCompressionPath(); + } else { + mediaPath = media.getOriginalPath(); + } + + if (!new File(mediaPath).exists()) { + iterator.remove(); + } + } + } + + /** + * 发送图片 + */ + public static void sendImages(Activity context, PhotoPickBean pickBean, ArrayList data) { + if (!pickBean.isStartCompression()) { + PhotoPickerHelper.checkImages(data); + } + + if (pickBean.getCallback() != null) { + pickBean.getCallback().selectResult(data); + } else { + Intent intent = new Intent(); + intent.putParcelableArrayListExtra(PhotoPickConfig.EXTRA_SELECT_PHOTOS, data); + context.setResult(Activity.RESULT_OK, intent); + } + context.finish(); + } + + /** + * 发送相机拍摄照片 无压缩裁剪 + * + * @param context + * @param cameraImagePath + */ + public static void sendCameraImage(Activity context, PhotoPickBean pickBean, String cameraImagePath) { + MediaData mediaData = new MediaData(); + mediaData.setCamera(true); + mediaData.setMimeType(MimeType.TYPE_IMAGE); + mediaData.setImageType(MimeType.createImageType(cameraImagePath)); + mediaData.setCameraImagePath(cameraImagePath); + sendImages(context, pickBean, new ArrayList<>(Arrays.asList(mediaData))); + } + + /** + * 发送裁剪照片 + * + * @param context + */ + public static void sendClipImage(Activity context, PhotoPickBean pickBean) { + MediaData mediaData = new MediaData(); + mediaData.setClip(true); + mediaData.setMimeType(MimeType.TYPE_IMAGE); + mediaData.setImageType(MimeType.createImageType(getClipImagePath())); + mediaData.setClipImagePath(getClipImagePath()); + sendImages(context, pickBean, new ArrayList<>(Arrays.asList(mediaData))); + } + + + public static Uri getCameraUri() { + return cameraUri; + } + + public static String getCameraImagePath() { + return cameraImagePath; + } + + public static String getClipImagePath() { + return clipImagePath; + } +} diff --git a/library/src/main/java/com/rain/library/utils/Rlog.java b/photopicker/src/main/java/com/rain/photopicker/utils/Rlog.java similarity index 98% rename from library/src/main/java/com/rain/library/utils/Rlog.java rename to photopicker/src/main/java/com/rain/photopicker/utils/Rlog.java index e7eabc6..c3ed88a 100644 --- a/library/src/main/java/com/rain/library/utils/Rlog.java +++ b/photopicker/src/main/java/com/rain/photopicker/utils/Rlog.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.rain.library.utils; +package com.rain.photopicker.utils; import android.text.TextUtils; import android.util.Log; @@ -35,12 +35,14 @@ /** - * Created by Gh0st on 2016/6/7 007. - * https://github.com/ZhaoKaiQiang/KLog - * 日志工具 + * @author duyu + * @version 1.0 + * @desc 日志工具 + * @filename Rlog.java + * @date 2020/4/16 10:33 */ public class Rlog { - private static String TAG = "Entrepreneurial"; + private static String TAG = "Crow"; private static boolean LOG_DEBUG = true; private static final String LINE_SEPARATOR = System.getProperty("line.separator"); private static final int VERBOSE = 2; diff --git a/library/src/main/java/com/rain/library/utils/UCropUtils.java b/photopicker/src/main/java/com/rain/photopicker/utils/UCropUtils.java similarity index 54% rename from library/src/main/java/com/rain/library/utils/UCropUtils.java rename to photopicker/src/main/java/com/rain/photopicker/utils/UCropUtils.java index 29bc359..fcc3be9 100644 --- a/library/src/main/java/com/rain/library/utils/UCropUtils.java +++ b/photopicker/src/main/java/com/rain/photopicker/utils/UCropUtils.java @@ -1,10 +1,11 @@ -package com.rain.library.utils; +package com.rain.photopicker.utils; -import android.app.Activity; import android.graphics.Bitmap; import android.net.Uri; -import com.rain.library.PhotoPick; +import androidx.appcompat.app.AppCompatActivity; + +import com.rain.photopicker.PhotoPick; import com.yalantis.ucrop.UCrop; import com.yalantis.ucrop.UCropActivity; @@ -15,26 +16,21 @@ * Created by Administrator on 2017/5/3 0003. */ public class UCropUtils { - public static void start(Activity mActivity, File sourceFile, File destinationFile, boolean showClipCircle) { + public static void start(AppCompatActivity mActivity, File sourceFile, File destinationFile, boolean showClipCircle) { UCrop uCrop = UCrop.of(Uri.fromFile(sourceFile), Uri.fromFile(destinationFile)); //.withAspectRatio(aspectRatioX, aspectRatioY) //动态的设置图片的宽高比 UCrop.Options options = new UCrop.Options(); - options.useSourceImageAspectRatio(); //设置为图片原始宽高比列一样 + options.useSourceImageAspectRatio(); //设置为图片原始宽高比列一样 //options.withMaxResultSize(500, 500); //设置将被载入裁剪图片的最大尺寸 //设置裁剪图片可操作的手势 options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL); - options.setCompressionQuality(100); //设置裁剪的图片质量 - options.setCompressionFormat(Bitmap.CompressFormat.PNG); //设置裁剪出来图片的格式 - options.setFreeStyleCropEnabled(true); //可以调整裁剪框 - if (showClipCircle == true) { - options.setCircleDimmedLayer(true); //设置裁剪框圆形 - options.setShowCropFrame(false); //设置是否展示矩形裁剪框 - options.setShowCropGrid(false); //是否显示裁剪框网格 - } else { - options.setShowCropFrame(true); //设置是否展示矩形裁剪框 - options.setShowCropGrid(true); - } + options.setCompressionQuality(100); //设置裁剪的图片质量 + options.setCompressionFormat(Bitmap.CompressFormat.PNG); //设置裁剪出来图片的格式 + options.setFreeStyleCropEnabled(true); //可以调整裁剪框 + options.setCircleDimmedLayer(showClipCircle ? true : false); //设置裁剪框圆形 + options.setShowCropFrame(showClipCircle ? false : true); //设置是否展示矩形裁剪框 + options.setShowCropGrid(showClipCircle ? false : true); //是否显示裁剪框网格 options.setToolbarColor(PhotoPick.getToolbarBackGround()); options.setStatusBarColor(PhotoPick.getToolbarBackGround()); diff --git a/library/src/main/java/com/rain/library/utils/UtilsHelper.java b/photopicker/src/main/java/com/rain/photopicker/utils/UtilsHelper.java similarity index 99% rename from library/src/main/java/com/rain/library/utils/UtilsHelper.java rename to photopicker/src/main/java/com/rain/photopicker/utils/UtilsHelper.java index 5444281..a8ef5aa 100644 --- a/library/src/main/java/com/rain/library/utils/UtilsHelper.java +++ b/photopicker/src/main/java/com/rain/photopicker/utils/UtilsHelper.java @@ -1,4 +1,4 @@ -package com.rain.library.utils; +package com.rain.photopicker.utils; import android.app.Activity; import android.content.ContentUris; @@ -14,7 +14,8 @@ import android.util.DisplayMetrics; import android.view.WindowManager; -import com.rain.library.PhotoPick; + +import com.rain.photopicker.PhotoPick; import java.io.File; import java.text.DecimalFormat; diff --git a/library/src/main/java/com/rain/library/weidget/GalleryImageView.java b/photopicker/src/main/java/com/rain/photopicker/weidget/GalleryImageView.java similarity index 95% rename from library/src/main/java/com/rain/library/weidget/GalleryImageView.java rename to photopicker/src/main/java/com/rain/photopicker/weidget/GalleryImageView.java index e886753..1d9ab49 100644 --- a/library/src/main/java/com/rain/library/weidget/GalleryImageView.java +++ b/photopicker/src/main/java/com/rain/photopicker/weidget/GalleryImageView.java @@ -1,18 +1,19 @@ -package com.rain.library.weidget; +package com.rain.photopicker.weidget; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; -import android.widget.ImageView; + +import androidx.appcompat.widget.AppCompatImageView; /** * Describe :自定义 Image 用来兼容 fresco * Email:baossrain99@163.com * Created by Rain on 17-5-3. */ -public class GalleryImageView extends ImageView { +public class GalleryImageView extends AppCompatImageView { private static final String TAG = "GalleryImageView"; diff --git a/library/src/main/java/com/rain/library/weidget/HackyViewPager.java b/photopicker/src/main/java/com/rain/photopicker/weidget/HackyViewPager.java similarity index 94% rename from library/src/main/java/com/rain/library/weidget/HackyViewPager.java rename to photopicker/src/main/java/com/rain/photopicker/weidget/HackyViewPager.java index 0c8de0a..c237317 100644 --- a/library/src/main/java/com/rain/library/weidget/HackyViewPager.java +++ b/photopicker/src/main/java/com/rain/photopicker/weidget/HackyViewPager.java @@ -1,11 +1,12 @@ -package com.rain.library.weidget; +package com.rain.photopicker.weidget; import android.content.Context; -import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; +import androidx.viewpager.widget.ViewPager; + /** * Describe : 重写ViewPager * Email:baossrain99@163.com diff --git a/library/src/main/java/com/rain/library/weidget/LoadingDialog.java b/photopicker/src/main/java/com/rain/photopicker/weidget/LoadingDialog.java similarity index 80% rename from library/src/main/java/com/rain/library/weidget/LoadingDialog.java rename to photopicker/src/main/java/com/rain/photopicker/weidget/LoadingDialog.java index 7b1be90..23adb78 100644 --- a/library/src/main/java/com/rain/library/weidget/LoadingDialog.java +++ b/photopicker/src/main/java/com/rain/photopicker/weidget/LoadingDialog.java @@ -1,11 +1,13 @@ -package com.rain.library.weidget; +package com.rain.photopicker.weidget; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v7.app.AlertDialog; -import com.rain.library.R; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; + +import com.rain.photopicker.R; + /** * @author:duyu diff --git a/library/src/main/res/anim/image_pager_enter_animation.xml b/photopicker/src/main/res/anim/image_pager_enter_animation.xml similarity index 100% rename from library/src/main/res/anim/image_pager_enter_animation.xml rename to photopicker/src/main/res/anim/image_pager_enter_animation.xml diff --git a/library/src/main/res/anim/image_pager_exit_animation.xml b/photopicker/src/main/res/anim/image_pager_exit_animation.xml similarity index 100% rename from library/src/main/res/anim/image_pager_exit_animation.xml rename to photopicker/src/main/res/anim/image_pager_exit_animation.xml diff --git a/library/src/main/res/drawable/gif_tag.xml b/photopicker/src/main/res/drawable/gif_tag.xml similarity index 100% rename from library/src/main/res/drawable/gif_tag.xml rename to photopicker/src/main/res/drawable/gif_tag.xml diff --git a/library/src/main/res/layout/activity_photo_pick.xml b/photopicker/src/main/res/layout/activity_photo_pick.xml similarity index 80% rename from library/src/main/res/layout/activity_photo_pick.xml rename to photopicker/src/main/res/layout/activity_photo_pick.xml index 0cbd49d..07bec01 100644 --- a/library/src/main/res/layout/activity_photo_pick.xml +++ b/photopicker/src/main/res/layout/activity_photo_pick.xml @@ -1,14 +1,13 @@ - - + - - + android:layout_weight="1" /> + android:background="@color/fresco_wait_color" /> + android:textSize="@dimen/text_size_16sp" /> - + android:layout_height="match_parent" /> diff --git a/library/src/main/res/layout/activity_photo_select.xml b/photopicker/src/main/res/layout/activity_photo_select.xml similarity index 97% rename from library/src/main/res/layout/activity_photo_select.xml rename to photopicker/src/main/res/layout/activity_photo_select.xml index 05046f7..9e3c0c9 100644 --- a/library/src/main/res/layout/activity_photo_select.xml +++ b/photopicker/src/main/res/layout/activity_photo_select.xml @@ -6,7 +6,7 @@ - - - - \ No newline at end of file + toolbar:titleTextAppearance="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"/> \ No newline at end of file diff --git a/library/src/main/res/menu/menu_ok.xml b/photopicker/src/main/res/menu/menu_ok.xml similarity index 100% rename from library/src/main/res/menu/menu_ok.xml rename to photopicker/src/main/res/menu/menu_ok.xml diff --git a/library/src/main/res/mipmap-hdpi/bg_video_info.png b/photopicker/src/main/res/mipmap-hdpi/bg_video_info.png similarity index 100% rename from library/src/main/res/mipmap-hdpi/bg_video_info.png rename to photopicker/src/main/res/mipmap-hdpi/bg_video_info.png diff --git a/library/src/main/res/mipmap-hdpi/failure_image.jpg b/photopicker/src/main/res/mipmap-hdpi/failure_image.jpg similarity index 100% rename from library/src/main/res/mipmap-hdpi/failure_image.jpg rename to photopicker/src/main/res/mipmap-hdpi/failure_image.jpg diff --git a/library/src/main/res/mipmap-hdpi/ic_launcher.png b/photopicker/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from library/src/main/res/mipmap-hdpi/ic_launcher.png rename to photopicker/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/library/src/main/res/mipmap-hdpi/icon_back.png b/photopicker/src/main/res/mipmap-hdpi/icon_back.png similarity index 100% rename from library/src/main/res/mipmap-hdpi/icon_back.png rename to photopicker/src/main/res/mipmap-hdpi/icon_back.png diff --git a/library/src/main/res/mipmap-hdpi/icon_paly.png b/photopicker/src/main/res/mipmap-hdpi/icon_paly.png similarity index 100% rename from library/src/main/res/mipmap-hdpi/icon_paly.png rename to photopicker/src/main/res/mipmap-hdpi/icon_paly.png diff --git a/library/src/main/res/mipmap-hdpi/icon_video.png b/photopicker/src/main/res/mipmap-hdpi/icon_video.png similarity index 100% rename from library/src/main/res/mipmap-hdpi/icon_video.png rename to photopicker/src/main/res/mipmap-hdpi/icon_video.png diff --git a/library/src/main/res/mipmap-hdpi/select_icon.png b/photopicker/src/main/res/mipmap-hdpi/select_icon.png similarity index 100% rename from library/src/main/res/mipmap-hdpi/select_icon.png rename to photopicker/src/main/res/mipmap-hdpi/select_icon.png diff --git a/library/src/main/res/mipmap-hdpi/take_photo.jpg b/photopicker/src/main/res/mipmap-hdpi/take_photo.jpg similarity index 100% rename from library/src/main/res/mipmap-hdpi/take_photo.jpg rename to photopicker/src/main/res/mipmap-hdpi/take_photo.jpg diff --git a/library/src/main/res/values/attrs.xml b/photopicker/src/main/res/values/attrs.xml similarity index 100% rename from library/src/main/res/values/attrs.xml rename to photopicker/src/main/res/values/attrs.xml diff --git a/library/src/main/res/values/colors.xml b/photopicker/src/main/res/values/colors.xml similarity index 100% rename from library/src/main/res/values/colors.xml rename to photopicker/src/main/res/values/colors.xml diff --git a/library/src/main/res/values/dimens.xml b/photopicker/src/main/res/values/dimens.xml similarity index 100% rename from library/src/main/res/values/dimens.xml rename to photopicker/src/main/res/values/dimens.xml diff --git a/library/src/main/res/values/strings.xml b/photopicker/src/main/res/values/strings.xml similarity index 100% rename from library/src/main/res/values/strings.xml rename to photopicker/src/main/res/values/strings.xml diff --git a/library/src/main/res/values/styles.xml b/photopicker/src/main/res/values/styles.xml similarity index 100% rename from library/src/main/res/values/styles.xml rename to photopicker/src/main/res/values/styles.xml diff --git a/library/src/test/java/com/rain/library/ExampleUnitTest.java b/photopicker/src/test/java/com/rain/photopicker/ExampleUnitTest.java similarity index 79% rename from library/src/test/java/com/rain/library/ExampleUnitTest.java rename to photopicker/src/test/java/com/rain/photopicker/ExampleUnitTest.java index 6d8fb40..061965c 100644 --- a/library/src/test/java/com/rain/library/ExampleUnitTest.java +++ b/photopicker/src/test/java/com/rain/photopicker/ExampleUnitTest.java @@ -1,4 +1,4 @@ -package com.rain.library; +package com.rain.photopicker; import org.junit.Test; @@ -11,7 +11,7 @@ */ public class ExampleUnitTest { @Test - public void addition_isCorrect() throws Exception { + public void addition_isCorrect() { assertEquals(4, 2 + 2); } } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 3306997..8808760 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ -include ':app', ':library' +include ':photopicker' +include ':app' diff --git a/version.gradle b/version.gradle new file mode 100644 index 0000000..e6db98c --- /dev/null +++ b/version.gradle @@ -0,0 +1,24 @@ +ext { + android = [ + compileSdkVersion: 28, + buildToolsVersion: "28.0.3", + minSdkVersion : 15, + targetSdkVersion : 28, + versionCode : 23, + versionName : "2.0.3" + ] + + dependencies = [ + "appcompat" : "androidx.appcompat:appcompat:1.1.0", + "constraintlayout" : "androidx.constraintlayout:constraintlayout:1.1.3", + + "multidex" : "androidx.multidex:multidex:2.0.0", + "glide" : "com.github.bumptech.glide:glide:4.8.0", + + "photoView" : "com.github.chrisbanes:PhotoView:2.3.0", + "luban" : "top.zibin:Luban:1.1.8", + "ucrop" : "com.github.yalantis:ucrop:2.2.4", + "subsampling_imageView": "com.davemorrissey.labs:subsampling-scale-image-view:3.10.0", + "slidinguppanel" : "com.sothree.slidinguppanel:library:3.4.0" + ] +} \ No newline at end of file