ข้อผิดพลาดในการอนุญาตให้ใช้พื้นที่เก็บข้อมูลใน Marshmallow


159

ใน Lollipop ฟังก์ชันการดาวน์โหลดใช้งานได้ดีในแอพของฉัน แต่เมื่อฉันอัปเกรดเป็น Marshmallow แอปของฉันจะขัดข้องและให้ข้อผิดพลาดนี้เมื่อฉันพยายามดาวน์โหลดจากอินเทอร์เน็ตไปยังการ์ด SD:

Neither user  nor current process has android.permission.WRITE_EXTERNAL_STORAGE

มันบ่นเกี่ยวกับรหัสบรรทัดนี้:

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

ฉันมีสิทธิ์ใช้งานในแอปพลิเคชันภายนอก:

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

ฉันทำความสะอาดและสร้างโครงการใหม่ แต่ก็ยังขัดข้อง


ลองใช้วิธีนี้อาจช่วยคุณได้: - stackoverflow.com/a/41221852/5488468
Bipin Bharti

ฉันได้เตรียมไลบรารี่ซึ่งจะช่วยในการจัดการสิทธิ์รันไทม์ได้อย่างง่ายดาย github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

คำตอบ:


357

คุณควรตรวจสอบว่าผู้ใช้ได้รับอนุญาตให้จัดเก็บข้อมูลภายนอกโดยใช้:

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

หากไม่มีคุณต้องขอให้ผู้ใช้อนุญาตให้แอปของคุณอนุญาต:

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

แน่นอนว่าสิ่งเหล่านี้มีไว้สำหรับอุปกรณ์ marshmallow เท่านั้นดังนั้นคุณต้องตรวจสอบว่าแอปของคุณทำงานบน Marshmallow หรือไม่:

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

ให้แน่ใจว่ากิจกรรมของคุณดำเนินการ OnRequestPermissionResult

การอนุญาตทั้งหมดมีลักษณะดังนี้:

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;
    }
}

การเรียกกลับผลการอนุญาต:

@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
    }
}

2
@Houssem ดีใจที่ได้ช่วยเหลือ!
MetaSnarf

14
สิ่งนี้ไม่ทำงานสำหรับ API> = 23 การร้องขอการอนุญาตสำหรับการManifest.permission.WRITE_EXTERNAL_STORAGEส่งคืน '-1' เสมอนั่นคือการอนุญาตถูกปฏิเสธ ตรวจสอบเอกสารใหม่มันบอกว่าสำหรับ API 19 เป็นต้นไปคุณไม่จำเป็นต้องWRITE_EXTERNAL_STORAGEได้รับอนุญาต ตามความเห็นข้างต้นที่กล่าวมาคุณควรทำทั้งหมดนี้กับManifest.permission.READ_EXTERNAL_STORAGE
AmeyaB

3
@VSB: มันอยู่ในสถานที่แปลก ๆ แต่ที่นี่คุณไป: developer.android.com/guide/topics/manifest/
......

3
@AmeyB ในฐานะที่เป็นเอกสารกล่าวว่าสำหรับ API> = 19, รับอนุญาตให้เขียนบนจัดเก็บข้อมูลภายนอกไม่จำเป็นต้องได้รับการประกาศถ้าgetExternalFilesDir()แอพลิเคชันจะใช้ไดเรกทอรีที่เฉพาะเจาะจงของตัวเองในการจัดเก็บภายนอกที่ถูกส่งกลับโดย ในกรณีอื่น ๆandroid.permission.WRITE_EXTERNAL_STORAGEจะต้องมีการประกาศการอนุญาตในรูปแบบ manfiest
VSB

1
ใช่มันได้รับการแก้ไข ปัญหาเกี่ยวข้องกับไลบรารีแอปฮอกกี้ ห้องสมุดนี้ทับสิทธิ์ในการเขียนของฉัน @MetaSnarf
เซลิน

38

ระบบการอนุญาตของ Android เป็นหนึ่งในข้อกังวลด้านความปลอดภัยที่ใหญ่ที่สุดมาตั้งแต่ขออนุญาตเมื่อติดตั้ง เมื่อติดตั้งแล้วแอปพลิเคชันจะสามารถเข้าถึงทุกสิ่งที่ได้รับโดยไม่ได้รับการยอมรับจากผู้ใช้ว่าแอปพลิเคชันทำอะไรกับการอนุญาต

Android 6.0 Marshmallow แนะนำหนึ่งในการเปลี่ยนแปลงที่ใหญ่ที่สุดในรูปแบบสิทธิ์ด้วยการเพิ่มสิทธิ์แบบรันไทม์, รูปแบบการอนุญาตใหม่ที่แทนที่รูปแบบสิทธิ์การติดตั้งเวลาที่มีอยู่เมื่อคุณกำหนดเป้าหมาย API 23 และแอปทำงานบนอุปกรณ์ Android 6.0+

มารยาทไปร้องขอสิทธิ์ที่ Run Time

ตัวอย่าง

ประกาศสิ่งนี้เป็นโกลบอล

private static final int PERMISSION_REQUEST_CODE = 1;

เพิ่มในonCreate()ส่วนของคุณ

หลังจาก 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
    }

กำลังเพิ่ม checkPermission ()และ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

onRequestPermissionsResult

อินเทอร์เฟซนี้เป็นสัญญาการรับผลลัพธ์สำหรับคำขอการอนุญาต


29

ตรวจสอบสิทธิ์ที่หลากหลายในระดับ API 23 ขั้นตอนที่ 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,
};

ขั้นตอนที่ 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;
}

ขั้นตอนที่ 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;
    }
}

ขั้นตอนที่ 4: ใน onCreate ของกิจกรรม checkPermissions ();


2
ขอบคุณ ดูเหมือนว่าคำตอบที่มีแนวโน้มสำหรับการอนุญาตหลายรายการ แต่มันขาดตัวอย่างเล็กน้อย มันจัดการกับnever ask againและขาดการอนุญาตไม่กี่วิธี? ผู้ใช้จะได้รับข้อเสนอแนะใด ๆ ? คงจะดีที่ได้เห็นตัวอย่างจริงของความคิดเห็นนี้หรือมากกว่าในตัวอย่างโค้ดของคุณ
not2qubit

หากต้องการจัดการกับอย่าถามอีกรอบให้เพิ่มการอนุญาตถ้าบล็อกด้วย if (shouldshowpermissionrationale) ()) {} ... มันเป็นความจริงหากจำเป็นต้องได้รับอนุญาตและไม่ได้ไล่ออกตลอดกาล
me_

อันนี้ควรเป็นคำตอบที่ถูกต้องและเหมาะสม
VikaS GuttE

21

คุณสามารถเลือกที่จะบันทึกไฟล์ในไดเรกทอรีแอพได้เว้นแต่จะมีข้อกำหนดในการเขียนที่ชัดเจน ในกรณีของฉันฉันต้องบันทึกไฟล์และหลังจากเสีย 2 ถึง 3 วันฉันพบว่าฉันเปลี่ยนเส้นทางการจัดเก็บจาก

Environment.getExternalStorageDirectory()

ถึง

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

มันใช้งานได้อย่างมีเสน่ห์ในทุกอุปกรณ์ นี่เป็นเพราะสำหรับการเขียนในที่จัดเก็บข้อมูลภายนอกคุณต้องมีสิทธิ์เพิ่มเติม แต่การเขียนในไดเรกทอรีแอพภายในนั้นง่ายมาก


คุณเขียนรหัสนี้ที่ไหน ฉันจำไม่ได้ว่าใช้ Environment.getExternalStorageDiretory () ในรหัสของฉัน
royjavelosa

5

คุณต้องใช้สิทธิ์อนุญาตใน marshmallow https://developer.android.com/training/permissions/requesting.html

คุณสามารถเช็คอินข้อมูลแอป -> สิทธิ์

แอปของคุณได้รับอนุญาตให้เขียนที่เก็บข้อมูลภายนอกหรือไม่


2
จริงๆแล้วข้อมูลแอพคำตอบนี้ -> สิทธิ์แก้ไขความผิดพลาด :) แต่ฉันยอมรับคำตอบอื่น ๆ สำหรับรายละเอียดว่าต้องทำอย่างไร ฉันหวังว่าฉันจะยอมรับทั้งสองขอบคุณมาก
Badr

ขอบคุณที่แก้ไขเบราว์เซอร์ทำงานล้มเหลวในการดาวน์โหลดปัญหาใน Android emulator
sdaffa23fdsf

4

ดูเหมือนผู้ใช้จะปฏิเสธการอนุญาตและแอพพยายามเขียนลงดิสก์ภายนอกทำให้เกิดข้อผิดพลาด

@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
    }
}

ตรวจสอบhttps://developer.android.com/training/permissions/requesting.html

วิดีโอนี้จะทำให้คุณมีความคิดที่ดีขึ้นเกี่ยวกับ UX การจัดการสิทธิ์รันไทม์https://www.youtube.com/watch?v=iZqDdvhTZj0


1

จากเวอร์ชันมาร์ชเมลโลว์นักพัฒนาจำเป็นต้องขอสิทธิ์ใช้งานรันไทม์ถึงผู้ใช้ ให้ฉันให้กระบวนการทั้งหมดสำหรับการขออนุญาตไทม์

ฉันใช้การอ้างอิงจากที่นี่: ขนมหวานรันไทม์สิทธิ์หุ่นยนต์

ขั้นแรกให้สร้างวิธีการที่จะตรวจสอบว่าได้รับอนุญาตทั้งหมดหรือไม่

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;
    } 

ตอนนี้นี่คือรหัสที่รันหลังจากเมธอดด้านบน เราจะแทนที่onRequestPermissionsResult()วิธี:

 @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.
                        }
                    }
                }
            }
        }

    }

หากผู้ใช้คลิกที่ตัวเลือกปฏิเสธshowDialogOK()จะใช้วิธีการเพื่อแสดงกล่องโต้ตอบ

หากผู้ใช้คลิกที่ปฏิเสธและคลิกที่ช่องทำเครื่องหมายบอกว่า "ไม่เคยถามอีก"แล้วexplain()วิธีการที่จะนำมาใช้เพื่อแสดงโต้ตอบ

วิธีการแสดงข้อความโต้ตอบ:

 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();
    }

ตัวอย่างโค้ดด้านบนจะขอสิทธิ์สี่ครั้งต่อครั้ง คุณยังสามารถขอจำนวนสิทธิ์ในกิจกรรมใด ๆ ของคุณตามความต้องการของคุณ


0

หลังจากการค้นหามากมายรหัสนี้ใช้ได้สำหรับฉัน:

ตรวจสอบสิทธิ์ที่มีอยู่แล้ว: ตรวจสอบสิทธิ์ WRITE_EXTERNAL_STORAG ​​E ที่อนุญาตหรือไม่

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);
}

ใช้ Override onRequestPermissionsResult วิธีการตรวจสอบคือผู้ใช้อนุญาตหรือปฏิเสธ

 @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();
        }
    }

0

มันใช้งานได้สำหรับฉัน

 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();
            }
        }
    }

}

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;
                }

            }
        }

0

ก่อนที่จะเริ่มดาวน์โหลดให้ตรวจสอบสิทธิ์การใช้งานจริงของคุณและหากคุณไม่ได้รับอนุญาตให้ขอสิทธิ์เช่นวิธีนี้

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();
        }
    }
}

0

ในวิธีการที่ง่ายสามารถได้รับอนุญาตโดยใช้ไฟล์ manifest.xml แต่มันก็โอเคจนถึงระดับ api 23 sdk รุ่น 6 หลังจากที่นี่ถ้าเราต้องการได้รับการอนุญาตเราต้องขออนุญาตเพื่ออนุญาต ซึ่งมีความจำเป็น

เพียงเพิ่มรหัสนี้ใน mainActivity.java

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

แทนที่ CAMERA หรือเพิ่มด้วย WRITE_EXTERNAL_STORAG ​​E หากคุณต้องการและด้วยรหัสที่ไม่ซ้ำกัน

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

นี่คือรหัสง่ายๆที่จะได้รับอนุญาต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.