2014-10-10 7 views
7

मैं यहां से Xamarin.Forms कैमरा नमूना का उपयोग कर रहा हूं - https://github.com/XForms/Xamarin-Forms-Labs-Samples/tree/master/XF.Labs.CameraSample मैं एक फोटो चुनने या लेने में सक्षम हूं।Xamarin.Forms कैमरे के साथ फोटो ले लो गलत अभिविन्यास और बैक बटन पर क्रैश दिखाता है

private async Task SelectPicture() 
{ 
    mediaPicker = DependencyService.Get<IMediaPicker>(); 
    imageSource = null; 
     var mediaFile = await mediaPicker.SelectPhotoAsync(new CameraMediaStorageOptions 
      { 
       DefaultCamera = CameraDevice.Front, 
       MaxPixelDimension = 400 
      }); 
     imageSource = ImageSource.FromStream(() => mediaFile.Source); 
     img.Source = imageSource; 

} 


private async Task TakePicture() 
{ 
    mediaPicker = DependencyService.Get<IMediaPicker>(); 
    imageSource = null; 
     var mediaFile = await mediaPicker.TakePhotoAsync(new CameraMediaStorageOptions 
      { 
       DefaultCamera = CameraDevice.Front, 
       MaxPixelDimension = 400 
      }); 
     imageSource = ImageSource.FromStream(() => mediaFile.Source); 
     img.Source = imageSource; 

} 

छवि के लिए कोड बस है

img = new Image 
    { 
     BackgroundColor = Color.White, 
     Aspect = Aspect.AspectFit 
    };  

मुद्दों के एक जोड़े हैं:

पहले एक। आप एक फोटो ले सकते हैं या एक संग्रहीत एक का चयन कर सकते हैं और फिर इसे पृष्ठ पर दिखाएंगे। यदि आप एक फोटो चुनते हैं तो यह इसे सही ढंग से प्रदर्शित करता है, या तो चित्र या परिदृश्य। जब आप कोई फोटो लेते हैं, तो यह केवल लैंडस्केप मोड में प्रदर्शित होता है, इसलिए यदि चित्र चित्र में लिया गया था, तो छवि पक्ष पर दिखाई देती है। यह विनाशकारी नहीं है, लेकिन यह छवि को दिखाने के लिए बेहतर होगा कि यह कैसे लिया गया था।

दूसरा मुद्दा थोड़ा अधिक कठोर है, अगर आप कैमरे या छवि गैलरी में डिवाइस के बैक बटन दबाते हैं तो स्क्रीन खाली हो जाती है और फिर आपको एक संदेश मिलता है जिसमें ऐप ने जवाब देना बंद कर दिया है।

मैंने अभी तक एंड्रॉइड पर यह कोशिश की है। क्या किसी के पास कोई विचार है कि मैं उपरोक्त समस्याओं को कैसे हल कर सकता हूं?

संपादित करें: मैं वापस बटन पर क्रैश होने को ठीक करने में कामयाब रहे, लेकिन छवि अभी भी आईओएस

+0

किसी को भी इस समस्या का समाधान किया? –

+0

मुझे इन समाधानों को आजमाने का मौका नहीं मिला है, लेकिन यह केवल सैमसंग उपकरणों पर एक मुद्दा प्रतीत होता है। – user1667474

उत्तर

1

मुझे लगता है कि करने के लिए यहाँ मुद्दों के एक जोड़े हैं उपक्रम होगा के लिए सही ढंग से Android के लिए उसके पक्ष में प्रदर्शित करता है, लेकिन प्रदर्शित करता है। एक Xamarin.Forms. एंड्रॉइड पर लैब्स निर्भरता इंजेक्शन हैंडलर 1) आवश्यक रोटेशन की जांच नहीं कर रहा है, 2) बाहरी भंडारण की जांच नहीं कर रहा है या सक्रियता पर संभाल नहीं रहा है।

आपकी समस्या का आसान समाधान Xamarin.Mobile Xamarin.Mobile का उपयोग करना होगा, मैं 100% पुष्टि नहीं कर सकता कि यह सबकुछ संभालेगा लेकिन यदि यह करता है तो यह एक त्वरित और आसान समाधान होगा।

आपको अधिक नियंत्रण देने वाला अधिक कठिन विकल्प आपके प्लेटफ़ॉर्म विशिष्ट कार्यान्वयन को रोल करना होगा। मैं इस बारे में नहीं जा रहा हूं कि आप कैसे जानते हैं या Accessing Native Features

यहां एंड्रॉइड का एक उदाहरण है, यह पता लगाने के लिए कि भंडारण बाहरी है या नहीं और घूर्णन की आवश्यकता है या नहीं।

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
    { 


     base.OnActivityResult(requestCode, resultCode, data); 
     //FinishActivity(requestCode); 
     try 
     { 

     if (resultCode == Result.Ok) 
     { 
      switch (requestCode) 
      { 
       case TAKE_PHOTO: 
        { 
         Java.IO.File photo = null; 

         if (isMounted) 
         { 

         photo = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory.ToString(), SharedLibrary.strPhotoLocation); 

         } 
         else 
         { 
         photo = new Java.IO.File(CacheDir, SharedLibrary.strPhotoLocation); 
         } 


         BitmapFactory.Options options = new BitmapFactory.Options(); 
         options.InJustDecodeBounds = true; 
         options.InSampleSize = 4; 
         options.InPurgeable = true; 
         options.InInputShareable = true;       

         try 
         { 
          //Cleanup code... removed this in favor of using options.InJustDecodeBounds to get info about the bitmap 
          //instead of creating it twice in memory 

          //Bitmap imageBitmap = BitmapFactory.DecodeFile(photo.AbsolutePath, options); 


          //int w = imageBitmap.Width; 
          //int h = imageBitmap.Height; 

          BitmapFactory.DecodeFile(photo.AbsolutePath, options); 
          int w = options.OutWidth; 
          int h = options.OutHeight; 

          Matrix matrix = new Matrix(); 
          matrix.SetRotate(getNeededRotation(photo.AbsolutePath)); 

          options.InJustDecodeBounds = false; 

          //Bitmap imageBitmap = Bitmap.CreateBitmap(BitmapFactory.DecodeFile(photo.AbsolutePath, options), 0, 0, w, h, matrix, false);              
          Bitmap imageBitmap = Bitmap.CreateScaledBitmap(BitmapFactory.DecodeFile(photo.AbsolutePath, options), w, h, false); 
          //... 

घुड़सवार हो जाओ

 private System.Boolean isMounted 
    { 
     get 
     { 
      return  (System.Boolean)Android.OS.Environment.ExternalStorageState.Equals(Android.OS.Environment.MediaMounted); 
     } 
    }        

GetRotationNeeded

private int getNeededRotation(string filepath) 
    { 
     ExifInterface exif = new ExifInterface(filepath); 
     int orientation = exif.GetAttributeInt(ExifInterface.TagOrientation, -1); 
     int rotate = 0; 
     switch (orientation) 
     { 
      case 6: 
       { 
        rotate = 90; 
        break; 
       } 
      case 3: 
       { 
        rotate = 180; 
        break; 
       } 
      case 8: 
       { 
        rotate = 270; 
        break; 
       } 
      default: 
       { 
        rotate = 0; 
        break; 
       } 


     } 
     exif.Dispose(); 
     return rotate; 
    } 
1

आप चाहे वह पोर्ट्रेट या लैंडस्केप है की जाँच करने के लिए 'mediaFile.Exif.Orientation' का उपयोग करके उन्मुखीकरण देख सकते हैं। ('टॉप लिफ्ट' -> पोर्ट्रेट।) और फिर उपयोग करने से पहले फोटो अभिविन्यास सेट करें,

mediaFile.Exif.Orientation = ExifLib.ExifOrientation.TopLeft;

+0

पर परीक्षण किए गए अन्य उपकरणों पर ठीक काम करता है यह वर्तमान Xlab rekease के साथ काम नहीं कर रहा है। –

संबंधित मुद्दे