ALAssetPropertyLocation 在任何 iOS 4.0+ 的 3gs iPhone 上都无法正常工作,但在 iPhone4 上完美运行。

14

我有一个启用了位置服务(从设置等)的应用程序,并且我正在使用ALAssetsLibrary从我的设备读取所有照片。

它在iPhone4 iOS 4.2.1上完美运行,但是相同的代码和相同的资产在任何3gs上的任何iOS上都无法工作(从4.0到4.2.1)。

问题在于它始终在3gs上检索到无效的CLLocation。

即使在相同的图片(在两个设备上都复制)上,iPhone4返回有效的CLLocation,而在3gs上则返回无效的CLLocation!图片本身在两个设备上都是有效的,只有CLLocation是无效的。我没有任何崩溃,而且代码也没有进入任何无效的块,除了无效的CLLocation数据之外,一切正常。

相同的资产相同的代码和相同的(4.2.1)输出:

iPhone4: <+51.23816667, -0.57700000> +/- 0.00m (speed -1.00 mps / course -1.00) @ 19/02/2011 01:59:28格林威治标准时间

3gs: < nan,nan > +/- 0.00m(速度-1.00 mps / 课程-1.00)@ 2011年2月19日01:20:35 +0000

(还要注意无效位置上的日期是当前时间)

我是这样得到CLLocation的:

 CLLocation* location = [asset valueForProperty:ALAssetPropertyLocation];
 CLLocationCoordinate2D coord = [location coordinate];
 if ( !CLLocationCoordinate2DIsValid(coord) ) return;

在我的视图控制器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)的问题,通常情况下并不是...


你曾经解决过这个问题吗?如果是,请发布一个包含正确信息的答案,因为我也遇到了同样的问题。谢谢! - Mihai Fratu
我甚至在iPhone 4或iPad第三代上都看不到ALAssetPropertyLocation元数据,即使启用了位置服务(在相关应用程序和相机应用程序中都是如此)。我拍照后查看元数据,EXIF在那里,但没有其他太多信息。 - Joe D'Andrea
尝试在bugreport.apple.com上发布一个简化的示例。在这种情况下,他们通常会提供帮助。 - Andrew Pouliot
1个回答

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(或元数据)并查看要使用哪些键。

请记住,数据并不总是存在的(在飞行模式下拍摄的照片),因此请务必检查值。


1
这似乎在iOS 7中现在无法工作,即使我的相机启用了位置服务。从资产库导入的照片似乎在其元数据字典中不包含“{GPS}”条目。有人知道为什么会发生这种情况吗? - Evan K. Stone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接