Samsung Galaxy S7 显示旋转的设备照片
Samsung Galaxy S7 show device photos rotated
我开发了一个 android 应用程序,可以在适配器中显示用户设备中的所有照片。
这是我用来读取照片的代码:
Cursor photos;
String pictureCols[] = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME };
String order = Media.DATE_ADDED + " DESC";
photos = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, pictureCols, null, null, order);
photos.moveToFirst();
photosAdapter.addItems(photos);
在适配器内部,这是我用来向他们展示的代码:
public View getView(final int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(context);
gridView = inflater.inflate(R.layout.photo_item, null);
}
else
{
gridView = (View) convertView;
}
photoIV = (SquareImageView)gridView.findViewById(R.id.photo);
long photoId = photos.getLong(0);
String thumbURL = "file://"+photos.getString(1);
String thumbCols[] = { MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.DATA };
Cursor thumbCursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(context.getContentResolver(), photoId, Thumbnails.MINI_KIND, thumbCols);
if(thumbCursor.getCount() > 0) {
thumbCursor.moveToFirst();
thumbURL = "file://"+thumbCursor.getString(1);
}
thumbCursor.close();
if(!thumbURL.equals(""))
{
mImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
ImageLoader.getInstance().displayImage(thumbURL, photoIV, mImageOptions);
}
return gridView;
}
到目前为止,这段代码在我测试过的所有设备上都运行正常,但一些使用 Samsung Galaxy S7 的用户报告说他们的大部分照片都显示为旋转的。我在 S7 中找不到与此问题相关的任何文档。 S7是否改变了与此相关的内容?我应该以不同的方式阅读照片以获得正确的方向吗?这段代码已经在很多设备上运行了很长时间。
如果您使用 image-loading 库,并且您关心 EXIF 方向 header,请选择一个 image-loading 库来为您应用这些 header(例如,毕加索,至少对于本地图像)。这可能需要某种 opt-in 调用(例如 considerExifParams(true)
,根据您的评论)。
并非所有图像都有 EXIF 方向 header。这取决于它是否是照片、拍摄照片的相机硬件类型、拍摄照片的相机应用程序是否为您旋转了图像等。
我开发了一个 android 应用程序,可以在适配器中显示用户设备中的所有照片。
这是我用来读取照片的代码:
Cursor photos;
String pictureCols[] = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME };
String order = Media.DATE_ADDED + " DESC";
photos = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, pictureCols, null, null, order);
photos.moveToFirst();
photosAdapter.addItems(photos);
在适配器内部,这是我用来向他们展示的代码:
public View getView(final int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(context);
gridView = inflater.inflate(R.layout.photo_item, null);
}
else
{
gridView = (View) convertView;
}
photoIV = (SquareImageView)gridView.findViewById(R.id.photo);
long photoId = photos.getLong(0);
String thumbURL = "file://"+photos.getString(1);
String thumbCols[] = { MediaStore.Images.Thumbnails._ID, MediaStore.Images.Thumbnails.DATA };
Cursor thumbCursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(context.getContentResolver(), photoId, Thumbnails.MINI_KIND, thumbCols);
if(thumbCursor.getCount() > 0) {
thumbCursor.moveToFirst();
thumbURL = "file://"+thumbCursor.getString(1);
}
thumbCursor.close();
if(!thumbURL.equals(""))
{
mImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
ImageLoader.getInstance().displayImage(thumbURL, photoIV, mImageOptions);
}
return gridView;
}
到目前为止,这段代码在我测试过的所有设备上都运行正常,但一些使用 Samsung Galaxy S7 的用户报告说他们的大部分照片都显示为旋转的。我在 S7 中找不到与此问题相关的任何文档。 S7是否改变了与此相关的内容?我应该以不同的方式阅读照片以获得正确的方向吗?这段代码已经在很多设备上运行了很长时间。
如果您使用 image-loading 库,并且您关心 EXIF 方向 header,请选择一个 image-loading 库来为您应用这些 header(例如,毕加索,至少对于本地图像)。这可能需要某种 opt-in 调用(例如 considerExifParams(true)
,根据您的评论)。
并非所有图像都有 EXIF 方向 header。这取决于它是否是照片、拍摄照片的相机硬件类型、拍摄照片的相机应用程序是否为您旋转了图像等。