2015-10-27 24 views
1

我需要让它们加入基于最新Android设备的所有图像,所以我尝试下面的代码:让所有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(); 

它运作良好,对大多数设备,但在Nexus出现的问题5,我听说它崩溃了。不幸的是,我没有Nexus 5检查日志,但我认为这可能是因为Nexus 5没有SD卡,我是对的吗?解决办法是什么?

+0

您不必担心这一点,您需要首先关注能够收集堆栈跟踪。 **从不** **应用程序没有能力找出哪里出了问题。虽然Nexus 5没有SD卡插槽,但您的代码与SD卡插槽没有任何关系,并且'MediaStore'一般适用于Nexus 5。 – CommonsWare

+0

nexus运行android 6,这可能是原因吗? –

+2

从Android 5.0开始,对于某些'MediaStore'操作,您需要'READ_EXTERNAL_STORAGE',如果您的'targetSdkVersion'为23或更高,则需要使用Android 6.0开始,这需要您使用运行时权限系统。如果您的'targetSdkVersion'为22或更低,并且Android 6.0用户手动撤销了您的'READ_EXTERNAL_STORAGE'权限,我不太确定'MediaStore'的行为是什么,因为我还没有尝试过特定场景。 – CommonsWare

回答

1

与Android 5.0开始,你需要READ_EXTERNAL_STORAGE一些MediaStore操作,并开始与Android 6.0,如果你的targetSdkVersion为23或更高,这需要你与运行权限系统工作。具体而言,您需要使用requestPermissions()来提示用户授予您从外部存储器读取数据的能力,因为这被认为是dangerous权限。

如果您targetSdkVersion是22或更低,和Android 6.0用户通过设置应用程序手动撤销你的READ_EXTERNAL_STORAGE允许,我不是很确定的行为相对于MediaStore什么,因为我还没有试过,特别是情景尚未。

相关问题