Google 将 API 照片元数据放入 Xamarin:Android

Google Place API Photo Meta Data in Xamarin:Android

我尝试从 Places API 获取照片。 主要代码如下:

private void GetPhotos(Intent data)
    {

        var placePicked = PlacePicker.GetPlace(this, data);

        string placeId = placePicked.Id;
        Task photoMetadataResponse = mGeoDataClient.GetPlacePhotos(placeId);
        if (photoMetadataResponse.IsComplete)
        {

            var  photos =(PlacePhotoMetadataResponse) photoMetadataResponse.Result;
            PlacePhotoMetadataBuffer photoMetadataBuffer = photos.PhotoMetadata;
            if (photoMetadataBuffer.Count > 0)
            {
                IPlacePhotoMetadata photoMetaData = (IPlacePhotoMetadata) photoMetadataBuffer.Get(0);
                Task photoResponse = mGeoDataClient.GetPhoto(photoMetaData);
                if (photoResponse.IsComplete)
                {

                    PlacePhotoResponse photoResult = (PlacePhotoResponse) photoResponse.Result;
                    Bitmap bitmap = photoResult.Bitmap;
                }
            }

        }
    }

我尝试初始化时遇到问题:

IPlacePhotoMetadata photoMetaData = (IPlacePhotoMetadata) photoMetadataBuffer.Get(0);

例外情况是:

System.InvalidCastException: Specified cast is not valid.

mGeoDataClient 正在等待来自 IPlacePhotoMetadata 的对象。我被检查了什么对象 photoMetadataBuffer.Get(0)

返回的命名空间是:

android.common.data.zzc

总的来说这个对象并没有告诉我太多...我如何将 photoMetadataBuffer 投射到 IPlacePhotoMetadata 上?或者我这边哪里会出错?

您应该使用 Xamarin 的异步包装器或直接分解基于 Android 的任务(查看 Xamarin 包装器使用的 TasksExtensions.AsAsync)以获得正确的实例 Android任务 returns:

Xamarin 的异步包装器示例:

private async void GetPhotosAsync(Intent data)
{
    var placePicked = PlacePicker.GetPlace(this, data);

    string placeId = placePicked.Id;
    var photoMetadataResponse = await mGeoDataClient.GetPlacePhotosAsync(placeId);
    var photoMetadataBuffer = photoMetadataResponse.PhotoMetadata;
    if (photoMetadataBuffer.Count > 0)
    {
        var photoMetaData = (IPlacePhotoMetadata)photoMetadataBuffer.Get(0);
        var photoResponse = await mGeoDataClient.GetPhotoAsync(photoMetaData);
        var bitmap = photoResponse.Bitmap;

        ~~~
    }
}

注意:我假设 GetPhotosAsync 将 return 不同于 void 的东西,当你得到其余的方法时,该方法会被清除...

更新:

private async void GetPhotos(Intent data)
{
    var placePicked = PlacePicker.GetPlace(this, data);

    string placeId = placePicked.Id;
    using (var photoMetadataResponse = await mGeoDataClient.GetPlacePhotosAsync(placeId))
    using (var photoMetadataBuffer = photoMetadataResponse.PhotoMetadata)
    {
        foreach (var item in photoMetadataBuffer)
        {
            using (var photoResponse = await mGeoDataClient.GetPhotoAsync(item))
            {
                var bitmap = photoResponse.Bitmap;
                photoResponse.Dispose();
            }
            break;
        }
    }
}