iPhone Pobierz UIImagePickerController Lat / Lng
Używam UIImagePickerController
, aby zrobić zdjęcie, a następnie przesłać zdjęcie do WCF Service
. Wraz z obrazem, muszę również wysłać do szerokości i długości geograficznej zdjęcia.
Jak mogę zdobyć te informacje z zrobionego zdjęcia?
Szukałem w Internecie, ale nie mogę znaleźć dobrego źródła informacji. Widziałem DANE EXIF
, które są przekazywane przez klucz UIImagePickerControllerMediaMetadata
jako część metody delegata didFinishPickingMediaWithInfo
. Jednak, kiedy wydrukować zawartość do dziennika, nie ma informacji o lokalizacji.
Czy coś mi umyka, Czy muszę włączyć usługi lokalizacyjne przed zrobieniem zdjęcia? Czy jest inny sposób, aby uzyskać informacje?
Wielkie dzięki.4 answers
Zastanawiałam się nad tym od kilku dni i w końcu znalazłam rozwiązanie. Jak już sugerowano, możesz użyć ALAssetsLibrary .
Selektor obrazów wyświetli słownik, który zawiera adres url wskazujący na zasób.
Metoda ALAssetsLibrary używa bloków. Możesz przeczytać więcej o nich z przykładu tutaj . Tak więc w ten sposób radzimy sobie z informacjami podanymi przez selektora:
- (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];
}
A następnie metoda, która obsługuje obraz i dane o lokalizacji:
- handleImageLocation:(CLLocation *)location
{
UIImage *image = [self.imageInfo objectForKey:UIImagePickerControllerOriginalImage];
// Do something with the image and location data...
}
I oczywiście możesz również uzyskać inne informacje o obrazie za pomocą tej metody za pomocą klawiszy:
ALAssetPropertyType
ALAssetPropertyLocation
ALAssetPropertyDuration
ALAssetPropertyOrientation
ALAssetPropertyDate
ALAssetPropertyRepresentations
ALAssetPropertyURLs
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 10:01:58
Nowy od iOS 8
To było skomplikowane z ALAssetLibrary, który jest obecnie przestarzały, użyj Zdjęcia.Ramy zamiast tego.
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)
}
}
}
Szybko i łatwo:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-18 03:12:44
To chyba "robak". UIImagePickerViewController
nie zwróci danych lokalizacji wybranych obrazów: jak już odkryłeś, są one usuwane z metadanych.
Jeśli jednak użyjesz ALAssetLibrary
, Aby uzyskać obrazy, możesz uzyskać dane lokalizacji (w postaci obiektu CLLocation
powiązanego z obrazem). W tym pytaniu jest jakiś kod- problem z obrazem iphone ' a - który pomoże ci uzyskać ALAsset
z UIImagePickerController
.
Oczywiście byłoby łatwiej, gdybyś mógł po prostu od razu uzyskaj te informacje od selekcjonera, więc rozważ złożenie wniosku o funkcję w Apple.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:28
Jako że Twój typ źródłowy wydaje się być UIImagePickerControllerSourceTypeCamera
, to robi się bardzo frustrujące bardzo szybko, jak już wiesz. Informacja o lokalizacji wydaje się być zaginiona.
Jako alternatywę dla UIImageWriteToSavedPhotosAlbum()
(która nie odnosi się do zapisanego obrazu) próbowałem ALAssetsLibrary i -writeImageToSavedPhotosAlbum:metadata:completionBlock:
(używając UIImagePickerControllerMediaMetadata
do wypełnienia go, mając nadzieję, że framework wypełni puste miejsca informacjami o lokalizacji).
ALAssetPropertyLocation
z to. Nawet jeśli używam wariantu orientacyjnego metody save, jest on bezużyteczny.
W tym momencie, myślę, że jedynym wyjściem wydaje się być zawierające własne informacje o lokalizacji, jak opisano tutaj .
Wydaje się nieco podejrzane, że musiałbym to zrobić, jednak, ponieważ spodziewałbym się, że framework zajmie się tym dla Ciebie automagicznie. W rzeczywistości, nie mogę nawet uzyskać informacji o lokalizacji wcześniej zrobione zdjęcia. Jest to ze wszystkimi uprawnieniami udzielonymi we wszystkich właściwe miejsca, bez względu na to, jakiego urządzenia używam, iPhone czy iPad. (Nawet aplikacja aparatu ma odpowiednie uprawnienia, FWIW.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:51