当前位置: 首页 > 知识库问答 >
问题:

无法从Android上谷歌照片中的照片获取位置数据

蓬新
2023-03-14

问题:我使用的意图是允许用户选择照片。当他们从设备上的图像中选择照片时,我能够使用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。

共有1个答案

钮安歌
2023-03-14

我用它来写流到一个本地文件,以获得照片。

天哪,多么可怕的代码。

如果要制作内容的本地文件副本:

>

在要放置文件的位置设置一个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