Cách kiểm tra quyền trong phân đoạn


92

Tôi muốn kiểm tra quyền bên trong một phân đoạn.

mã của tôi:

        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {


            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                    android.Manifest.permission.ACCESS_FINE_LOCATION)) {

                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            } else {

                // No explanation needed, we can request the permission.

                ActivityCompat.requestPermissions(getActivity(),
                        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                        1);



                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }

nhưng onRequestPermissionsResultkhông được gọi sau khi cho phép hoặc từ chối.

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            Log.e("test","0");
            // 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.
                //yes

                Log.e("test","1");

                Intent intent = new Intent(getActivity(), MapsActivity.class);
                intent.putExtra("latitude", 35.694828);
                intent.putExtra("longitude", 51.378129);
                startActivity(intent);

            } else {
                utilityFunctions.showSweetAlertWarning(getActivity(),r.getString(R.string.str_warning_title_empty),
                        r.getString(R.string.str_you_must_allow_this_permission_toast),
                        r.getString(R.string.str_warning_btn_login));

                Log.e("test","2");
            }
            return;
        }

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

Câu trả lời:


51

Tôi đã thực hiện sau để kiểm tra quyền bên trong một phân đoạn.

if (ActivityCompat.checkSelfPermission(getContext(),
            android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getContext(),
                    android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
         requestPermissions(getActivity(),
                new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION,
                        android.Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_LOCATION);
    } else {
        Log.e("DB", "PERMISSION GRANTED");
    }

3
Chúng tôi vẫn cần phải xin phép nếu người dùng chưa cấp.
Karan Thakkar

17
Hãy nhớ rằng nếu bạn làm điều này, kết quả yêu cầu quyền của bạn sẽ đến với hoạt động bắt đầu phân đoạn của bạn. Xem câu trả lời của ThetNaing Mizo để biết cách nhận kết quả trong phân đoạn của bạn.
từ

253

Đây là cách tôi đã làm, nó hiệu quả với tôi. Cảm ơn!

Đối với hoạt động:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

Đối với Fragment:

requestPermissions(permissionsList, REQUEST_CODE);

Yêu cầu phân mảnh Quyền yêu cầu Android M nhưng nó có sẵn trong FragmentCompat cho các phiên bản API cũ hơn.
Brian White

20
Cách chính xác để yêu cầu sự cho phép bên trong một mảnh
Tarun

requestPermissions là sử dụng soái ca và lên cấp sdk
hamid

76

Fragment có requestPermissions()onRequestPermissionsResult()các phương pháp, sử dụng nó.

Nhưng checkSelfPermission()là từ ActivityCompat(không yêu cầu Activity, chỉ Context).

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    requestPermissions( //Method of Fragment
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        REQUEST_PERMISSIONS_CODE_WRITE_STORAGE
    );
} else {
    downloadImage();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_PERMISSIONS_CODE_WRITE_STORAGE) {
        if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            proceedWithSdCard();
        }
    }
}

Yêu cầu phân mảnh Quyền yêu cầu Android M nhưng nó có sẵn trong FragmentCompat.
Brian White

4

onRequestPermissionsResultđược gọi trong hoạt động không phải là phân mảnh. onRequestPermissionsResultThay vào đó, hãy thử ghi đè trong hoạt động.


Mặc dù điều này là đúng, nhưng nó thiếu lời giải thích tại sao điều này đúng và cách khắc phục - làm thế nào để có được onRequestPermissionResultsự phân mảnh. Cả cách giải thích và cách nhận kết quả bị phân mảnh đều được ThetNaing Mizo giải thích trong câu trả lời .
từ

Cảm ơn, tôi đã tự hỏi tại sao mã của tôi không hoạt động bên trong Fragment
Azizjon Kholmatov

4

Sử dụng Kotlin, bạn gọi requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)và thêm ghi đè sau vào phân đoạn của mình

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit {

}

4

Để xử lý các quyền trong một phương thức Fragmentgọi requestPermissions. Nếu bạn ghi đè onRequestPermissionsResultphương thức trong cả phân đoạn và hoạt động, có chứa phân đoạn đó, hãy đảm bảo gọi super.onRequestPermissionsResult(...)phương thức hoạt động để truyền lệnh gọi đến onRequestPermissionsResultphương thức trong phân đoạn.


3

Điều phù hợp với tôi là gọi phương thức onRequestPermissionsResult trong hoạt động bên trong mà phân đoạn được triển khai thay vì gọi nó trong chính phân đoạn. Bên trong phương thức onCreateView trong phân đoạn:

    Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);

            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA);
            }else{
                //Do your work
                fetchMethod();
            }

        }
});

Trong Activity giúp triển khai phân mảnh, bên ngoài phương thức onCreate :

    @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_MEDIA:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                fetchMethod();

            }else{
                Toast.makeText(getApplicationContext(), "Permission not granted!", Toast.LENGTH_SHORT).show();
            }
            break;

        default:
            break;
    }
}


0

Tôi đã gặp khó khăn khi sử dụng checkSelfPermission()trong một Fragmentvà tự hỏi đâu sẽ là cách tiếp cận tốt nhất để Contextbị null (cụ thể là Kotlin) ... tôi nên sử dụng !!hay cái gì khác ?

Tôi đã làm với một cái gì đó khác dựa trên mã tôi tìm thấy trong iosched . Hãy xem mẫu bên dưới và nhớ rằng, trước khi Fragmentđược gắn với an Activity, thì Contextsẽ là rỗng.

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
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.