Android显示相册图片的实现流程

要在Android应用中显示相册图片,可以按照以下步骤进行:

  1. 获取访问相册的权限
  2. 创建一个用于显示相册图片的界面
  3. 加载相册图片数据
  4. 显示相册图片

下面将详细介绍每一步的具体操作和相应的代码。

步骤一:获取访问相册的权限

在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

这样应用就具有了读取外部存储设备的权限。

步骤二:创建用于显示相册图片的界面

在布局文件中添加一个RecyclerView用于显示图片列表,一个ImageView用于显示选中的图片。

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    ... />

<ImageView
    android:id="@+id/imageView"
    ... />

步骤三:加载相册图片数据

首先需要创建一个类来表示相册图片的数据模型,例如Photo类:

public class Photo {
    private String path;

    public Photo(String path) {
        this.path = path;
    }

    public String getPath() {
        return path;
    }
}

然后创建一个Adapter类用于绑定数据和显示图片列表:

public class PhotoAdapter extends RecyclerView.Adapter<PhotoAdapter.ViewHolder> {
    private List<Photo> photoList;

    public PhotoAdapter(List<Photo> photoList) {
        this.photoList = photoList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_photo, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Photo photo = photoList.get(position);
        // 使用图片加载库加载图片
        Glide.with(holder.imageView)
                .load(photo.getPath())
                .into(holder.imageView);
    }

    @Override
    public int getItemCount() {
        return photoList.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
        }
    }
}

步骤四:显示相册图片

在Activity或Fragment中,首先获取权限,然后加载相册图片数据并显示在RecyclerView中。

public class GalleryActivity extends AppCompatActivity {
    private static final int REQUEST_PERMISSION = 1;

    private List<Photo> photoList;
    private RecyclerView recyclerView;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gallery);

        recyclerView = findViewById(R.id.recyclerView);
        imageView = findViewById(R.id.imageView);

        // 检查是否具有读取外部存储设备权限
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            // 请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_PERMISSION);
        } else {
            // 已有权限,加载相册图片数据
            loadPhotos();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_PERMISSION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被授予,加载相册图片数据
                loadPhotos();
            } else {
                // 权限被拒绝
                Toast.makeText(this, "请给予访问相册的权限", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void loadPhotos() {
        // 获取相册图片数据
        photoList = getPhotoList();

        // 创建并设置Adapter
        PhotoAdapter adapter = new PhotoAdapter(photoList);
        recyclerView.setAdapter(adapter);

        // 设置图片点击事件,显示选中的图片
        adapter.setOnItemClickListener(new PhotoAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(Photo photo) {
                Glide.with(GalleryActivity.this)
                        .load(photo.getPath())
                        .into(imageView);
            }
        });

        // 设置布局管理器
        recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
    }

    private List<Photo> getPhotoList() {
        // 使用ContentResolver查询相册图片数据
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection,
                null,
                null,
                null
        );

        List<Photo> photoList = new ArrayList<>();
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String path = cursor.getString(cursor