android 13 LoaderManager AsyncTaskLoader读取手机图片 ,Java
权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
package zhangphil.app;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.AsyncTaskLoader;
import androidx.loader.content.Loader;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static String TAG = "fly";
private LoaderManager loaderManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupLoader();
}
private static class Photo {
private String name;//名称
private String date;//日期
private long size; //大小
private String path;//路径
public Photo(String name, String date, long size, String path) {
this.name = name;
this.date = date;
this.size = size;
this.path = path;
}
}
private static List<Photo> readImage(Context context) {
List<Photo> photoList = new ArrayList<>();
//读取手机图片
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
//图片的路径
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
//图片名称
String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));
//图片最后修改日期
//String date_modified = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_MODIFIED));
File file = new File(path);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String date = sdf.format(new Date(file.lastModified()));
//图片大小
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE));
Photo photo = new Photo(name, date, size, path);
photoList.add(photo);
}
return photoList;
}
private void setupLoader() {
loaderManager = LoaderManager.getInstance(this);
loaderManager.initLoader(2023, new Bundle(), loaderCallbacks);
}
private LoaderManager.LoaderCallbacks loaderCallbacks = new LoaderManager.LoaderCallbacks<List<Photo>>() {
@NonNull
@Override
public MyLoader onCreateLoader(int id, @Nullable Bundle args) {
Log.d(TAG, "onCreateLoader- id - " + id);
MyLoader loader = new MyLoader(getApplicationContext());
return loader;
}
@Override
public void onLoadFinished(@NonNull Loader<List<Photo>> loader, List<Photo> photos) {
Log.d(TAG, "onLoadFinished- " + loader.getId() + " - " + photos);
for (Photo p : photos) {
Log.d(TAG, p.name + " " + p.date + " " + p.size + " " + p.path);
}
}
@Override
public void onLoaderReset(@NonNull Loader loader) {
}
};
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "---");
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
private static class MyLoader extends AsyncTaskLoader<List<Photo>> {
private Context context;
public MyLoader(@NonNull Context context) {
super(context);
this.context = context;
}
@Override
protected void onStartLoading() {
super.onStartLoading();
Log.d(TAG, "onStartLoading- " + getId());
this.forceLoad();
}
//work thread
@Nullable
@Override
public List<Photo> loadInBackground() {
return readImage(context);
}
//UI main thread
@Override
public void deliverResult(@Nullable List<Photo> photos) {
super.deliverResult(photos);
Log.d(TAG, "deliverResult- " + getId() + " 图片总量:" + photos.size());
}
@Override
public void onContentChanged() {
super.onContentChanged();
Log.d(TAG, "onContentChanged- " + getId());
}
}
}