Monodroid Take a picture with Camera

半世苍凉 提交于 2019-12-11 10:47:01

问题


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:

  1. Launch the camera.
  2. Take a photo.
  3. View the photo in an image view.

回答1:


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
    }
}


来源:https://stackoverflow.com/questions/8433648/monodroid-take-a-picture-with-camera

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!