Kesalahan izin penyimpanan di Marshmallow

159

Di Lollipop, fungsi unduhan berfungsi dengan baik di aplikasi saya, tetapi ketika saya memutakhirkan ke Marshmallow, aplikasi saya macet dan memberikan kesalahan ini ketika saya mencoba mengunduh dari internet ke kartu SD:

Neither user  nor current process has android.permission.WRITE_EXTERNAL_STORAGE

Mengeluh tentang baris kode ini:

DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

Saya memiliki izin dalam aplikasi luar manifes:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Saya membersihkan dan membangun kembali proyek, tetapi masih macet.

Badr
sumber
Cobalah ini mungkin membantu Anda: - stackoverflow.com/a/41221852/5488468
Bipin Bharti
Saya telah menyiapkan perpustakaan yang akan membantu menangani izin runtime dengan mudah. github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Jawaban:

357

Anda harus memeriksa apakah pengguna telah memberikan izin penyimpanan eksternal dengan menggunakan:

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    Log.v(TAG,"Permission is granted");
    //File write logic here
    return true;
}

Jika tidak, Anda harus meminta pengguna untuk memberi izin aplikasi Anda:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

Tentu saja ini hanya untuk perangkat marshmallow sehingga Anda perlu memeriksa apakah aplikasi Anda berjalan di Marshmallow:

 if (Build.VERSION.SDK_INT >= 23) {
      //do your check here
 }

Pastikan juga aktivitas Anda diimplementasikan OnRequestPermissionResult

Seluruh izin terlihat seperti ini:

public  boolean isStoragePermissionGranted() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG,"Permission is granted");
            return true;
        } else {

            Log.v(TAG,"Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        Log.v(TAG,"Permission is granted");
        return true;
    }
}

Panggilan balik hasil izin:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
        //resume tasks needing this permission
    }
}
MetaSnarf
sumber
2
@Houssem senang membantu.!
MetaSnarf
14
Ini tidak berfungsi untuk API> = 23, meminta izin untuk Manifest.permission.WRITE_EXTERNAL_STORAGEselalu mengembalikan '-1' yaitu Izin ditolak. Periksa dokumentasi baru, dikatakan bahwa untuk API 19 dan seterusnya, Anda tidak perlu WRITE_EXTERNAL_STORAGEizin. Seperti yang disebutkan beberapa komentar di atas, Anda harus melakukan semua ini denganManifest.permission.READ_EXTERNAL_STORAGE
AmeyaB
3
@VSB: Di tempat yang aneh tapi di sini Anda pergi: developer.android.com/guide/topics/manifest/…
AmeyaB
3
@ AmeyB Seperti yang dikatakan dokumentasi, untuk API> = 19, izin untuk menulis pada penyimpanan eksternal tidak diperlukan untuk dinyatakan JIKA aplikasi akan menggunakan direktori spesifiknya sendiri pada penyimpanan eksternal yang dikembalikan oleh getExternalFilesDir(). Dalam kasus lain, izin masih android.permission.WRITE_EXTERNAL_STORAGEharus dinyatakan dalam manfiest.
VSB
1
Ya itu diperbaiki. Masalahnya terkait dengan perpustakaan aplikasi hoki. perpustakaan ini telah mengesampingkan izin tulis saya. @MetaSnarf
Selin
38

Sistem izin Android adalah salah satu masalah keamanan terbesar selama ini karena izin tersebut diminta pada waktu pemasangan. Setelah diinstal, aplikasi akan dapat mengakses semua hal yang diberikan tanpa pengakuan pengguna apa pun yang sebenarnya dilakukan aplikasi dengan izin.

Android 6.0 Marshmallow memperkenalkan salah satu perubahan terbesar pada model izin dengan penambahan izin runtime, model izin baru yang menggantikan model izin waktu instal yang ada saat Anda menargetkan API 23 dan aplikasi berjalan pada perangkat Android 6.0+

Courtesy pergi ke Permohonan Izin pada Run Time .

Contoh

Nyatakan ini sebagai Global

private static final int PERMISSION_REQUEST_CODE = 1;

Tambahkan ini di onCreate()bagian Anda

Setelah setContentView (R.layout.your_xml);

 if (Build.VERSION.SDK_INT >= 23)
    {
        if (checkPermission())
        {
            // Code for above or equal 23 API Oriented Device 
            // Your Permission granted already .Do next code
        } else {
            requestPermission(); // Code for permission
        }
    }
  else
    {

       // Code for Below 23 API Oriented Device 
       // Do next code
    }

Sekarang menambahkan checkPermission () dan requestPermission ()

 private boolean checkPermission() {
    int result = ContextCompat.checkSelfPermission(Your_Activity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (result == PackageManager.PERMISSION_GRANTED) {
        return true;
    } else {
        return false;
    }
}

private void requestPermission() {

    if (ActivityCompat.shouldShowRequestPermissionRationale(Your_Activity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Toast.makeText(Your_Activity.this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
    } else {
        ActivityCompat.requestPermissions(Your_Activity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.e("value", "Permission Granted, Now you can use local drive .");
            } else {
                Log.e("value", "Permission Denied, You cannot use local drive .");
            }
            break;
    }
}

FYI

padaRequestPermissionsResult

Antarmuka ini adalah kontrak untuk menerima hasil untuk permintaan izin.

IntelliJ Amiya
sumber
29

Periksa beberapa Izin di API level 23 Langkah 1:

 String[] permissions = new String[]{
        Manifest.permission.INTERNET,
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.VIBRATE,
        Manifest.permission.RECORD_AUDIO,
};

Langkah 2:

 private boolean checkPermissions() {
    int result;
    List<String> listPermissionsNeeded = new ArrayList<>();
    for (String p : permissions) {
        result = ContextCompat.checkSelfPermission(this, p);
        if (result != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), 100);
        return false;
    }
    return true;
}

Langkah 3:

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if (requestCode == 100) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // do something
        }
        return;
    }
}

Langkah 4: di onCreate of Activity checkPermissions ();

Bipin Bharti
sumber
2
Terima kasih. Ini terlihat seperti jawaban yang menjanjikan untuk beberapa izin. Tapi kurang dalam contoh. Bagaimana cara menangani never ask againdan melewatkan beberapa izin? Apakah pengguna mendapat umpan balik? Pasti menyenangkan melihat contoh nyata dari ini atau lebih banyak komentar pada cuplikan kode Anda.
not2qubit
Untuk menghadapinya jangan bertanya lagi di sekitar add to permissions if block with if (shouldshowpermissionrationale ()) {} ... memang benar jika izin diperlukan dan tidak selamanya diberhentikan
me_
Yang ini harus jawaban yang benar dan dioptimalkan.
VikaS GuttE
21

Kecuali jika ada persyaratan tertentu untuk menulis di penyimpanan eksternal, Anda selalu dapat memilih untuk menyimpan file di direktori aplikasi. Dalam kasus saya, saya harus menyimpan file dan setelah membuang 2 sampai 3 hari saya mengetahui apakah saya mengubah jalur penyimpanan

Environment.getExternalStorageDirectory()

untuk

getApplicationContext().getFilesDir().getPath() //which returns the internal app files directory path

ini bekerja seperti pesona di semua perangkat. Ini karena untuk menulis di penyimpanan eksternal Anda memerlukan izin tambahan tetapi menulis di direktori aplikasi internal sederhana.

Mujtaba Hassan
sumber
di mana Anda menulis kode ini? Saya tidak ingat menggunakan Environment.getExternalStorageDiretory () pada kode saya
royjavelosa
5

Anda perlu menggunakan izin runtime di marshmallow https://developer.android.com/training/permissions/requesting.html

Anda dapat memeriksa info aplikasi -> izin

apakah aplikasi Anda mendapatkan izin untuk menulis penyimpanan eksternal atau tidak

aiwiguna
sumber
2
sebenarnya info aplikasi jawaban ini -> izin memecahkan crash :), tetapi saya menerima jawaban lain untuk rincian apa yang harus dilakukan. Saya berharap saya dapat menerima keduanya Terima kasih banyak
Badr
Terima kasih telah memperbaiki peramban yang bermasalah saat mengunduh di emulator android
sdaffa23fdsf
4

Tampaknya pengguna telah menolak izin dan aplikasi mencoba menulis ke disk eksternal, menyebabkan kesalahan.

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Periksa https://developer.android.com/training/permissions/requesting.html

Video ini akan memberi Anda ide yang lebih baik tentang UX, menangani izin Runtime https://www.youtube.com/watch?v=iZqDdvhTZj0

VenomVendor
sumber
1

Dari versi marshmallow, pengembang perlu meminta izin runtime kepada pengguna. Biarkan saya memberi Anda seluruh proses untuk meminta izin runtime.

Saya menggunakan referensi dari sini: izin runtime marshmallow android .

Pertama buat metode yang memeriksa apakah semua izin diberikan atau tidak

private  boolean checkAndRequestPermissions() {
        int camerapermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        int writepermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int permissionLocation = ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION);
        int permissionRecordAudio = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);


        List<String> listPermissionsNeeded = new ArrayList<>();

        if (camerapermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.CAMERA);
        }
        if (writepermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (permissionLocation != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (permissionRecordAudio != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.RECORD_AUDIO);
        }
        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    } 

Sekarang di sini adalah kode yang dijalankan setelah metode di atas. Kami akan mengganti onRequestPermissionsResult()metode:

 @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        Log.d(TAG, "Permission callback called-------");
        switch (requestCode) {
            case REQUEST_ID_MULTIPLE_PERMISSIONS: {

                Map<String, Integer> perms = new HashMap<>();
                // Initialize the map with both permissions
                perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
                // Fill with actual results from user
                if (grantResults.length > 0) {
                    for (int i = 0; i < permissions.length; i++)
                        perms.put(permissions[i], grantResults[i]);
                    // Check for both permissions
                    if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
                            && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
&& perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
&& perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
                        Log.d(TAG, "sms & location services permission granted");
                        // process the normal flow
                        Intent i = new Intent(MainActivity.this, WelcomeActivity.class);
                        startActivity(i);
                        finish();
                        //else any one or both the permissions are not granted
                    } else {
                        Log.d(TAG, "Some permissions are not granted ask again ");
                        //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission
//                        // shouldShowRequestPermissionRationale will return true
                        //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup.
                        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) 
|| ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
|| ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
 || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
                            showDialogOK("Service Permissions are required for this app",
                                    new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            switch (which) {
                                                case DialogInterface.BUTTON_POSITIVE:
                                                    checkAndRequestPermissions();
                                                    break;
                                                case DialogInterface.BUTTON_NEGATIVE:
                                                    // proceed with logic by disabling the related features or quit the app.
                                                    finish();
                                                    break;
                                            }
                                        }
                                    });
                        }
                        //permission is denied (and never ask again is  checked)
                        //shouldShowRequestPermissionRationale will return false
                        else {
                            explain("You need to give some mandatory permissions to continue. Do you want to go to app settings?");
                            //                            //proceed with logic by disabling the related features or quit the app.
                        }
                    }
                }
            }
        }

    }

Jika pengguna mengklik opsi Tolak maka showDialogOK()metode akan digunakan untuk menampilkan dialog

Jika pengguna mengklik Tolak dan juga mengklik kotak centang yang mengatakan "tidak pernah bertanya lagi" , maka explain()metode akan digunakan untuk menampilkan dialog.

metode untuk menampilkan dialog:

 private void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", okListener)
                .create()
                .show();
    }
    private void explain(String msg){
        final android.support.v7.app.AlertDialog.Builder dialog = new android.support.v7.app.AlertDialog.Builder(this);
        dialog.setMessage(msg)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        //  permissionsclass.requestPermission(type,code);
                        startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.exampledemo.parsaniahardik.marshmallowpermission")));
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        finish();
                    }
                });
        dialog.show();
    }

Cuplikan kode di atas meminta empat izin sekaligus. Anda juga dapat meminta sejumlah izin dalam aktivitas apa pun sesuai kebutuhan Anda.

user6435056
sumber
0

Setelah banyak mencari, kode ini berfungsi untuk saya:

Periksa izin yang sudah ada: Periksa izin WRITE_EXTERNAL_STORAGE Diizinkan atau tidak?

if(isReadStorageAllowed()){
            //If permission is already having then showing the toast
            //Toast.makeText(SplashActivity.this,"You already have the permission",Toast.LENGTH_LONG).show();
            //Existing the method with return
            return;
        }else{
            requestStoragePermission();
        }



private boolean isReadStorageAllowed() {
    //Getting the permission status
    int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);

    //If permission is granted returning true
    if (result == PackageManager.PERMISSION_GRANTED)
        return true;

    //If permission is not granted returning false
    return false;
}

//Requesting permission
private void requestStoragePermission(){

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
        //If the user has denied the permission previously your code will come to this block
        //Here you can explain why you need this permission
        //Explain here why you need this permission
    }

    //And finally ask for the permission
    ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE_STORAGE);
}

Menerapkan metode Override onRequestPermissionsResult untuk memeriksa apakah pengguna mengizinkan atau menolak

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    //Checking the request code of our request
    if(requestCode == REQUEST_WRITE_STORAGE){

        //If permission is granted
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

            //Displaying a toast
            Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();

        }else{
            //Displaying another toast if permission is not granted
            Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show();
        }
    }
Tariqul
sumber
0

ini bekerja untuk saya

 boolean hasPermission = (ContextCompat.checkSelfPermission(AddContactActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
    if (!hasPermission) {
        ActivityCompat.requestPermissions(AddContactActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
    }

   @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(AddContactActivity.this, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }

}
RejoylinLokeshwaran
sumber
0
   Try this



int permission = ContextCompat.checkSelfPermission(MainActivity.this,
                    android.Manifest.permission.WRITE_EXTERNAL_STORAGE);

     if (permission != PackageManager.PERMISSION_GRANTED) {
                Log.i("grant", "Permission to record denied");

                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage(getString(R.string.permsg))
                            .setTitle(getString(R.string.permtitle));

                    builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int id) {
                            Log.i("grant", "Clicked");
                            makeRequest();
                        }
                    });

                    AlertDialog dialog = builder.create();
                    dialog.show();

                } else {

                    //makeRequest1();
                    makeRequest();
                }
            }


     protected void makeRequest() {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    500);
        }



     @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case 500: {

                    if (grantResults.length == 0
                            || grantResults[0] !=
                            PackageManager.PERMISSION_GRANTED) {

                        Log.i("1", "Permission has been denied by user");

                    } else {

                        Log.i("1", "Permission has been granted by user");

                    }
                    return;
                }

            }
        }
Makvin
sumber
0

Sebelum memulai unduhan, periksa izin runtime Anda dan jika Anda tidak memiliki izin, minta izin seperti metode ini

requestStoragePermission ()

private void requestStoragePermission(){
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
                android.Manifest.permission.READ_EXTERNAL_STORAGE))
        {

        }

        ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            STORAGE_PERMISSION_CODE);
}

@Override
public void onRequestPermissionsResult(int requestCode, 
                @NonNull String[] permissions, 
                @NonNull int[] grantResults) {

    if(requestCode == STORAGE_PERMISSION_CODE){
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        }
        else{
            Toast.makeText(this,
                           "Oops you just denied the permission", 
                           Toast.LENGTH_LONG).show();
        }
    }
}
Balaji Rajendran
sumber
0

Secara sederhana izin dapat diberikan menggunakan file manifest.xml, tetapi itu ok sampai tingkat api 23 sdk versi 6, setelah dari sini, jika kita ingin mendapatkan izin kita harus meminta penggunaannya untuk mengizinkan izin yang dibutuhkan.

Cukup tambahkan kode ini di mainActivity.java

Override
            public void onClick(View view) {
                // Request the permission
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.CAMERA},
                        PERMISSION_REQUEST_CAMERA);

Ganti CAMERA atau tambahkan dengan WRITE_EXTERNAL_STORAGE jika Anda mau, dan dengan kode unik.

                            new String[]{Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    101);

Ini adalah kode sederhana untuk mendapatkan izin.

Pravin Ghorle
sumber