Hata Çözümleri

Android Oreo (8.0) Resim Ekleme Sorununun Çözümü

Merhaba. Hazırladığım bir uygulamada Android Oreo (8.0) ve üzeri cihazlarda kameradan ya da galeriden resim eklemeye çalışıldığında hata alındığını farkettim. API 26 ve üzerinde alınan hatanın çözümünü anlatacağım.

Öncelikle hata alınan örnek bir kod bloğu gösterelim.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = new File(Environment.getExternalStorageDirectory(),
      "/DCIM/Camera/" + timeStamp + ".jpg");
SingletonClass.setimageUri(Uri.fromFile(photo));
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
Uri imageUri = Uri.fromFile(photo);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

Bu kod aşağıdaki gibi bir hata verecektir

android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/Camera/beyan.jpg exposed beyond app through ClipData.Item.getUri()

Burada Uri.fromFile() metodu hata verecektir ve eğer Try-Catch mekanizmanız yoksa resim eklerken uygulama durdurulacaktır.

Çözümü için ilk olarak 6.satırı aşağıdaki gibi satırı güncelliyoruz.

Uri imageUri = FileProvider.getUriForFile(MyActivity.this, BuildConfig.APPLICATION_ID + ".provider",photo);

Daha sonra AndroidManifest dosyamızın en altına application etiketinden hemen önce şu satırları ekliyoruz.

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

Daha sonra res klasörü altında xml adında bir klasör oluşturup bu klasörün içine de provider_paths adında bir xml dosyası oluşturarak içerisine şu kodları yazıyoruz.

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
    name="storage/emulated/0"
    path="." />
</paths>

Son olarak bu işlemleri yaptığınız class içerisineki setContentView() metodundan sonra aşağıdaki kodları yazıyoruz.

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
Mehmet Kirazlı

İstanbul Eyüp'te ikamet ediyorum. Giresun Alucra'lıyım. Bilgisayar Mühendisliği bölümünden 2013 yılında mezun oldum. "Yeni Başlayanlar için Java 8" kitabının yazarıyım. Şu anda özel bir firmada Mobil Yazılım Geliştirme Uzmanı olarak çalışıyorum.

Yorumları Göster

  • Hay Allah razı olsun hocam beni büyük bir dertten kurtardın. Çok teşekkür ediyorum. :)

Son Gönderiler

Android Firebase Event (not set) Hatası Çözümü

Merhaba. Firebase Events'e istatistik attığınızda not set şeklinde bir değer görüyorsanız olası çözümünü göstereceğim. (daha&helliip;) Daha Fazla Oku

% gün önce

Namaz Vakitleri Uygulaması Yayında

Merhaba. Android cihazlar için hazırladığım Namaz Vakitleri uygulaması ile 200'e yakın ülkede tüm namaz-ezan vakitlerini… Daha Fazla Oku

% gün önce

Kaza Namazı ve Oruç Takip Uygulaması

Selamlar. İnsanlar için faydalı olması amacıyla geliştirdiğim Kaza Namazı ve Oruç Takip Uygulamasını sizlere tanıtmak… Daha Fazla Oku

% gün önce

Android Volley Kullanımı ve JSON Parse İşlemleri

Volley, Android uygulamalarımızda kullandığımız AsyncTask'ın alternatifi olarak ortaya çıkarılan, Google I/O 2013 sunumunda duyurulan bir… Daha Fazla Oku

% gün önce

Android ButterKnife Kütüphanesi Kullanımı

Merhaba. Bu yazımda Android platformunda kullanıma sunulan, bazı kod bloklarını basitleştiren ve okunabilirliği arttıran ButterKnife… Daha Fazla Oku

% gün önce

Admob TikTok Reklamları Engelleme

Merhaba. Bu yazımda artık baş belası olmuş TikTok reklamlarını, Android uygulamalarımızdaki Admob reklamlarından nasıl kaldıracağımızı… Daha Fazla Oku

% gün önce