iPhone Получить UIImagePickerController Lat / Lng - PullRequest
12 голосов
/ 30 мая 2011

Я использую UIImagePickerController, чтобы сделать фотографию, а затем загрузить фотографию в WCF Service. Наряду с изображением мне также необходимо отправить широту и долготу фотографии.

Как я могу получить эту информацию из фотографии?

Я искал в Интернете, но не могу найти хороший источник информации. Я видел данные EXIF, которые передаются через ключ UIImagePickerControllerMediaMetadata как часть метода делегата didFinishPickingMediaWithInfo. Однако, когда я распечатываю содержимое в журнал, информация о местоположении отсутствует.

Я что-то упустил, нужно ли мне включать службы определения местоположения перед съемкой фотографии? Или есть другой способ получить информацию?

Большое спасибо.

Ответы [ 4 ]

15 голосов
/ 23 июня 2011

Я выяснил это пару дней и наконец нашел решение.Как уже предлагалось, вы можете использовать ALAssetsLibrary .

Средство выбора изображений выдаст вам словарь, который содержит URL-адрес, указывающий на ресурс.

Метод ALAssetsLibrary assetForURL: resultBlock: failureBlock: использует блоки.Вы можете прочитать больше о них из примера здесь .Вот как мы обрабатываем информацию, предоставленную сборщиком:

- (void)imagePickerController:(UIImagePickerController *)picker
            didFinishPickingMediaWithInfo:(NSDictionary *)info
{

    if ([picker sourceType] == UIImagePickerControllerSourceTypePhotoLibrary) {
        // We'll store the info to use in another function later
        self.imageInfo = info;

        // Get the asset url
        NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"];

        // We need to use blocks. This block will handle the ALAsset that's returned: 
        ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
        {
            // Get the location property from the asset  
            CLLocation *location = [myasset valueForProperty:ALAssetPropertyLocation];
            // I found that the easiest way is to send the location to another method
            [self handleImageLocation:location];
        };
        // This block will handle errors:
        ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
        {
            NSLog(@"Can not get asset - %@",[myerror localizedDescription]);
            // Do something to handle the error
        };


        // Use the url to get the asset from ALAssetsLibrary,
        // the blocks that we just created will handle results
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:url 
                       resultBlock:resultblock
                      failureBlock:failureblock];

    }
    [picker dismissModalViewControllerAnimated:YES];
    [picker release];
}

И затем метод, который обрабатывает данные об изображении и местоположении:

- handleImageLocation:(CLLocation *)location 
{
    UIImage *image = [self.imageInfo objectForKey:UIImagePickerControllerOriginalImage];
    // Do something with the image and location data...
}

И, конечно, вы также можете получитьдругая информация об изображении с помощью этого метода с помощью ключей:

ALAssetPropertyType
ALAssetPropertyLocation
ALAssetPropertyDuration
ALAssetPropertyOrientation
ALAssetPropertyDate
ALAssetPropertyRepresentations
ALAssetPropertyURLs
3 голосов
/ 18 марта 2016

Новое с iOS 8

Это было сложно с ALAssetLibrary , который сейчас не рекомендуется использовать, вместо этого используйте Photos.Framework .

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let assertURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
        let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assertURL], options: nil)
        if let asset = fetchResult.firstObject as? PHAsset
        {
            print(asset.location)
        }
    }
}

Быстро и просто:)

1 голос
/ 17 июня 2012

Поскольку ваш тип источника может выглядеть как UIImagePickerControllerSourceTypeCamera, это очень быстро расстраивает, как вы уже знаете. Информация о местоположении выглядит как MIA.

В качестве альтернативы UIImageWriteToSavedPhotosAlbum() (что не относится к сохраненному изображению), я пробовал ALAssetsLibrary и -writeImageToSavedPhotosAlbum:metadata:completionBlock: (используя UIImagePickerControllerMediaMetadata для его заполнения, надеясь, что фреймворк заполнит бланки с информацией о местоположении).

Увы, нет такой удачи. Несмотря на то, что этот метод возвращает URL-адрес сохраненного изображения, я все равно не могу получить ALAssetPropertyLocation информацию из него. Даже если я использую вариант ориентации метода сохранения, он бесполезен.

На данный момент, я думаю, единственным выходом может быть , включающий вашу собственную информацию о местоположении, как указано здесь .

Кажется несколько странным, что я должен был бы сделать это, однако, поскольку Я ожидал бы, что фреймворк будет обрабатывать это для вас автоматически . На самом деле, я даже не могу получить информацию о местоположении для ранее сделанных фотографий. Это со всеми разрешениями, предоставленными во всех нужных местах, независимо от того, какое устройство я использую, iPhone или iPad. (Даже приложение «Камера» имеет соответствующие разрешения, FWIW.)

1 голос
/ 30 мая 2011

Полагаю, это «ошибка».UIImagePickerViewController не будет возвращать данные местоположения выбранных вами изображений: как вы обнаружили, они удаляются из метаданных.

Однако, если вы используете ALAssetLibrary для получения ваших изображенийВы можете получить данные о местоположении (в виде CLLocation объекта, связанного с изображением).В этом вопросе есть некоторый код - проблема с iphone image ALAsset - которая поможет вам получить ALAsset от UIImagePickerController.

Конечно, было бы проще, если бы вы моглипросто получите эту информацию от сборщика сразу, поэтому рассмотрите возможность подачи заявки в Apple.

...