我有一个应用程序,位置服务已启用(来自设置等),我正在使用ALAssetsLibrary从我的设备上阅读所有照片。
它完全适用于iPhone4 iOS 4.2.1,但相同的代码和相同的资产在任何iOS(从4.0到4.2.1)的任何3gs上都无法工作。
问题是它总是在3gs上检索无效的CLLocation。
即使在iPhone4上的同一张照片上(在两个设备上复制)也会返回一个有效的CLLocation,在3gs上它返回无效! 图片图片本身在两台设备上都有效,只有CLLocation无效。我没有任何崩溃,并且代码没有进入任何无效的块,除了无效的CLLocation数据之外,它都可以正常工作。
输出相同资产和相同代码以及相同 iOS版本(4.2.1):
iPhone4的: < +51.23816667,-0.57700000> +/- 0.00m(速度-1.00 mps /航向-1.00)@ 19/02/2011 01:59:28格林威治标准时间
3GS : < nan,nan> +/- 0.00m(速度-1.00 mps /航向-1.00)@ 2011-02-19 01:20:35 +0000
(另请注意无效位置上的日期是当前时间)
我得到了这样的CLLocation:
CLLocation* location = [asset valueForProperty:ALAssetPropertyLocation];
CLLocationCoordinate2D coord = [location coordinate];
if ( !CLLocationCoordinate2DIsValid(coord) ) return;
在我的viewcontroller DidLoad中调用的ALAssetsLibrary代码看起来像这样(完全标准):
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != NULL)
{
[self myFunction:result withIndex:index];
}
};
void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) {
if(group != nil)
{
numberOfAssets = [group numberOfAssets];
[group enumerateAssetsUsingBlock:assetEnumerator];
}
};
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:assetGroupEnumerator
failureBlock: ^(NSError *error) {
NSLog(@"Oh no!");
}];
最后一点,在原生照片应用程序上,图片显示在3gs上的正确位置,所以他们必须在某个地方有这些数据,它不会以某种方式读取它!
我不完全确定它是一个设备(3gs)问题,通常它永远不会......
答案 0 :(得分:1)
在iOS 4.0及更高版本中,您可以尝试使用类似的内容来操作ALAsset并检索通过枚举或使用assetForURL
检索的照片资产的位置数据(以及更多):
ALAssetRepresentation *representation = [asset defaultRepresentation];
NSDictionary *metadata = [representation metadata];
NSDictionary *gpsDict = [metadata objectForKey:@"{GPS}"];
NSNumber *latitudeNumber = [gpsDict objectForKey:@"Latitude"];
NSString *latitudeRef = [gpsDict objectForKey:@"LatitudeRef"];
NSNumber *longitudeNumber = [gpsDict objectForKey:@"Longitude"];
NSString *longitudeRef = [gpsDict objectForKey:@"LongitudeRef"];
纬度和经度参考是您需要转换为正(N,E)和负(S,W)的方向。然后,您可以使用所有这些信息来构建简单的CLLocation。如果您需要更多,请记录或使用调试器查看gpsDict(或元数据)并查看要使用的密钥。
请记住,数据并非总是存在(在飞行模式下拍摄的照片),因此请务必检查数值。