2011-12-08 221 views
1

我已經嘗試過自己沒有成功,我可以用java做它,但它在C#中有點不同。任何幫助將是偉大的。我想要的是:Monodroid使用相機拍攝照片

  1. 啓動相機。
  2. 拍照。
  3. 在圖片視圖中查看照片。
+1

我已經回答了這裏同樣的問題http://stackoverflow.com/questions/8068156/access-to-full-resolution-pictures-from-camera-with-monodroid/8072724#8072724 – mironych

回答

1

我知道這是一個相當古老的問題,但我會用我用過的代碼回答它。根據我的經驗,並非所有的設備都能夠使用標準的意圖,並將數據返回到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(); 
     } 
    } 

我用這個作爲參考,介紹如何處理一些不會返回意圖的設備。 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 
    } 
} 
相關問題