Google Place API Photo Meta Data в Xamarin: Android - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь получить фотографии из 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: указанное приведение недопустимо.

mGeoDataClient ожидает объект от IPlacePhotoMetadata. Я был проверен, какой объект photoMetadataBuffer.Get(0)

Возвращенное пространство имен было:

android.common.data.zzc

В целом этот объект мне мало что говорит ... Как я могу использовать photoMetadataBuffer для IPlacePhotoMetadata? Или где была бы ошибка с моей стороны?

1 Ответ

0 голосов
/ 03 января 2019

Вы должны либо использовать оболочки Async Xamarin, либо напрямую декомпозировать задачи на базе Android (см. TasksExtensions.AsAsync, который используют оболочки Xamarin), чтобы получить правильный экземпляр, который возвращает Задача Android:

Пример асинхронной оболочки 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 вернет что-то отличное от 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;
        }
    }
}
...