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;
}
}
}
我尝试从 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;
}
}
}