From cf34c7d9366a7162048af6c2b6ed105cd4f49379 Mon Sep 17 00:00:00 2001 From: fuzhengyin <89236842+fuzhengyin@users.noreply.github.com> Date: Tue, 30 Nov 2021 11:37:27 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=85=BC=E5=AE=B9Android=2011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filepicker/model/MediaFileDataSource.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java index 2f34bc7..d601963 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java @@ -20,9 +20,11 @@ import android.database.Cursor; import android.net.Uri; import android.os.Build; +import android.os.Bundle; import android.provider.MediaStore; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.core.content.ContentResolverCompat; import androidx.paging.DataSource; import androidx.paging.PositionalDataSource; @@ -52,6 +54,9 @@ public class MediaFileDataSource extends PositionalDataSource { private String[] projection; private String sortOrder; + + private String sortColumn; + private int sortDirection; private String selection; private String[] selectionArgs; private Uri uri; @@ -141,7 +146,9 @@ private MediaFileDataSource(ContentResolver contentResolver, Uri uri, @NonNull C } this.projection = projection.toArray(new String[0]); + this.sortColumn = DATE_ADDED; this.sortOrder = DATE_ADDED + " DESC"; + this.sortDirection =ContentResolver.QUERY_SORT_DIRECTION_DESCENDING; this.selection = selectionBuilder.toString(); this.selectionArgs = selectionArgs.toArray(new String[0]); } @@ -155,8 +162,22 @@ public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialC public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback callback) { callback.onResult(getMediaFiles(params.startPosition, params.loadSize)); } - + @RequiresApi(api = Build.VERSION_CODES.O) + private Bundle create(int limit, int offset) { + Bundle bundle = new Bundle(); + bundle.putInt(ContentResolver.QUERY_ARG_LIMIT, limit); + bundle.putInt(ContentResolver.QUERY_ARG_OFFSET, offset); + bundle.putString(ContentResolver.QUERY_ARG_SORT_COLUMNS, sortColumn); + bundle.putInt(ContentResolver.QUERY_ARG_SORT_DIRECTION, sortDirection); + bundle.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, selection); + bundle.putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, selectionArgs); + return bundle; + } private List getMediaFiles(int offset, int limit) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + Cursor query = contentResolver.query(uri, projection, create(limit, offset), null); + return MediaFileLoader.asMediaFiles(query, configs); + } Cursor data = ContentResolverCompat.query(contentResolver, uri, projection, selection, selectionArgs, sortOrder + " LIMIT " + limit + " OFFSET " + offset, null); From d473370ad45229faa58e3f9bb0891ee061824312 Mon Sep 17 00:00:00 2001 From: fuzhengyin <89236842+fuzhengyin@users.noreply.github.com> Date: Tue, 30 Nov 2021 12:18:55 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=85=BC=E5=AE=B9Android=2011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filepicker/model/MediaFileDataSource.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java index d601963..0707189 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java @@ -167,14 +167,16 @@ private Bundle create(int limit, int offset) { Bundle bundle = new Bundle(); bundle.putInt(ContentResolver.QUERY_ARG_LIMIT, limit); bundle.putInt(ContentResolver.QUERY_ARG_OFFSET, offset); - bundle.putString(ContentResolver.QUERY_ARG_SORT_COLUMNS, sortColumn); - bundle.putInt(ContentResolver.QUERY_ARG_SORT_DIRECTION, sortDirection); + if (sortColumn !=null && sortColumn.trim().length() != 0) { + bundle.putString(ContentResolver.QUERY_ARG_SORT_COLUMNS, sortColumn); + bundle.putInt(ContentResolver.QUERY_ARG_SORT_DIRECTION, sortDirection); + } bundle.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, selection); bundle.putStringArray(ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS, selectionArgs); return bundle; } private List getMediaFiles(int offset, int limit) { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + if (android.os.Build.VERSION.SDK_INT >= 30) { Cursor query = contentResolver.query(uri, projection, create(limit, offset), null); return MediaFileLoader.asMediaFiles(query, configs); } From db9ee6f67867837d8c54a96445d81cd662c1fe30 Mon Sep 17 00:00:00 2001 From: fuzhengyin <89236842+fuzhengyin@users.noreply.github.com> Date: Wed, 1 Dec 2021 17:13:46 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=9C=A8=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E8=80=97=E6=97=B6=E8=BF=87=E9=95=BF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filepickersample/MainActivity.java | 2 ++ .../activity/FilePickerActivity.java | 6 +++- .../filepicker/config/Configurations.java | 4 +-- .../filepicker/model/DirViewModel.java | 4 +-- .../filepicker/model/MediaFileDataSource.java | 34 +++++++++++-------- .../filepicker/model/MediaFileLoader.java | 3 ++ .../filepicker/model/MediaFileViewModel.java | 10 +++--- 7 files changed, 38 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java b/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java index 2ba37e5..00db73e 100644 --- a/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java +++ b/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java @@ -107,6 +107,8 @@ public void onClick(View v) { .setCheckPermission(true) .setShowImages(false) .setShowVideos(false) + .setIgnoreHiddenFile(false) + .setIgnoreNoMedia(false) .setShowAudios(true) .setSingleChoiceMode(true) .setSelectedMediaFile(file) diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java index 443a47e..a619110 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/activity/FilePickerActivity.java @@ -28,6 +28,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.webkit.MimeTypeMap; @@ -81,7 +82,7 @@ public class FilePickerActivity extends AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + long current = System.currentTimeMillis(); configs = getIntent().getParcelableExtra(CONFIGS); if (configs == null) { configs = new Configurations.Builder().build(); @@ -169,6 +170,7 @@ public boolean isAutoMeasureEnabled() { if (maxCount > 0) { setTitle(getResources().getString(title_res, fileGalleryAdapter.getSelectedItemCount(), maxCount, title)); } + Log.i(TAG, "onCreate: ms:"+(System.currentTimeMillis() - current)); } private boolean useDocumentUi() { @@ -191,6 +193,7 @@ public void onChanged(PagedList mediaFiles) { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + Log.d(TAG, "onRequestPermissionsResult() called with: requestCode = [" + requestCode + "], permissions = [" + permissions + "], grantResults = [" + grantResults + "]"); if (requestCode == REQUEST_WRITE_PERMISSION) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { loadFiles(); @@ -212,6 +215,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis @SuppressLint("NewApi") @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + Log.d(TAG, "onActivityResult() called with: requestCode = [" + requestCode + "], resultCode = [" + resultCode + "], data = [" + data + "]"); if (requestCode == FileGalleryAdapter.CAPTURE_IMAGE_VIDEO) { if (resultCode == RESULT_OK) { String path = fileGalleryAdapter.getLastCapturedFile(); diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java index e62e83b..a3e0a0c 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java @@ -40,8 +40,8 @@ public Configurations[] newArray(int size) { } }; - public static int PAGE_SIZE = 120; - public static int PREFETCH_DISTANCE = 40; + public static int PAGE_SIZE = 30; + public static int PREFETCH_DISTANCE = 10; private final boolean imageCaptureEnabled; private final boolean videoCaptureEnabled; diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/DirViewModel.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/DirViewModel.java index 488ef24..792ac73 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/DirViewModel.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/DirViewModel.java @@ -51,8 +51,8 @@ public void refresh() { } public static class Factory extends ViewModelProvider.NewInstanceFactory { - private ContentResolver contentResolver; - private Configurations configs; + private final ContentResolver contentResolver; + private final Configurations configs; public Factory(ContentResolver contentResolver, Configurations configs) { this.contentResolver = contentResolver; diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java index 0707189..ce8f97f 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java @@ -22,6 +22,7 @@ import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; @@ -49,17 +50,17 @@ public class MediaFileDataSource extends PositionalDataSource { - private Configurations configs; - private ContentResolver contentResolver; + private final Configurations configs; + private final ContentResolver contentResolver; - private String[] projection; - private String sortOrder; + private final String[] projection; + private final String sortOrder; - private String sortColumn; - private int sortDirection; - private String selection; - private String[] selectionArgs; - private Uri uri; + private final String sortColumn; + private final int sortDirection; + private final String selection; + private final String[] selectionArgs; + private final Uri uri; private MediaFileDataSource(ContentResolver contentResolver, Uri uri, @NonNull Configurations configs, Long dirId) { this.contentResolver = contentResolver; @@ -132,7 +133,6 @@ private MediaFileDataSource(ContentResolver contentResolver, Uri uri, @NonNull C if (canUseAlbumId(configs)) { projection.add(MediaStore.Audio.AudioColumns.ALBUM_ID); } - List folders = getFoldersToIgnore(contentResolver, configs); if (folders.size() > 0) { selectionBuilder.append(" and(").append(DATA).append(" NOT LIKE ? "); @@ -144,13 +144,13 @@ private MediaFileDataSource(ContentResolver contentResolver, Uri uri, @NonNull C } selectionBuilder.append(")"); } - this.projection = projection.toArray(new String[0]); this.sortColumn = DATE_ADDED; this.sortOrder = DATE_ADDED + " DESC"; this.sortDirection =ContentResolver.QUERY_SORT_DIRECTION_DESCENDING; this.selection = selectionBuilder.toString(); this.selectionArgs = selectionArgs.toArray(new String[0]); + } @Override @@ -176,6 +176,7 @@ private Bundle create(int limit, int offset) { return bundle; } private List getMediaFiles(int offset, int limit) { + Log.i("Fuzhengyin", "getMediaFiles: offset:"+offset+" limit:"+limit); if (android.os.Build.VERSION.SDK_INT >= 30) { Cursor query = contentResolver.query(uri, projection, create(limit, offset), null); return MediaFileLoader.asMediaFiles(query, configs); @@ -199,6 +200,9 @@ private static boolean canUseMediaType(Configurations configs) { @NonNull private static List getFoldersToIgnore(ContentResolver contentResolver, Configurations configs) { + if (!configs.isIgnoreHiddenFile() && !configs.isIgnoreNoMediaDir() && configs.getIgnorePathMatchers() == null) { + return new ArrayList<>(); + } Uri uri = MediaStore.Files.getContentUri("external"); String[] projection = new String[]{DATA}; @@ -280,11 +284,11 @@ private static boolean isExcluded(String path, List ignoredPaths) { } public static class Factory extends DataSource.Factory { - private ContentResolver contentResolver; - private Configurations configs; - private Long dirId; + private final ContentResolver contentResolver; + private final Configurations configs; + private final Long dirId; - private Uri uri; + private final Uri uri; Factory(ContentResolver contentResolver, Configurations configs, Long dirId) { this.contentResolver = contentResolver; diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileLoader.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileLoader.java index ffe1fbb..92284ac 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileLoader.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileLoader.java @@ -23,6 +23,7 @@ import android.os.Build; import android.provider.MediaStore; import android.text.TextUtils; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -81,6 +82,7 @@ static Uri getContentUri(Configurations configs) { } static List asMediaFiles(Cursor data, Configurations configs) { + long current = System.currentTimeMillis(); ArrayList mediaFiles = new ArrayList<>(data.getCount()); if (data.moveToFirst()) do { @@ -89,6 +91,7 @@ static List asMediaFiles(Cursor data, Configurations configs) { mediaFiles.add(mediaFile); } } while (data.moveToNext()); + Log.i("Fuzhengyin", "asMediaFiles: ms:"+(System.currentTimeMillis() - current)); return mediaFiles; } diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileViewModel.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileViewModel.java index c8518ee..7854afe 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileViewModel.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileViewModel.java @@ -29,10 +29,10 @@ import com.jaiselrahman.filepicker.config.Configurations; public class MediaFileViewModel extends ViewModel { - private ContentResolver contentResolver; + private final ContentResolver contentResolver; public LiveData> mediaFiles; - private ContentObserver contentObserver = new ContentObserver(null) { + private final ContentObserver contentObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange) { refresh(); @@ -69,9 +69,9 @@ public void refresh() { } public static class Factory extends ViewModelProvider.NewInstanceFactory { - private ContentResolver contentResolver; - private Configurations configs; - private Long dirId; + private final ContentResolver contentResolver; + private final Configurations configs; + private final Long dirId; public Factory(ContentResolver contentResolver, Configurations configs, Long dirId) { this.contentResolver = contentResolver; From 8c16051683a2da4fae0d2818f138c7509257a213 Mon Sep 17 00:00:00 2001 From: fuzhengyin <89236842+fuzhengyin@users.noreply.github.com> Date: Mon, 6 Dec 2021 17:37:12 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0audio=20=E7=9A=84?= =?UTF-8?q?=E5=90=8E=E7=BC=80=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- .../jaiselrahman/filepickersample/MainActivity.java | 1 + .../filepicker/config/Configurations.java | 5 +++++ .../filepicker/model/MediaFileDataSource.java | 12 ++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a3267cb..3c14284 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![API](https://img.shields.io/badge/API-14%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=14) -[![jitPack](https://jitpack.io/v/jaiselrahman/FilePicker.svg)](https://jitpack.io/#jaiselrahman/FilePicker) -[![Monthly Downloads](https://jitpack.io/v/jaiselrahman/FilePicker/month.svg)](https://jitpack.io/#jaiselrahman/FilePicker) -[![Weekly Downloads](https://jitpack.io/v/jaiselrahman/FilePicker/week.svg)](https://jitpack.io/#jaiselrahman/FilePicker) +[![](https://jitpack.io/v/fuzhengyin/FilePicker.svg)](https://jitpack.io/#fuzhengyin/FilePicker) +[![Monthly Downloads](https://jitpack.io/v/jaiselrahman/FilePicker/month.svg)](https://jitpack.io/#fuzhengyin/FilePicker) +[![Weekly Downloads](https://jitpack.io/v/jaiselrahman/FilePicker/week.svg)](https://jitpack.io/#fuzhengyin/FilePicker) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-FilePicker-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/7002) A FilePicker library for Android for selecting multiple types of files and also to capture Images and Videos. diff --git a/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java b/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java index 00db73e..41b88f8 100644 --- a/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java +++ b/app/src/main/java/com/jaiselrahman/filepickersample/MainActivity.java @@ -111,6 +111,7 @@ public void onClick(View v) { .setIgnoreNoMedia(false) .setShowAudios(true) .setSingleChoiceMode(true) + .setSuffixes("mp3") .setSelectedMediaFile(file) .setTitle("Select an audio") .build()); diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java index a3e0a0c..fe2ef6b 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/config/Configurations.java @@ -345,6 +345,11 @@ public Builder setRootPath(String rootPath) { return this; } + /** + * 根据后缀名过滤 + * @param suffixes 不需要在后缀名前面添加`.` 内部会自动添加 + * @return + */ public Builder setSuffixes(String... suffixes) { this.suffixes = suffixes; return this; diff --git a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java index ce8f97f..6124154 100644 --- a/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java +++ b/filepicker/src/main/java/com/jaiselrahman/filepicker/model/MediaFileDataSource.java @@ -120,6 +120,18 @@ private MediaFileDataSource(ContentResolver contentResolver, Uri uri, @NonNull C selectionBuilder.append(") and "); } + if (configs.isShowAudios()) { + String[] suffixes = configs.getSuffixes(); + if (suffixes.length > 0) { + selectionBuilder.append("("); + for (String suffix : suffixes) { + selectionBuilder.append(DATA).append(" like '%.").append(suffix).append("' or "); + } + selectionBuilder.delete(selectionBuilder.length()-4, selectionBuilder.length()); + selectionBuilder.append(") AND "); + } + } + if (configs.isSkipZeroSizeFiles()) { selectionBuilder.append(SIZE).append(" > 0 "); }