如何从光标获取图像 URI?

问题描述

我是 Android 开发的新手,我正在尝试制作显示手机中所有图像的应用。

我正在尝试使用 CursorAdapter 类来实现这一点。

我的代码是,

MainActivity.java

constants.commands.formatDocument

MyCursorAdapter.java

public class MainActivity extends AppCompatActivity {

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

        GridView gridView = findViewById(R.id.photo_list);

        Cursor cursor =  getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"
        );

        MyCursorAdapter myCursorAdapter = new MyCursorAdapter(this,cursor,0);
        gridView.setAdapter(myCursorAdapter);

该应用程序正常运行。但让我烦恼的是这个。

public class MyCursorAdapter extends CursorAdapter {
    public MyCursorAdapter(Context context,Cursor c,int flags) {
        super(context,c,flags);
    }

    @Override
    public View newView(Context context,Cursor cursor,ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.item_photo,parent,false);
    }

    @Override
    public void bindView(View view,Context context,Cursor cursor) {
        ImageView imageView = view.findViewById(R.id.photo_image);
        String uri = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
        Glide.with(context).load(uri).into(imageView);
    }
}

不推荐使用常量 DATA 其注释是说

String uri = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));

openFileDescriptor() 方法需要 Uri 和 String。但是,正如您在我的代码中看到的,我使用 DATA 常量来获取 Uri,因此我无法将 Uri 传递给 openFileDescriptor() 方法,并且不知道要传递给 openFileDescriptor() 的 String 参数。

这种情况下,不使用DATA常量怎么写?

感谢您阅读我的问题。

解决方法

在 blackapps 的帮助下,我删除了 DATA 常量并得到了相同的结果。

差异如下。

MainActivity.java

    Cursor cursor =  getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"
    );

    Cursor cursor =  getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[]{ MediaStore.Images.Media._ID },MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"
    );

以上更改是可选的,但向 getContentResolver().query 添加投影参数将使查询更高效。

MyCursorAdapter.java

    ImageView imageView = view.findViewById(R.id.photo_image);
    String uri = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
    Glide.with(context).load(uri).into(imageView);

    ImageView imageView = view.findViewById(R.id.photo_image);
    int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
    Glide.with(context).load(ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,id)).into(imageView);

我尝试从 _ID 常量获取索引并使用 ContentUris.withAppendedId() 方法获取 uri。

如果有什么不对的,请告诉我!

再次感谢 blackapps。