14

(設定などから)位置情報サービスが有効になっているアプリがあり、ALAssetsLibraryを使用してデバイスからすべての写真を読んでいます。

iPhone4 iOS 4.2.1では完全に機能しますが、同じコードと同じアセットは、どの3gsのiOS(4.0から4.2.1まで)でも機能しません。

問題は、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/201101: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;

ビューコントローラ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)の問題であるかどうかは完全にはわかりませんが、通常は問題ではありません...

4

1 に答える 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"];

緯度と経度の参照は、正 (北、東) と負 (南、西) に変換する必要がある方向です。その後、そのすべての情報を使用して単純な CLLocation を構築できます。さらに必要な場合は、ログに記録するか、デバッガーを使用して gpsDict (またはメタデータ) を調べ、使用するキーを確認します。

データが常に存在するとは限らないことに注意してください (機内モードで撮影された写真) ので、必ず値を確認してください。

于 2012-11-10T18:05:18.763 に答える