Saya telah menambahkan uses-permission
termasuk WRITE_EXTERNAL_STORAGE
,MOUNT_UNMOUNT_FILESYSTEMS
,READ_EXTERNAL_STORAGE
untuk AndroidManifest.xml
.
Ketika saya mencoba untuk menjalankan aplikasi saya di Nexus5 (Android 6.0),itu melemparkan pengecualian seperti di bawah ini:
jawa.io.IOException: gagal membuka: EACCES (Permission denied)
Dan saya mencoba ponsel Android lain(Android 5.1),semuanya OK.Berikut ini's kode:
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
currentPhotoPath = image.getAbsolutePath();
return image;
}
Apakah Android 6.0 memiliki perbedaan tentang izin?
Android menambahkan izin baru model untuk Android 6.0 (Marshmallow).
Jadi, anda harus memeriksa Runtime Izin
:
Apa Runtime Permissions?
Dengan Android 6.0 Marshmallow, Google memperkenalkan izin baru model yang memungkinkan pengguna untuk lebih memahami mengapa aplikasi mungkin meminta izin khusus. Daripada pengguna membabi buta menerima semua izin pada waktu menginstal, pengguna sekarang diminta untuk menerima izin sebagai mereka menjadi diperlukan selama menggunakan aplikasi.
Ketika Menerapkan Model Baru?
tidak memerlukan dukungan penuh sampai anda memilih untuk target versi 23 dalam aplikasi anda. Jika anda menargetkan versi 22 atau di bawah anda, aplikasi akan meminta izin pada waktu menginstal sama seperti itu akan pada setiap perangkat yang menjalankan OS di bawah Marshmallow.
Informasi ini diambil dari sini :
Silakan periksa Bagaimana menerapkan dari link ini :
Di Android 6(Marshmallow), meskipun pengguna menerima semua hak akses anda pada waktu menginstal, mereka kemudian dapat memutuskan untuk mengambil beberapa dari mereka izin dari anda.
Solusi cepat tapi tidak dianjurkan: mungkin jika anda mengubah anda targetSdkVersion
di gradle untuk 22
, masalah ini akan diselesaikan.
Bagaimana Menerapkan?(Best Practices)
private boolean shouldAskPermission(){
kembali(Build.VERSI.SDK_INT>Membangun.VERSION_CODES.LOLLIPOP_MR1);
}
shouldAskPermission()
mengembalikan true
, meminta izin anda butuhkan:String[] perms = {"android.izin.WRITE_EXTERNAL_STORAGE"};
int permsRequestCode = 200;
requestPermissions(perms, permsRequestCode);
Metode requestPermissions(String[] permissions, int requestCode);
adalah semua metode yang ditemukan dalam Android kelas Kegiatan.
@Override public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){
switch(permsRequestCode){
kasus 200:
boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
break;
}
}
Setelah menerima hasil, anda akan perlu untuk menangani mereka dengan tepat.
Disarankan Izin Aliran:
Info Lebih Lanjut:
Pengguna dengan Marshmallow perangkat sekarang akan memiliki kemampuan untuk mencabut berbahaya permissions melalui pengaturan aplikasi
Android mendefinisikan beberapa izin seperti "berbahaya" dan beberapa izin seperti "normal." Keduanya diperlukan dalam aplikasi anda adalah nyata tapi hanya berbahaya permissions memerlukan runtime permintaan.
Jika anda telah memilih untuk tidak menerapkan izin baru model(runtime permintaan), pencabutan izin dapat menyebabkan tidak diinginkan pengalaman pengguna dan dalam beberapa kasus aplikasi crash.
Tabel di bawah ini mencantumkan semua berbahaya saat ini perizinan dan masing-masing kelompok:
Jika pengguna menerima satu izin dalam kelompok/kategori mereka menerima seluruh kelompok!
Sumber:http://www.captechconsulting.com
Menggunakan Dexter Perpustakaan:
Anda dapat menggunakan Dexter. Android library yang menyederhanakan proses meminta izin pada runtime.
Anda juga dapat menggunakan ActivityCompat.requestPermissions untuk kompatibel.
contoh:
private static final int REQUEST_CODE = 0x11;
String[] permissions = {"android.permission.WRITE_EXTERNAL_STORAGE"};
ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE); // without sdk version check
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// save file
} else {
Toast.makeText(getApplicationContext(), "PERMISSION_DENIED", Toast.LENGTH_SHORT).show();
}
}
}
Dari API-23 yang anda butuhkan untuk menyatakan izin kegiatan bahkan jika anda telah dinyatakan dalam manifest.
// Storage Permissions variables
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//persmission method.
public static void verifyStoragePermissions(Activity activity) {
// Check if we have read or write permission
int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
Untuk menggunakan hanya menyebut verifyStoragePermissions(ini);
di onCreate.
Yang harus anda lakukan, mudah-mudahan.