问题描述
我是 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。