Reputation: 157
I have tried it myself with no success, I can do it in java but it is a good bit different in C#. Any help would be great.All I want is to:
Upvotes: 1
Views: 1825
Reputation: 684
I know this is a fairly old question, but I'll answer it with my code that I've used. In my experience messing around with this, not all devices are able to use the standard intent and return data back in the OnActivityResult
.
private void TakePicture()
{
if (PackageManager.HasSystemFeature(PackageManager.FeatureCamera))
{
var intent = new Intent(Android.Provider.MediaStore.ActionImageCapture);
var file = new File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures), "PictureTHIS");
if (!file.Exists())
{
if (!file.Mkdirs())
{
Log.Debug(Constants.LOG_TAG, "Unable to create directory to save photos.");
return;
}
}
_file = new File(file.Path + File.Separator + "IMG_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".jpg");
intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(_file));
StartActivityForResult(intent, Constants.CAMERA_ACTIVITY);
}
else
{
Toast.MakeText(this, "This device does not have a camera, please select an image from another option.", ToastLength.Short).Show();
}
}
I used this as a reference on how to deal with some of the devices that would not return back an intent. http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (resultCode == Result.Ok)
{
//checking for camera acitivy, my app allows both gallery and camera for retrieving pictures.
if (requestCode == Constants.CAMERA_ACTIVITY)
{
//some devices do not pass back an intent so your data could be null
if (data != null && !string.IsNullOrEmpty(data.DataString))
{
//full uri to where the image is on the device.
Android.Net.Uri.Parse(data.DataString);
}
else
{
//issue where some devices don't pass back correct data from the intent.
var uris = GetImagePathFromCamera();
if (uris == null)
{
//had an issue with some devices with no sd card, so i create the file and store it on the device
var orientation = 0;
var date = string.Empty;
//_file is a java.io.file that is passed in the intent with get extra specified.
try
{
var exif = new ExifInterface(_file.Path);
orientation = exif.GetAttributeInt(ExifInterface.TagOrientation, -1);
date = exif.GetAttribute(ExifInterface.TagDatetime);
}
catch { }
switch (orientation)
{
case 6:
Helpers.Orientation = 90;
break;
case 3:
Helpers.Orientation = 180;
break;
case 8:
Helpers.Orientation = 270;
break;
default:
Helpers.Orientation = 0;
break;
}
ContentValues values = new ContentValues();
values.Put(Android.Provider.MediaStore.Images.Media.InterfaceConsts.DisplayName, _file.Name);
values.Put(Android.Provider.MediaStore.Images.Media.InterfaceConsts.DateTaken, date);
values.Put(Android.Provider.MediaStore.Images.Media.InterfaceConsts.MimeType, "image/jpeg");
values.Put(Android.Provider.MediaStore.Images.Media.InterfaceConsts.Orientation, Helpers.Orientation);
values.Put(Android.Provider.MediaStore.Images.Media.InterfaceConsts.Data, _file.Path);
var uri = ContentResolver.Insert(Android.Provider.MediaStore.Images.Media.ExternalContentUri, values);
//uri returned is the path to the image on the device
}
else
{
//uris is a list of uri's specifying the image taken and its thumbnail
}
};
}
}
else
{
//notify user the camera was cancelled if you want
}
}
Upvotes: 1