Lỗi quyền lưu trữ trong Marshmallow


159

Trong Lollipop, chức năng tải xuống hoạt động tốt trong ứng dụng của tôi, nhưng khi tôi nâng cấp lên Marshmallow, ứng dụng của tôi gặp sự cố và gặp lỗi này khi tôi cố tải xuống từ internet vào thẻ SD:

Neither user  nor current process has android.permission.WRITE_EXTERNAL_STORAGE

Nó phàn nàn về dòng mã này:

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

Tôi có quyền trong tệp kê khai bên ngoài:

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

Tôi đã làm sạch và xây dựng lại dự án, nhưng nó vẫn bị hỏng.


Hãy thử điều này có thể giúp bạn: - stackoverflow.com/a/41221852/5488468
Bipin Bharti

Tôi đã chuẩn bị một thư viện sẽ giúp xử lý các quyền thời gian chạy một cách dễ dàng. github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Câu trả lời:


357

Bạn nên kiểm tra xem người dùng có được phép lưu trữ ngoài hay không bằng cách sử dụng:

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

Nếu không, bạn cần yêu cầu người dùng cấp quyền cho ứng dụng của bạn:

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

Tất nhiên những thứ này chỉ dành cho thiết bị marshmallow vì vậy bạn cần kiểm tra xem ứng dụng của bạn có chạy trên Marshmallow không:

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

Hãy chắc chắn rằng hoạt động của bạn thực hiện OnRequestPermissionResult

Toàn bộ quyền trông như thế này:

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

Gọi lại kết quả cho phép:

@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 rất vui được giúp đỡ.!
MetaSnarf

14
Điều này không hoạt động đối với API> = 23, yêu cầu quyền Manifest.permission.WRITE_EXTERNAL_STORAGEluôn trả về '-1' tức là Quyền bị từ chối. Kiểm tra tài liệu mới, nó nói rằng đối với API 19 trở đi, bạn không cần sự WRITE_EXTERNAL_STORAGEcho phép. Như một số ý kiến ​​trên đã đề cập, bạn nên thực hiện tất cả những điều này vớiManifest.permission.READ_EXTERNAL_STORAGE
AmeyaB

3
@VSB: Nó ở một nơi kỳ lạ nhưng ở đây bạn đi: developer.android.com/guide/topics/manifest/
mẹo

3
@AmeyB Như tài liệu đã nói, đối với API> = 19, không được phép khai báo trên bộ nhớ ngoài, ứng dụng IF sẽ sử dụng thư mục cụ thể của riêng nó trên bộ nhớ ngoài được trả về getExternalFilesDir(). Trong các trường hợp khác, quyền vẫn android.permission.WRITE_EXTERNAL_STORAGEphải được khai báo trong manfiest.
VSB

1
Có nó đã sửa. Vấn đề liên quan đến thư viện ứng dụng khúc côn cầu. thư viện này đã được ghi đè cho phép viết của tôi. @MetaSnarf
Selin

38

Hệ thống cấp phép của Android là một trong những mối quan tâm bảo mật lớn nhất kể từ khi các quyền đó được yêu cầu khi cài đặt. Sau khi cài đặt, ứng dụng sẽ có thể truy cập tất cả những thứ được cấp mà không có bất kỳ sự thừa nhận nào của người dùng về chính xác ứng dụng làm gì với sự cho phép.

Android 6.0 Marshmallow giới thiệu một trong những thay đổi lớn nhất đối với mô hình quyền với việc bổ sung quyền thời gian chạy, mô hình quyền mới thay thế mô hình quyền thời gian cài đặt hiện có khi bạn nhắm mục tiêu API 23 và ứng dụng đang chạy trên thiết bị Android 6.0+

Phép lịch sự đi đến Quyền yêu cầu trong thời gian chạy .

Thí dụ

Tuyên bố đây là toàn cầu

private static final int PERMISSION_REQUEST_CODE = 1;

Thêm phần này vào onCreate()phần của bạn

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

Bây giờ thêm 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

Giao diện này là hợp đồng để nhận kết quả cho các yêu cầu cấp phép.


28

Kiểm tra nhiều quyền trong API cấp 23 Bước 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,
};

Bước 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;
}

Bước 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;
    }
}

Bước 4: trong onCreate của Activity checkPermissions ();


2
Cảm ơn. Điều này trông giống như một câu trả lời đầy hứa hẹn cho nhiều quyền. Nhưng nó thiếu một chút trong các ví dụ. Làm thế nào để nó đối phó never ask againvà thiếu một vài quyền? Người dùng có nhận được bất kỳ thông tin phản hồi? Sẽ thật tuyệt khi thấy một ví dụ thực tế về điều này hoặc nhiều nhận xét về đoạn mã của bạn.
not2qubit

Để giải quyết, đừng hỏi lại, hãy bao quanh add to allow if if with if (Shouldshow allowrationale ()) {} ... đúng là nếu sự cho phép là cần thiết và không bị loại bỏ mãi mãi
me_

Điều này nên là câu trả lời chính xác và tối ưu hóa.
VikaS GuttE

21

Trừ khi có một yêu cầu nhất định về ghi trên bộ nhớ ngoài, bạn luôn có thể chọn lưu tệp trong thư mục ứng dụng. Trong trường hợp của tôi, tôi đã phải lưu các tệp và sau khi lãng phí 2 đến 3 ngày, tôi phát hiện ra nếu tôi thay đổi đường dẫn lưu trữ từ

Environment.getExternalStorageDirectory()

đến

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

Nó hoạt động như sự quyến rũ trên tất cả các thiết bị. Điều này là do để viết trên Bộ nhớ ngoài bạn cần có thêm quyền nhưng việc viết trong thư mục ứng dụng nội bộ thì đơn giản.


bạn viết mã này ở đâu Tôi không thể nhớ bằng cách sử dụng Môi
trường.getExternalStorageDiretory

5

bạn cần sử dụng quyền thời gian chạy trong marshmallow https://developer.android.com/training/permissions/requesting.html

bạn có thể kiểm tra thông tin ứng dụng -> quyền

Ứng dụng của bạn có được phép ghi bộ nhớ ngoài hay không


2
thực sự câu trả lời này là thông tin ứng dụng -> quyền đã giải quyết sự cố :), nhưng tôi đã chấp nhận câu trả lời khác để biết chi tiết phải làm gì. Tôi ước tôi có thể chấp nhận cả Cảm ơn rất nhiều
Badr

Cảm ơn đã khắc phục sự cố trình duyệt gặp sự cố tải xuống trong trình giả lập Android
sdaffa23fdsf

4

Có vẻ như người dùng đã từ chối quyền và ứng dụng cố ghi vào đĩa ngoài, gây ra lỗi.

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

Kiểm tra https://developer.android.com/training/permissions/requesting.html

Video này sẽ cung cấp cho bạn ý tưởng tốt hơn về UX, xử lý các quyền Thời gian chạy https://www.youtube.com/watch?v=iZqDdvhTZj0


1

Từ phiên bản marshmallow, nhà phát triển cần yêu cầu quyền cho thời gian chạy cho người dùng. Hãy để tôi cung cấp cho bạn toàn bộ quá trình để yêu cầu quyền thời gian chạy.

Tôi đang sử dụng tài liệu tham khảo từ đây: marshmallow thời gian chạy quyền android .

Đầu tiên tạo một phương thức kiểm tra xem tất cả các quyền có được đưa ra hay không

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

Bây giờ đây là mã được chạy sau phương thức trên. Chúng tôi sẽ ghi đè onRequestPermissionsResult()phương thức:

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

    }

Nếu người dùng nhấp vào tùy chọn Từ chối thì showDialogOK()phương thức sẽ được sử dụng để hiển thị hộp thoại

Nếu người dùng nhấp vào Từ chối và cũng nhấp vào hộp kiểm có nội dung "không bao giờ hỏi lại" , thì explain()phương thức sẽ được sử dụng để hiển thị hộp thoại.

phương thức hiển thị các hộp thoại:

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

Đoạn mã trên yêu cầu bốn quyền một lần. Bạn cũng có thể yêu cầu bất kỳ số lượng quyền trong bất kỳ hoạt động nào theo yêu cầu của bạn.


0

Sau nhiều lần tìm kiếm Mã này hoạt động với tôi:

Kiểm tra quyền đã có: Kiểm tra quyền WRITE_EXTERNAL_STORAGE Được phép hay không?

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

Triển khai phương thức ghi đè onRequestPermissionsResult để kiểm tra là người dùng cho phép hoặc từ chối

 @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

nó làm việc cho tôi

 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

Trước khi bắt đầu tải xuống, hãy kiểm tra quyền thời gian chạy của bạn và nếu bạn không có quyền yêu cầu quyền như phương pháp này

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

Nói một cách đơn giản, quyền có thể được cấp bằng tệp manifest.xml, nhưng vẫn ổn cho đến khi api cấp 23 sdk phiên bản 6, sau từ đây, nếu chúng tôi muốn xin phép, chúng tôi phải yêu cầu sử dụng để cho phép quyền cái nào cũng cần

Chỉ cần thêm mã này vào tệp mainActivity.java

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

Thay thế CAMERA hoặc thêm bằng WRITE_EXTERNAL_STORAGE nếu bạn muốn và bằng mã duy nhất.

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

Đây là mã đơn giản để có được sự cho phép.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.