获取所有Android设备图像

获取所有Android设备图像,android,android-cursor,Android,Android Cursor,我需要根据添加日期获取android设备的所有图像,因此我尝试了以下代码: String[] projection = new String[]{ MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, MediaStore.Images.ImageColumns.DATE

我需要根据添加日期获取android设备的所有图像,因此我尝试了以下代码:

String[] projection = new String[]{
    MediaStore.Images.ImageColumns._ID,
    MediaStore.Images.ImageColumns.DATA,
    MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
    MediaStore.Images.ImageColumns.DATE_TAKEN,
    MediaStore.Images.ImageColumns.MIME_TYPE};
mImageCursor = getContentResolver().query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    projection,
    null,
    null,
    MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
mImageCursor.moveToFirst();

它在大多数设备上运行良好,但问题出现在Nexus5上,我听说它崩溃了。不幸的是,我没有Nexus5来检查日志,但我认为这可能是因为Nexus5没有sd卡,对吗?解决方案是什么?

从Android 5.0开始,对于某些
MediaStore
操作,您需要
READ\u EXTERNAL\u STORAGE
,从Android 6.0开始,如果您的
targetSdkVersion
为23或更高,则需要使用运行时权限系统。具体来说,您需要使用
requestPermissions()
提示用户授予您从外部存储读取的能力,因为这被认为是一种
危险的
权限


如果您的
targetSdkVersion
为22或更低,并且Android 6.0用户通过设置应用程序手动撤销了您的
READ\u EXTERNAL\u STORAGE
权限,我不太确定关于
MediaStore
的行为是什么,因为我还没有尝试过那种特定的场景。

不用担心,您需要首先关注能够收集堆栈跟踪。如果没有发现问题的能力,永远不要发布应用程序。虽然Nexus 5没有SD卡插槽,但您的代码与SD卡插槽无关,
MediaStore
通常在Nexus 5上运行良好。Nexus运行android 6,这可能是原因吗?从android 5.0开始,您需要
读取外部存储
进行一些
MediaStore
操作,从Android 6.0开始,如果您的
targetSdkVersion
为23或更高,则需要使用运行时权限系统。如果您的
targetSdkVersion
为22或更低,并且Android 6.0用户手动吊销了您的
READ\u EXTERNAL\u STORAGE
权限,我不太确定关于
MediaStore
的行为是什么,因为我还没有尝试过该特定场景。是的,您的权利,这是因为Android 6中的权限,你可以回答这个问题,所以如果你愿意,我选择它