สิทธิ์ Android M: ไม่ได้เรียก onRequestPermissionsResult ()


291

ฉันกำลังอัปเดตแอปของเราเพื่อใช้ระบบการอนุญาต M runtime ทุกอย่างทำงานได้ยกเว้น onRequestPermissionsResult () ฉันต้องตรวจสอบการอนุญาตในการกดปุ่มและถ้ามันประสบความสำเร็จส่งข้อความ เมื่อฉันให้สิทธิ์ในการทำไดอะล็อกจะปิดลง แต่ไม่ส่งข้อความจนกว่าจะกดปุ่มอีกครั้ง

ฉันได้ทำการดีบั๊กและตั้งจุดพักในเมธอด onRequestPermissionsResult () แต่มันไม่เคยเข้าไป

วิธีนี้ถูกเรียกมาก่อน:

    private void askForPermission() {
    String[] permissions = new String[]{Manifest.permission.SEND_SMS};
    ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}

จากนั้นการติดต่อกลับของฉันจะเป็นดังนี้:

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

    if (requestCode == PERMISSIONS_CODE) {
        for (int i = 0; i < permissions.length; i++) {
            String permission = permissions[i];
            int grantResult = grantResults[i];

            if (permission.equals(Manifest.permission.SEND_SMS)) {
                if (grantResult == PackageManager.PERMISSION_GRANTED) {
                    onPPSButtonPress();
                } else {
                    requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
                }
            }
        }
    }
}

มีใครพบปัญหาที่คล้ายกันบ้างไหม? ขอบคุณสำหรับความช่วยเหลือใด ๆ กับสิ่งนี้ ขอบคุณ

คำตอบ:


576

ฉันพบปัญหาเดียวกันและเพิ่งพบวิธีแก้ปัญหา เมื่อใช้ไลบรารีการสนับสนุนคุณต้องใช้วิธีการโทรที่ถูกต้อง ตัวอย่างเช่น:

  • เมื่ออยู่ในAppCompatActivityคุณควรใช้ActivityCompat.requestPermissions ;
  • เมื่ออยู่ในandroid.support.v4.app.Fragmentคุณควรใช้requestPermissionsเพียงครั้งเดียว(นี่เป็นวิธีอินสแตนซ์ของ android.support.v4.app.Fragment)

ถ้าคุณเรียกใช้ ActivityCompat.requestPermissions แบบแยกส่วนการเรียกกลับของOnRequestPermissionsResultจะถูกเรียกใช้บนกิจกรรมไม่ใช่ส่วน

หวังว่านี่จะช่วยได้!


13
นอกจากนี้ยังเกิดขึ้นกับกิจกรรมที่ไม่มีประวัติ: code.google.com/p/android-developer-preview/issues/ …
Anthony Bobenrieth

11
"เมื่ออยู่ใน android.support.v4.app.Fragment คุณควรใช้เพียงแค่ขออนุญาต" - ขอบคุณ!
Tigran Sarkisian

5
@AnthonyBobenrieth ดังนั้นวิธีการแก้ปัญหาสำหรับกิจกรรมทางประวัติศาสตร์ที่ไม่มีคืออะไร? เราเพียงแค่ไม่สามารถขออนุญาตจากพวกเขา?
Dean Wild

2
ลิงก์เสีย @AnthonyBobenrieth มีวิธีใดบ้างที่ไม่มีประวัติ?
fersarr

3
เมื่อใช้กิจกรรมผู้ปกครองที่เป็นจริงที่ได้รับFragment.requestPermissions() onRequestPermissionsResult()(นี่คือกับห้องสมุดสนับสนุน 23.3.0)
คนอยู่ที่ไหนสักแห่ง

101

คุณสามารถลองสิ่งนี้:

requestPermissions(permissions, PERMISSIONS_CODE);

หากคุณกำลังเรียกรหัสนี้จากส่วนมันเป็นของตัวเอง requestPermissions วิธีการ ฉันเชื่อว่าปัญหาคือคุณกำลังเรียกวิธีการคงที่

เคล็ดลับ Pro หากคุณต้องการonRequestPermissionsResult()ในส่วน: FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)


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

สิ่งนี้ใช้ได้กับฉันใน Android M. แต่เพียงแค่สงสัยว่ามันจะทำให้เกิดปัญหาใด ๆ ในอุปกรณ์ Pre-M หรือไม่
Bala Vishnu

4
@goodgamerguy ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้รหัสคำขอใน onRequestPermissions กิจกรรม หากกิจกรรมของคุณใช้การโทรกลับด้วย OnRequestPermissionsResult คุณควรระบุค่าเริ่มต้น: super.onRequestPermissionsResult (requestCode, การอนุญาต, grantResults);
Timmy Simons

68

ฉันหวังว่ามันจะทำงานได้ดี

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

 ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);

สำหรับชิ้นส่วน:

 requestPermissions(permissionsList,REQUEST_CODE);

แล้ว SDK 15 หรือต่ำกว่าจะเป็นอะไร?
zulkarnain shah

4
คุณไม่ต้องการการอนุญาตเกี่ยวกับ SDK 15, Marshmallow และรุ่นที่สูงกว่าเท่านั้นที่ต้องใช้ ..
Sanjay Mangaroliya

50

ฉันพบปัญหานี้ด้วย หากคุณต้องการกิจกรรมที่จัดการสิทธิ์ที่ไม่ได้อยู่ในประวัติ / ล่าสุดคุณจะถูกล่อลวงให้เปลี่ยนAndroidManifest.xmlรายการของคุณ

หากคุณตั้งค่ากิจกรรมที่คุณโทรrequestPermissionsหรือAppCompatActivity.requestPermissionsด้วย

android:noHistory="true"
android:excludeFromRecents="true"

ในAndroidManifest.xmlตอนนั้นonRequestPermissionsResult()จะไม่เรียกคุณ นี้เป็นจริงถ้ากิจกรรมของคุณจะมาจากหรือActivityAppCompatActivity

สิ่งนี้สามารถแก้ไขได้โดยการลบทั้งธงออกจาก 'AndroidManifest.xml' และจบกิจกรรมของคุณด้วยfinishAndRemoveTask()แทน


ฉันคงไม่ต้องลบคุณลักษณะ noHistory แต่นี่เป็นวิธีแก้ปัญหาที่เหมาะกับฉัน ขอบคุณ!
Eric Schlenz

1
ฉันมีปัญหาใน Marshmallow แต่ไม่ใช่ใน Nougat ขอขอบคุณมันได้ผลกับฉัน
Yohan Dahmani

37

หากคุณมีonRequestPermissionsResultทั้งกิจกรรมและชิ้นส่วนตรวจสอบให้แน่ใจว่าได้โทรเข้ามาsuper.onRequestPermissionsResultในกิจกรรม ไม่จำเป็นต้องใช้ในส่วน แต่อยู่ในกิจกรรม


นอกจากนี้โปรดทราบว่าหากคุณกำหนดเป้าหมาย API (ตัวอย่างเช่น 19) คุณจะยังคงอยู่ภายใต้ระบบรูปแบบการอนุญาตเก่าดังนั้นจึงไม่ได้รับการร้องขอการเรียกใช้ฟังก์ชันที่เกี่ยวข้องกับการขออนุญาต
Bonatti

ดูคำตอบของฉันถ้าคุณได้ขยายกิจกรรมอื่นที่ไม่ได้เรียก super
TouchBoarder

3
สะดุดกับสิ่งนี้ FragmentActivity.onRequestPermissionsResult(..)เป็นที่ที่การโทรไปยังแฟรกเมนต์onRequestPermissionsResult(..)ถูกส่งต่อไปยัง
JanPl

@Bonatti ดังนั้นถ้าฉันพยายามที่จะขออนุญาตใน Android 4.4.2 ฉันจะไม่ได้รับผลหรือไม่ ดังนั้นฉันไม่สามารถเปลี่ยนการอนุญาตเห็นเฉพาะพวกเขาเท่านั้น
Alex Fragotsis

@AlexanderFragotsis คุณจะได้รับผลลัพธ์ ความแตกต่างเพียงอย่างเดียวคือคุณจะไม่ถูกขอให้อนุญาต แต่คุณจะได้รับการอนุญาตจากระบบโดยอัตโนมัติ
Dusan Zivkovic

33

คำตอบถูกปฏิเสธโปรดดูที่: https://developer.android.com/training/permissions/requesting

ภายในแฟรกเมนต์คุณต้องโทร:

FragmentCompat.requestPermissions(permissionsList, RequestCode)

ไม่:

ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);

2
เกี่ยวข้องกับ android.support.v13.app.FragmentCompat
Udi Oshi

1
FragmentCompat เลิกใช้แล้วตั้งแต่ API 27.1.0
บิ๊ก McLargeHuge

คำตอบของฉันถูกคัดค้านโปรดดูที่: developer.android.com/training/permissions/requesting
Ben.Slama.Jihed

15

หากคุณกำลังใช้ requestPermissions แบบแยกส่วนจะยอมรับ 2 พารามิเตอร์แทน 3

คุณควรใช้ requestPermissions(permissions, PERMISSIONS_CODE);


1
จริงๆแล้วมันให้คำตอบสำหรับคำถาม การเรียก requestPermissions (วิธีการแยกส่วน) แทน ActivityCompat.requestPermissions วิธีการเรียกใช้จะถูกเรียกใช้ ซึ่งเป็นประเด็นหลักที่นี่ ขอบคุณ Don
Waclock

15

หากด้วยเหตุผลบางอย่างที่คุณได้ขยายกิจกรรมที่กำหนดเองที่อยู่ในห้องสมุดภายนอกบางแห่งที่ไม่ได้เรียกว่า super คุณจะต้องเรียก Fragment super.onRequestPermissions ด้วยตนเองดูที่กิจกรรมของคุณใน EqualPermissionsResult

YourActivity extends SomeActivityNotCallingSuperOnRequestPermissionsResult{
Fragment requestingFragment;//the fragment requesting the permission
...
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestingFragment!=null)
            requestingFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
...

12

คุณมีcheckPermissionsทำงานสำหรับอุปกรณ์ก่อน Marshmallow ในFragmentCompat ฉันใช้สิ่งนี้:

FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

2
มันจะทำงานได้ก็ต่อเมื่อมีการขออนุญาตภายใน android.app.fragment และคุณต้องนำเข้า support-v13 ไลบรารี่!
MohammadReza

4
FragmentCompat.requestPermissions () ไม่ทำงานกับ android.support.v4.app.Fragment ใครรู้วิธีจัดการเรื่องนี้
จุติกรณ์

12

android.support.v4.app.Fragment.requestPermissionsฉันได้พบว่าเป็นสิ่งสำคัญที่คุณโทร

หากคุณทำในสิ่งonCreate()นั้นonRequestPermissionsResult()จะไม่ถูกเรียก

การแก้ไข: เรียกว่าในonActivityCreated();

@Override
public void onActivityCreated(Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) 
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 0);

}

1
ฉันประสบปัญหาเดียวกัน แต่ฉันไม่สามารถรับonActivityCreated()รหัสของฉันได้ SDK 23.
kAmol


ฉันไม่ได้อยู่ในส่วนฉันพยายามที่จะทำในการสร้างกิจกรรม
kAmol

อืมหรือใช้onPause()?
almisoft

10

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

เขากำลังทำบางสิ่งในระดับต่ำเช่นการสลับบิตเพื่อให้ทำงานได้ดังนั้นฉันจึงไม่แน่ใจเกี่ยวกับวิธีแก้ปัญหาสุดท้ายจริง ๆ


สิ่งนี้ช่วยฉันในการแก้ปัญหาของฉัน: ฉันต้องเปลี่ยนเส้นทาง onRequestPermissionsResult จากชิ้นส่วนหลักไปยังส่วนย่อย (ซ้อน) ของเด็ก ขอบคุณสำหรับทิป!
เมอร์ฟี

9
 /* use the object of your fragment to call the 
 * onRequestPermissionsResult in fragment after
 * in activity and use different request Code for 
 * both Activity and Fragment */

   if (isFragment)
    mFragment.requestPermissions(permissions.toArray(new
    String[permissions.size()]),requestPermission);

   else
    ActivityCompat.requestPermissions(mActivity,permissions.toArray(new
    String[permissions.size()]),requestPermission);

6

สิ่งนี้จะได้ผล ..

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

การใช้งานขั้นสูงเรียกว่าการติดตั้งแฟรกเมนต์ไม่ใช่โครงร่าง hte
Mohammad Yahia

5

หากคุณกำลังเรียกรหัสนี้จากส่วนมันเป็นของตัวเอง requestPermissions วิธีการ

ดังนั้นแนวคิดพื้นฐานคือถ้าคุณอยู่ในกิจกรรมแล้วโทร

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);

และถ้าอยู่ใน Fragment เพียงแค่โทรหา

requestPermissions(permissionsList,
                            permissionscode);

1
ต้องใช้ระดับ API 23 ... FragmentCompat.requestPermissions()ในการใช้งานก่อนหน้านี้
มีนัสมีนา

5

ฉันมีปัญหาที่คล้ายกันยกเว้นฉันกดปุ่มเพื่อโทรออก ฉันตรวจสอบการอนุญาตก่อนถ้าไม่ได้รับอนุญาตฉันขออนุญาตและ onRequestPermissionResult ฉันโทรไปยังการอนุญาตการตรวจสอบและโทรอีกครั้ง

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case Constants.PERMISSIONS_REQUEST_CALL_PHONE: {
            if ( grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                checkPermissionsAndCall();
            }
        }
    }
}

public void checkPermissionsAndCall(){
    if (Build.VERSION.SDK_INT > 22) {
        if(ContextCompat.checkSelfPermission(getContext(),
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED){
            requestPermissions( new String[]{Manifest.permission.CALL_PHONE}, Constants.PERMISSIONS_REQUEST_CALL_PHONE);
        }
        else{
            callIntent();
        }
    }
}


2

ก่อนที่คุณจะตรวจสอบทุกอย่างตามคำตอบข้างต้นตรวจสอบให้แน่ใจว่ารหัสคำขอของคุณไม่ใช่ 0 !!!

ตรวจสอบรหัสของ onRequestPermissionsResult () ใน FragmentActivity.java:

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults) {
    int index = (requestCode>>16)&0xffff;
    if (index != 0) {
        index--;

        String who = mPendingFragmentActivityResults.get(index);
        mPendingFragmentActivityResults.remove(index);
        if (who == null) {
            Log.w(TAG, "Activity result delivered for unknown Fragment.");
            return;
        }
        Fragment frag = mFragments.findFragmentByWho(who);
        if (frag == null) {
            Log.w(TAG, "Activity result no fragment exists for who: " + who);
        } else {
            frag.onRequestPermissionsResult(requestCode&0xffff, permissions, grantResults);
        }
    }
}

2
private void showContacts() {
    if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    } else {
        doShowContacts();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        doShowContacts();
    }
}

2

ฉันมีทางออกที่ยอดเยี่ยมในการทำให้สิ่งนี้กลายเป็น BaseActivity เช่นนี้

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this));


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                CustomToast.getInstance().setCustomToast("Now you can share the Hack.");

            } else {
                Toast.makeText(this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

}

ตอนนี้คุณสามารถเรียกรหัสเพื่อขออนุญาตเช่นนี้

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

ตอนนี้ทุกครั้งที่สิ่งนี้เกิดขึ้นทุกที่ไม่ว่าในส่วนของคุณหรือในกิจกรรมใด ๆ กิจกรรมพื้นฐานจะถูกเรียก

ขอบคุณ



1

รายละเอียด

  • Kotlin 1.2.70
  • ตรวจสอบใน minSdkVersion 19
  • Android studio 3.1.4

ขั้นตอนวิธี

โมดูล - กล้อง, สถานที่, ....

  1. ตรวจสอบว่า hasSystemFeature (ถ้ามีโมดูลอยู่ในโทรศัพท์)
  2. ตรวจสอบว่าผู้ใช้มีสิทธิ์เข้าถึงโมดูลหรือไม่
  3. ส่งคำขอการอนุญาต (ขอให้ผู้ใช้อนุญาตการใช้งานโมดูล )

คุณสมบัติ

  1. ทำงานกับกิจกรรมและชิ้นส่วน
  2. มีการตอบสนองผลลัพธ์เดียวเท่านั้น
  3. สามารถตรวจสอบหลายโมดูลในคำขอเดียว

สารละลาย

class PermissionType(val manifest_permission: String, val packageManager: String) {
    object Defined {
        val camera = PermissionType(Manifest.permission.CAMERA, PackageManager.FEATURE_CAMERA)
        val currentLocation = PermissionType(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.FEATURE_LOCATION_GPS)
    }
}

class  Permission {

    enum class PermissionResult {
        ACCESS_ALLOWED, ACCESS_DENIED, NO_SYSTEM_FEATURE;
    }

    interface ManagerDelegate {
        fun permissionManagerDelegate(result: Array<Pair<String, PermissionResult>>)
    }

    class Manager internal constructor(private val delegate: ManagerDelegate?) {

        private var context: Context? = null
        private var fragment: Fragment? = null
        private var activity: AppCompatActivity? = null
        private var permissionTypes: Array<PermissionType> = arrayOf()
        private val REQUEST_CODE = 999
        private val semaphore = Semaphore(1, true)
        private var result: Array<Pair<String, PermissionResult>> = arrayOf()


        constructor(permissionType: PermissionType, delegate: ManagerDelegate?): this(delegate) {
            permissionTypes = arrayOf(permissionType)
        }

        constructor(permissionTypes: Array<PermissionType>, delegate: ManagerDelegate?): this(delegate) {
            this.permissionTypes = permissionTypes
        }

        init {
            when (delegate) {
                is Fragment -> {
                    this.fragment = delegate
                    this.context = delegate.context
                }

                is AppCompatActivity -> {
                    this.activity = delegate
                    this.context = delegate
                }
            }
        }

        private fun hasSystemFeature(permissionType: PermissionType) : Boolean {
            return context?.packageManager?.hasSystemFeature(permissionType.packageManager) ?: false
        }

        private fun hasAccess(permissionType: PermissionType) : Boolean {
            return if (Build.VERSION.SDK_INT < 23) true else {
                context?.checkSelfPermission(permissionType.manifest_permission) == PackageManager.PERMISSION_GRANTED
            }
        }

        private fun sendRequest(permissionTypes: Array<String>) {

            if (fragment != null) {
                fragment?.requestPermissions(permissionTypes, REQUEST_CODE)
                return
            }

            if (activity != null){
                ActivityCompat.requestPermissions(activity!!, permissionTypes, REQUEST_CODE)
            }
        }

        fun check() {

            semaphore.acquire()
            AsyncTask.execute {
                var permissionsForSendingRequest: Array<String> = arrayOf()
                this.result = arrayOf()

                for (it in permissionTypes) {
                    if (!hasSystemFeature(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.NO_SYSTEM_FEATURE)
                        continue
                    }

                    if (hasAccess(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                    } else {
                        permissionsForSendingRequest += it.manifest_permission
                    }
                }

                if (permissionsForSendingRequest.isNotEmpty()) {
                    sendRequest(permissionsForSendingRequest)
                } else {
                    delegate?.permissionManagerDelegate(result)
                }
            }
        }

        fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
            when (requestCode) {
                REQUEST_CODE -> {
                    if (grantResults.isEmpty()) {
                        return
                    }
                    for ((i,permission) in permissions.withIndex()) {
                        for (item in this.permissionTypes) {
                            if (permission == item.manifest_permission && i < grantResults.size) {
                                result += if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                                } else {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_DENIED)
                                }
                                break
                            }
                        }
                    }
                    delegate?.permissionManagerDelegate(result)
                }
            }
            semaphore.release()
        }
    }
}

การใช้งานในกิจกรรม (ในส่วนเดียวกัน)

class BaseActivity : AppCompatActivity(), Permission.ManagerDelegate {

    private lateinit var permissionManager: Permission.Manager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.base_activity)

        permissionManager = Permission.Manager(arrayOf(PermissionType.Defined.camera, PermissionType.Defined.currentLocation), this)
        permissionManager.check()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        permissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }


    override fun permissionManagerDelegate(result: Array<Pair<String, Permission.PermissionResult>>) {
        result.forEach {
            println("!!! ${it.first} ${it.second}")
//            when (it.second) {
//                Permission.PermissionResult.NO_SYSTEM_FEATURE -> {
//                }
//
//                Permission.PermissionResult.ACCESS_DENIED  -> {
//                }
//
//                Permission.PermissionResult.ACCESS_ALLOWED -> {
//                }
//            }
        }
    }
}

1

ที่นี่ฉันต้องการแสดงรหัสของฉันวิธีการจัดการนี้

public class CheckPermission {

public Context context;

public static final int PERMISSION_REQUEST_CODE =  200;

public CheckPermission(Context context){
    this.context = context;
}

public boolean isPermissionGranted(){
    int read_contact = ContextCompat.checkSelfPermission(context.getApplicationContext() , READ_CONTACTS);
    int phone = ContextCompat.checkSelfPermission(context.getApplicationContext() , CALL_PHONE);

    return read_contact == PackageManager.PERMISSION_GRANTED && phone == PackageManager.PERMISSION_GRANTED;
   }
}

ที่นี่ในชั้นนี้ฉันต้องการตรวจสอบสิทธิ์ที่ได้รับหรือไม่ ถ้าอย่างนั้นฉันก็จะเรียกการอนุญาตจาก MainActivity ของฉันชอบ

public void requestForPermission() {
       ActivityCompat.requestPermissions(MainActivity.this, new String[]    {READ_CONTACTS, CALL_PHONE}, PERMISSION_REQUEST_CODE);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)) {
                    showMessageOKCancel("You need to allow access to both the permissions",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE},
                                                PERMISSION_REQUEST_CODE);
                                    }
                                }
                            });
                    return;
                }
            }
    }
}

ตอนนี้ในเมธอด onCreate คุณต้องเรียกใช้ฟังก์ชัน requestForPermission ()

เพียงเท่านี้คุณยังสามารถขอการอนุญาตหลายรายการพร้อมกัน


1

อัปเดต:เห็นคำตอบของคนอื่นเกี่ยวกับการโทรsuper.onRequestPermissionResult()ในกิจกรรมและที่แก้ไขปัญหารหัสคำขอที่ฉันพูดถึงและเรียกใช้onRequestPermissionResult ของแฟรกเมนต์

ไม่สนใจสิ่งนี้:

สำหรับฉันมันคือการเรียกonRequestPermissionResultกิจกรรมแม้จะมีการโทรfragment.requestPermission(...)แต่กลับส่งผลให้มีการร้องขอที่ไม่ถูกต้องรหัส (111 กลายเป็น 65647 ทำไม ??? ฉันไม่เคยรู้)

โชคดีที่นี่เป็นสิทธิ์เพียงอย่างเดียวที่เราขอในหน้าจอนั้นดังนั้นฉันแค่เพิกเฉยรหัสคำขอ (ไม่มีเวลาคิดออกว่าทำไมมันถึงไม่ถูกต้องในตอนนี้)


เพิ่ม 65536 และ 111 แล้วคุณจะได้รับ นี่เป็นเพราะมาสก์บิต ดูบางหัวข้อ
CoolMind

0

ฉันยังพบปัญหาที่แม้ว่าคุณจะเรียกการร้องขอที่ถูกต้องการอนุญาตคุณยังสามารถมีปัญหานี้ได้ ปัญหาคือกิจกรรมหลักอาจแทนที่วิธีนี้โดยไม่ต้องเรียก super เพิ่มซุปเปอร์และมันจะได้รับการแก้ไข

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