private async Task GeoTagPhotoAsync() { // see if the photo already contains geo coords var exif = new ExifInterface(_file.Path); if (!string.IsNullOrWhiteSpace(exif.GetAttribute(ExifInterface.TagGpsLatitude))) return; RequestCurrentLocation(); var location = await _locationTCS.Task; try { int num1Lat = (int)Math.Floor(location.Latitude); int num2Lat = (int)Math.Floor((location.Latitude - num1Lat) * 60); double num3Lat = (location.Latitude - ((double)num1Lat + ((double)num2Lat / 60))) * 3600000; int num1Lon = (int)Math.Floor(location.Longitude); int num2Lon = (int)Math.Floor((location.Longitude - num1Lon) * 60); double num3Lon = (location.Longitude - ((double)num1Lon + ((double)num2Lon / 60))) * 3600000; exif.SetAttribute(ExifInterface.TagGpsLatitude, num1Lat + "/1," + num2Lat + "/1," + num3Lat + "/1000"); exif.SetAttribute(ExifInterface.TagGpsLongitude, num1Lon + "/1," + num2Lon + "/1," + num3Lon + "/1000"); if (location.Latitude > 0) { exif.SetAttribute(ExifInterface.TagGpsLatitudeRef, "N"); } else { exif.SetAttribute(ExifInterface.TagGpsLatitudeRef, "S"); } if (location.Longitude > 0) { exif.SetAttribute(ExifInterface.TagGpsLongitudeRef, "E"); } else { exif.SetAttribute(ExifInterface.TagGpsLongitudeRef, "W"); } exif.SaveAttributes(); } catch (Java.IO.IOException) { // location will not be available on this image, but continue } }
public void OnPictureTaken(byte[] data, Android.Hardware.Camera camera) { FileOutputStream output = null; string path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments), "Images"); if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); string filename = PictureName + number.ToString() + ".jpg"; if (data != null) { fullFilename = System.IO.Path.Combine(path, filename); number++; try { output = new FileOutputStream(fullFilename); output.Write(data); output.Close(); } catch (FileNotFoundException) { RunOnUiThread(delegate { GeneralUtils.Alert(context, Application.Context.Resources.GetString(Resource.String.commonError), Application.Context.Resources.GetString(Resource.String.errorFileTransfer)); }); return; } catch (IOException) { RunOnUiThread(delegate { GeneralUtils.Alert(context, Application.Context.Resources.GetString(Resource.String.commonError), Application.Context.Resources.GetString(Resource.String.errorNoImagesTaken)); }); isRunning = true; camera.StartPreview(); return; } catch (Exception e) { #if DEBUG System.Diagnostics.Debug.WriteLine("Exception thrown - {0}", e.Message); #endif return; } var f = new File(fullFilename); try { var exifInterface = new ExifInterface(f.CanonicalPath); exifInterface.GetAttribute(ExifInterface.TagModel); var latLong = new float[2]; exifInterface.GetLatLong(latLong); exifInterface.SetAttribute(ExifInterface.TagMake, "Phone picture"); exifInterface.SetAttribute(ExifInterface.TagDatetime, DateTime.Now.ToString()); } catch (IOException) { RunOnUiThread(delegate { GeneralUtils.Alert(context, Application.Context.Resources.GetString(Resource.String.commonError), Application.Context.Resources.GetString(Resource.String.errorStoreEXIF)); }); isRunning = true; camera.StartPreview(); return; } } RunOnUiThread(() => Toast.MakeText(context, Application.Context.Resources.GetString(Resource.String.commonPictureTaken), ToastLength.Short).Show()); isRunning = true; camera.StartPreview(); return; }