Press ESC to close

Xamarin Forms Kamera İşlemleri ( Güncelleme )

Sizlere bu yazımda son zamanlarda sıkça aldığım bir hatanın çözümünden bahsedeceğim. Özellikle son zamanlarda Xamarin Forms’da kamerayı kullanıp video ve fotoğraf çekmek için kullandığımız Media.Plugin’i projemize dahil etmemiz için bir kaç ayrıntıya daha yer vermemiz gerekiyordu. BU ayarları yapmadığımız takdirde karşımıza aşağıda ki gibi bir hata çıkıyordu.

Unable to get file location. This most likely means that the file provider information is not set in your Android Manifest file. Please check documentation on how to set this up in your project.

Böyle bir hata ile karşılaşmamak için aşağıda ki adımları takip ediniz. İlk olarak projemize Manage Nuget Package Manager ile Media.Plugin’i kurmamız gerekiyor. Zaten bu paketi kurduktan sonra da karşımıza readme.txt adında bir dosya ile karşı karşıya kalıyoruz. Paketi kurduktan sonra android çin bir kaç izin vermemiz gerekiyor. Bu izinler kamerayı kullanmak, hafızayı okumak ve hafızaya veri yazmak olacak. Bunu yapmamız için projemizin android katmanına gelip sağa tıklayıp özellikler seçeneğine tıklamamız gerekiyor. Karşımıza çıkan sayfanın yan kısmında seçenekler var. Biz bu seçeneklerden Android Manifest katmanına geliyoruz. BU sayfada bulunan verilen izinler yerinde yukarıda ki izinleri vermeniz gerekiyor. Böylece izin verdiğimiz bu özellikleri kullanabileceğiz.

İlk adımı tamamladıktan sonra diğer bir adım olan verdiğimiz izinleri Main Activity sınıfında almamız gerekiyor. Bunun için aşağıdaki kod parçasını kopyalayıp oraya yapıştırmanız gerekmekte.

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
    Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Bu adımı da geçtikten sonra diğer adım eklediğimiz paketi Main Activity  sınıfında otomatik olarak gelmediyse elle eklememiz gerekiyor. Yine aşağıda ki kod parçasıyla bu işlemi yerine getirmemiz gerekiyor.

Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity = this;

Bununla da bitmiyor sonrasında ise yine bir kaç işlem daha yapmanız gerekmekte. Yine android katmanın altında yer alan AssemblyInfo.cs sınfına aşağıda ki kod satırını ekleyeceğiz.

[assembly: UsesFeature("android.hardware.camera", Required = false)] 
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = false)]

Son olarak yapacaklarımız en kritik olanına geldik. Bu son işlem ile verilerimizi hangi dosya yolunda saklayacağımızı belirtiyoruz. Eğer bunu doğru bir şekilde yapamaz isek yazının başında belirttiğim hatayı alıyoruz. Android katmanının altında bulunan properties’in içinde bulunan AndroidManifest.xml dosyasında bir kaç ekleme yapacağız. Bu dosyanın içinde bulunan application tagleri içerisine aşağıda ki kod parçasını eklemeniz gerekiyor.

<provider android:name="android.support.v4.content.FileProvider" 
          android:authorities="${applicationId}.fileprovider" 
          android:exported="false" 
          android:grantUriPermissions="true">
          
	  <meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
                     android:resource="@xml/file_paths"></meta-data>
</provider>

En son olarak da dosyalarımızın telefonda hangi yolda olduklarını belirtmek için bir xml dosyası açmamız gerekiyor. Bu xml dosyasını Android katmanın altında yer alan Resources klasörünün içine xml isimli bir klasör oluşturuyoruz ve ardından bu klasörün içine file_paths.xml isimli bir dosya oluşturup aşağıda ki kodları içine aktarıyoruz.

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="my_images" path="Pictures" />
    <external-files-path name="my_movies" path="Movies" />
</paths>

Bu işlemler sonrasında Xaml.Media.Plugin’i rahatlıkla kullanabilirsiniz.

Fotoğraf çekme, seçme veya video çekme, seçme işlemleri için burada ki yazımdan faydalanabilirsiniz.

Sorularınız olursa mail veya yorum atarak ulaşabilirsiniz.

Comments (8)

  • braiansays:

    Pazartesi Temmuz 9th, 2018 at 16:46

    Hi, I’m doing an app in Xamarin and I’m throwing the error that you described for your solution but I’m still throwing the same error and I’ve done everything you put in, but there’s no way, I do not know what to modify.

    There is something that catches my attention, the method that was described by those who call it because it seems to me that from some side I could invoke it.

    public override void OnRequestPermissionsResult (int requestCode, string [] permissions, Android.Content.PM.Permission [] grantResults)
    {
         Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult (requestCode, permissions, grantResults);
    }

    thank you very much, discuylpe the inconveniences I am new in this language and it is throwing me many errors

      • braiansays:

        Çarşamba Ağustos 1st, 2018 at 18:02

        1067/5000
        Traducir del: inglés
        Hi, the error I get when you get to the following code, however I gave you all the permissions that you posted and I get the error “Unable to get file location.” This most likely means that the file provider information is not set in your Android Manifest file. Please check documentation on how to set this up in your project. ”

        await CrossMedia.Current.Initialize ();
        var opAlma = new StoreCameraMediaOptions ()
        {
        PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
        CustomPhotoSize = 25,
        DefaultCamera = Plugin.Media.Abstractions.CameraDevice.Rear,
        AllowCropping = true,
        SaveToAlbum = true,
        Directory = “Directory”,
        Name = “MyFoto.jpg”,

        };
        //in the following line I throw the error
        var photo = await CrossMedia.Current.TakePhotoAsync (opAlma);
        myFoto.Source = ImageSource.FromStream (() =>
        {
        var stream = foto.GetStream ();
        foto.Dispose ();
        return stream;
        });

        • omersezersays:

          Perşembe Ağustos 2nd, 2018 at 18:23

          OK. I understand u. Create a folder named xml under the Resources folder. You should also create file_paths.xml in the folder named xml. I solved my problem like that.

  • Furkansays:

    Çarşamba Temmuz 14th, 2021 at 02:45

    Merhaba
    Ben bir proje üzerinde çalışıyorum. Kameranın içerisinde resim veya animasyon çıkarmam lazım, bir türlü kaynak bulamadım. Yardım ederseniz sevinirim.

    İyi çalışmalar.

    • omersezersays:

      Perşembe Temmuz 15th, 2021 at 12:42

      Selam,

      Burada custom renderer yazman gerekcektir. Xamarin için sanırım bölye bir destek yok şu an için ama custom renderer ile yapabilirsiniz.

      İyi çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir