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.
1 2 3 4 5 6 7 |
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
1 |
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.
1 |
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.
1 2 3 4 5 6 7 8 9 |
<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.
1 2 3 4 5 6 |
<?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.
1 2 |
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); |
Hay Allah razı olsun hocam beni büyük bir dertten kurtardın. Çok teşekkür ediyorum. 🙂