android 13 LoaderManager AsyncTaskLoader读取手机图片 ,Java

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());
        }
    }
}

android 13读取本机所有图片名和存储绝对路径,Java_zhangphil的博客-CSDN博客【Android设置头像,手机拍照或从本地相册选取图片作为头像】像微信、QQ、微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式:1,让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像。Android设置头像,手机拍照或从本地相册选取图片作为头像_android 头像拍照_zhangphil的博客-CSDN博客。Android图片添加文字水印并保存水印文字图片到指定文件_zhangphil的博客-CSDN博客。https://blog.csdn.net/zhangphil/article/details/129639271

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/129640078
今日推荐