วิธีตรวจสอบสิทธิ์ในส่วนย่อย


92

ฉันต้องการตรวจสอบการอนุญาตภายในส่วน

รหัสของฉัน:

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

แต่onRequestPermissionsResultไม่ได้เรียกหลังจากอนุญาตหรือปฏิเสธ

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

คำตอบ:


51

ฉันได้ดำเนินการต่อไปนี้เพื่อตรวจสอบการอนุญาตภายในส่วน

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
เรายังคงต้องขออนุญาตหากผู้ใช้ไม่ได้ให้สิทธิ์
Karan Thakkar

17
โปรดจำไว้ว่าหากคุณทำเช่นนี้ผลการขออนุญาตของคุณจะมาถึงกิจกรรมที่เริ่มต้นส่วนของคุณ ดูคำตอบของThetNaing Mizoสำหรับวิธีรับผลลัพธ์ในส่วนของคุณ
ตั้งแต่

253

นี่คือวิธีที่ฉันทำมันได้ผลสำหรับฉัน ขอบคุณ!

สำหรับกิจกรรม:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

สำหรับ Fragment:

requestPermissions(permissionsList, REQUEST_CODE);

Fragment requestPermissions ต้องใช้ Android M แต่มีให้ใน FragmentCompat สำหรับ API เวอร์ชันเก่า
Brian White

20
วิธีที่ถูกต้องในการขออนุญาตภายในชิ้นส่วน
Tarun

requestPermissions ใช้ marshal และ level up sdk
hamid

76

Fragment มีrequestPermissions()และonRequestPermissionsResult()วิธีใช้

แต่checkSelfPermission()มาจากActivityCompat(ไม่จำเป็นต้องใช้Activityเท่านั้น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();
        }
    }
}

Fragment requestPermissions ต้องการ Android M แต่สามารถใช้ได้ใน FragmentCompat
Brian White

4

onRequestPermissionsResultถูกเรียกใช้ในกิจกรรมไม่ใช่แฟรกเมนต์ ลองลบล้างonRequestPermissionsResultกิจกรรมแทน


แม้ว่านี่จะเป็นความจริง แต่ก็ไม่มีคำอธิบายว่าเหตุใดจึงเป็นจริงและจะแก้ไขได้อย่างไร - วิธีการonRequestPermissionResultแยกส่วน ทั้งคำอธิบายและวิธีการที่จะได้รับผลในการแยกส่วนมีการอธิบายในคำตอบโดยThetNaing Mizo
ตั้งแต่

ขอบคุณฉันสงสัยว่าทำไมรหัสของฉันไม่ทำงานใน Fragment
Azizjon Kholmatov

4

เมื่อใช้ Kotlin คุณเรียกrequestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)และเพิ่มการแทนที่ต่อไปนี้ในส่วนของคุณ

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

}

4

เพื่อจัดการสิทธิ์ในวิธีการFragmentโทร requestPermissionsหากคุณแทนที่onRequestPermissionsResultเมธอดในทั้งแฟรกเมนต์และกิจกรรมที่มีแฟรกเมนต์นั้นตรวจสอบให้แน่ใจว่าได้เรียกsuper.onRequestPermissionsResult(...)ใช้เมธอด activity เพื่อเผยแพร่การเรียกใช้onRequestPermissionsResultเมธอดในแฟรกเมนต์


3

สิ่งที่ทำงานสำหรับฉันคือการเรียกonRequestPermissionsResultวิธีการในกิจกรรมภายในซึ่งส่วนจะดำเนินการมากกว่าเรียกมันว่าในส่วนของตัวเอง ภายในเมธอด onCreateViewในแฟรกเมนต์ :

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

        }
});

ในกิจกรรมที่ช่วยในการใช้งานแฟรกเมนต์นอกเมธอด 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;
    }
}

2

หากคุณปิดการอนุญาตแอพจากการตั้งค่าคุณจะไม่สามารถเปิดการอนุญาตจากโค้ดหรือเวอร์ชัน Android ที่ต่ำกว่า Marshmallow ได้

คุณสามารถตรวจสอบเอกสารนี้ https://developer.android.com/training/permissions/requesting.html และนี่คือตัวอย่าง https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html


0

ฉันเริ่มสะดุดโดยใช้checkSelfPermission()a Fragmentและสงสัยว่าอะไรคือแนวทางที่ดีที่สุดสำหรับContextการเป็นโมฆะ (เฉพาะ Kotlin) ... ฉันควรใช้!!หรืออย่างอื่น ?

ผมไปกับสิ่งอื่นขึ้นอยู่กับรหัสผมพบว่าใน iosched ดูตัวอย่างด้านล่างและอย่าลืมว่าก่อนที่Fragmentจะแนบกับ an Activityค่าContextจะเป็นโมฆะ

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.