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()); 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
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
Selamlar. İnsanlar için faydalı olması amacıyla geliştirdiğim Kaza Namazı ve Oruç Takip Uygulamasını sizlere tanıtmak… Daha Fazla Oku
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
Merhaba. Bu yazımda Android platformunda kullanıma sunulan, bazı kod bloklarını basitleştiren ve okunabilirliği arttıran ButterKnife… Daha Fazla Oku
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
Yorumları Göster
Hay Allah razı olsun hocam beni büyük bir dertten kurtardın. Çok teşekkür ediyorum. :)