问题:我使用的意图是允许用户选择照片。当他们从设备上的图像中选择照片时,我能够使用ExifInterface获得纬度和经度。然而,当他们从谷歌照片中选择照片时,我无法从uri返回中获得地理位置。
详细信息:我使用的意图如下所示:
Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Pictures"), PICK_IMAGES_REQUEST);
当用户从Google Photos中选择一张未存储在设备上的照片时,Google Photos首先下载该照片并返回一个URI,该URI不包括设备上的位置。我正在使用它将流写入本地文件以获取照片。然后,我尝试使用ContentResolver从流中获取日期、纬度和经度,如下所示:
Cursor cursor = context.getContentResolver().query(uri,
new String[] {
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.LATITUDE,
MediaStore.Images.ImageColumns.LONGITUDE
}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int dateColumn = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN);
photoItem.date = new Date(cursor.getLong(dateColumn));
int latitudeColumn = cursor.getColumnIndex(MediaStore.Images.ImageColumns.LATITUDE);
double latitude = cursor.getDouble(latitudeColumn);
int longitudeColumn = cursor.getColumnIndex(MediaStore.Images.ImageColumns.LONGITUDE);
double longitude = cursor.getDouble(longitudeColumn);
photoItem.photoGeoPoint = new LatLng(latitude, longitude);
}
cursor.close();
}
这适用于拍摄日期。但是,纬度和经度始终为0。我已经验证了我尝试使用的照片在exif中嵌入了地理位置。有什么想法吗?
--编辑--
因此,我使用@Common sWare的建议更新了我的代码,直接从流写入文件,而不首先将其转换为位图。代码看起来像这样(其中是来自谷歌照片内容解析器的输入流):
try {
File outputDir = AppState.getInstance().getCacheDir();
File outputFile = File.createTempFile("tempImageFile", ".jpg", outputDir);
OutputStream out = new FileOutputStream(outputFile);
byte[] buf = new byte[1024];
int len;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
out.close();
in.close();
ExifInterface exif = new ExifInterface(outputFile.getPath());
Logger.d(LOG_TAG, "lat is: " + exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE));
Logger.d(LOG_TAG, "lon is: " + exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE));
} catch (Exception e) {
e.printStackTrace();
}
但是纬度和经度仍然为空(同样,我已经验证了照片中的位置数据存在)。ExiFinInterface中的唯一值是LightSource=0、Orientation=1、ImageLength=3264、MeteringMode=-1和ImageWidth=2448。
我用它来写流到一个本地文件,以获得照片。
天哪,多么可怕的代码。
如果要制作内容的本地文件副本:
>
在要放置文件的位置设置一个OutputStream
使用普通JavaI/O从InputStream
复制到OutputStream
这不仅速度快得多,内存占用也少得多,而且为了您的目的,它保留了EXIF标头。然后,您可以使用ExifInterface
访问这些。
有人听说过com吗。谷歌。Android应用程序。照片。准许谷歌照片?我似乎在文档中的任何地方都找不到它,但运行4.3及以上版本的用户例外。 如果你有任何关于它的信息,请分享 谢谢你
我开发了一个功能,可以从设备库中获取所有照片。并在我的应用程序的列表中显示它们。现在我需要从“谷歌照片”中获取照片,我似乎找不到一个简单的方法来实现它。
我试图选择在Android上使用意图的照片。所有作品和照片正在检索从任何照片应用程序(相机,画廊,截图等...即使从新的照片应用程序中选择);除了那些在谷歌照片上备份在线。 在获得位图时,在人像拍摄的照片将在风景中检索。我有代码来获取照片的方向,这样我就可以相应地翻译,但是在新的谷歌照片应用程序上选择在线照片时,方向总是0。任何想法,我应该如何获得这些照片的方向,因为0正在返回?代码如下-谢谢。
我的应用程序有能力从库中选择照片。正是我想要的文件路径从这个选择。
问题内容: 我需要在活动中获得并显示照片库中最近拍摄的3张照片,而无需任何点击。 完成此步骤后,滚动时,我应该以3 x 3的方式拍摄其他照片。 您知道快速执行此操作的正确方法吗?谢谢。 问题答案: 这是使用适用于iOS 8+设备的框架的解决方案:
我正在尝试从sdcard拍摄照片,它是工作的情况下,当用户选择从谷歌照片,但给出一个curserindexoutofbound错误时,从任何其他应用程序,如gallery或file Manager。这是一段代码。 OnActivity Result`{if(requestCode==PICK_IMAGE_REQUEST&&resultCode==activity.result_ok&data!=n