Android M अनुमतियाँ: onRequestPimsResult () नहीं कहा जा रहा है


291

मैं नए एम रनटाइम परमिशन सिस्टम का उपयोग करने के लिए हमारे ऐप को अपडेट कर रहा हूं। यह onRequestPimsResult () को छोड़कर सभी काम कर रहा है। मुझे एक बटन प्रेस पर एक अनुमति की जांच करने की आवश्यकता है, और यदि यह सफल है, तो एक पाठ संदेश भेजें। जब मैं इसे करने की अनुमति देता हूं, तो संवाद बंद हो जाता है, लेकिन जब तक मैं फिर से बटन दबाता हूं तब तक यह पाठ को ट्रिगर नहीं करता है।

मैंने डिबग किया है और ब्रेकप्वाइंट को onRequestPeaksResult () विधि में सेट किया है, लेकिन यह कभी इसमें नहीं जाता है।

इस विधि को पहले कहा जाता है:

    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 में , आपको बस अनुरोधों का उपयोग करना चाहिए (यह android.support.v4.app.Fragment का एक इंस्टेंस तरीका है)

यदि आप एक खंड में ActivityCompat.requestPims को कॉल करते हैं, तो onRequestPcriResult कॉलबैक गतिविधि पर कॉल किया जाता है, न कि टुकड़ा।

उम्मीद है की यह मदद करेगा!


13
यह noHistory गतिविधियों के साथ भी होता है: code.google.com/p/android-developer-preview/issues/…
एंथनी बोबनेरीथ

11
"जब android.support.v4.app.Fragment में, आपको बस अनुरोधों का उपयोग करना चाहिए" - धन्यवाद!
Tigran Sarkisian

5
@ एंथनीबॉक्सेनरीथ तो क्या है, इसका समाधान क्या है? हम केवल उनसे अनुमति नहीं मांग सकते हैं?
डीन वाइल्ड

2
लिंक @Anthonybusenrieth को तोड़ा गया है। क्या कोई इतिहास नहीं है इसका कोई हल है?
fersarr

3
उपयोग करते समय Fragment.requestPermissions(), मूल गतिविधि वास्तव में प्राप्त कर रही है onRequestPermissionsResult()। (यह सपोर्ट लाइब्रेरी 23.3.0 के साथ है)
कोई व्यक्ति

101

आप यह कोशिश कर सकते हैं:

requestPermissions(permissions, PERMISSIONS_CODE);

यदि आप एक खंड से इस कोड को बुला रहे हैं, तो इसका स्वयं का अनुरोध तरीका है। मेरा मानना ​​है कि समस्या यह है कि आप स्थैतिक विधि कह रहे हैं।

प्रो टिप अगर आप onRequestPermissionsResult()एक टुकड़े में चाहते हैं: FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)


सहायता के लिए धन्यवाद। मैंने नोटिस किया कि एक खंड में अगर कोई अनुरोध विधि है। मैं एक खंड में हूं और मैंने सिर्फ रिक्वेस्ट कॉल करने की कोशिश की, दुर्भाग्य से यह काम नहीं किया। मैंने यह भी कोशिश की कि आपने क्या उल्लेख किया है और यह भी काम नहीं किया।
एंडीहार्ट

यह मेरे लिए एंड्रॉइड एम में काम करता था। लेकिन यह सोचकर कि क्या यह प्री-एम डिवाइस में कोई समस्या पैदा करेगा?
बाला विष्णु

4
@goodgamerguy सुनिश्चित करें कि आप गतिविधि के onRequestPchesResult में अनुरोध कोड का उपयोग नहीं करते हैं। यदि आपकी गतिविधि onRequestPlinesResult कॉलबैक का उपयोग करती है, तो आपको डिफ़ॉल्ट प्रदान करना चाहिए: super.onRequestPiersResult (requestCode, अनुमतियाँ, allowResults);
टिम्मी सिमंस

68

मुझे उम्मीद है कि यह ठीक काम करेगा

गतिविधि के लिए:

 ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);

टुकड़े के लिए:

 requestPermissions(permissionsList,REQUEST_CODE);

एसडीके 15 और निम्न के बारे में क्या?
जुल्कारनैन शा

4
आप केवल Marshmallow और ऊपर संस्करण की जरूरत .. एसडीके 15 के बारे में अनुमति की जरूरत नहीं है
संजय Mangaroliya

50

मुझे भी इस समस्या का सामना करना पड़ा। यदि आप ऐसी गतिविधि चाहते हैं, जो इतिहास / रीसेंट में अनुमतियों को नहीं संभालती है, तो आपको अपनी AndroidManifest.xmlप्रविष्टि बदलने के लिए लुभाया जाएगा ।

यदि आप उस गतिविधि को सेट करते हैं जिसे आप कॉल करते हैं requestPermissionsया उसके AppCompatActivity.requestPermissionsसाथ करते हैं

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

तुम्हारे AndroidManifest.xmlबाद onRequestPermissionsResult()में नहीं बुलाया जाएगा। यह सच है यदि आपकी गतिविधि से ली गई है Activityया AppCompatActivity

इसे 'AndroidManifest.xml' से दोनों झंडे हटाकर और finishAndRemoveTask()इसके साथ अपनी गतिविधि समाप्त करके ठीक किया जा सकता है ।


मैं नहीं बल्कि noHistory विशेषता को दूर करना होगा, लेकिन यह मेरे लिए काम किया समाधान था। धन्यवाद!
एरिक श्लेनज़

1
मेरे पास
मार्शमैलो

37

यदि आपके पास onRequestPermissionsResultगतिविधि और खंड दोनों हैं, तो super.onRequestPermissionsResultगतिविधि में कॉल करना सुनिश्चित करें । यह टुकड़े में आवश्यक नहीं है, लेकिन यह गतिविधि में है।


यह भी ध्यान दें कि यदि आप एक एपीआई (जैसे उदाहरण के लिए 19) को लक्षित करते हैं, तो आप अभी भी पुराने अनुमति मॉडल सिस्टम के तहत होंगे, और इस प्रकार, अनुरोध अनुमति संबंधित फ़ंक्शन कॉल प्राप्त नहीं करते हैं
बोनट्टी

मेरा जवाब देखिये अगर आपने एक और गतिविधि को आगे बढ़ाया है जो सुपर
टचबार्डर

3
इस पर ठोकर खाई। FragmentActivity.onRequestPermissionsResult(..)वह जगह है जहाँ खंड के लिए कॉल onRequestPermissionsResult(..)अग्रेषित किया जाता है।
JanPl

@Bonatti तो अगर मैं एंड्रॉइड 4.4.2 में एक अनुमति का अनुरोध करने की कोशिश करता हूं तो मुझे कोई परिणाम नहीं मिलेगा? इस प्रकार मैं अनुमतियाँ नहीं बदल सकता, केवल उन्हें देख सकता हूँ?
एलेक्स फ्रागोटिस

@AlexanderFragotsis आपको एक परिणाम मिलेगा। केवल अंतर यह है कि आपको अनुमति देने के लिए कहा जाएगा, इसके बजाय आपको सिस्टम द्वारा स्वचालित रूप से अनुमति दी जाएगी।
दुसान ज़िवकोविक

33

उत्तर पदावनत कृपया देखें: https://developer.android.com/training/permissions/requesting

टुकड़े के अंदर, आपको कॉल करने की आवश्यकता है:

FragmentCompat.requestPermissions(permissionsList, RequestCode)

नहीं:

ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);

2
Android.support.v13.app.ragmentCompat से संबंधित है
उडी ओशी

1
FragmentCompat को एपीआई 27.1.0 के रूप में चित्रित किया गया है।
बिग मैकलेरजैग

मेरे उत्तर को
संक्षिप्त

15

यदि आप विखंडन में requestPims का उपयोग कर रहे हैं, तो यह 3 के बजाय 2 मापदंडों को स्वीकार करता है।

आपको उपयोग करना चाहिए requestPermissions(permissions, PERMISSIONS_CODE);


1
वास्तव में यह प्रश्न का उत्तर प्रदान करता है। एक्टिविटीकम्पैट.रेक्वेस्टपेयर्स के बजाय रिक्वेस्ट पिक्चर्स (फ्रैगमेंट मेथड ऑफ फ्रैग्मेंट), रिजल्ट मेथड को ट्रिगर किया जाता है। जो यहाँ मुख्य मुद्दा है। धन्यवाद डॉन
Waclock

15

यदि किसी कारण से आपने कुछ बाहरी लाइब्रेरी में स्थित एक कस्टम गतिविधि को बढ़ा दिया है, जो सुपर को कॉल नहीं करता है, तो आपको मैन्युअल रूप से फ्रैगमेंट को कॉल करना होगा।

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

आपके पास FragmentCompat में पूर्व मार्शमैलो उपकरणों के लिए चेकपाइन्स फ़ंक्शन है । मैं इस तरह का उपयोग करता हूं:

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

2
यह केवल तभी काम कर रहा है जब android.app.fragment के अंदर अनुमति मांगी गई है, और आपको support-v13 लाइब्रेरी आयात करना होगा!
मोहम्मदरेज़ा

4
FragmentCompat.requestPims () 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()?
अल्मिसॉफ्ट

10

यह मुद्दा वास्तव में NestedFragments के कारण हो रहा था। मूल रूप से सबसे अधिक टुकड़े हम एक HostedFragment का विस्तार करते हैं जो बदले में एक संगतता को बढ़ाता है। इन नीडिंत अंशों के होने के कारण समस्याएँ पैदा हुईं जो अंततः परियोजना के किसी अन्य डेवलपर द्वारा हल की गईं।

वह इस काम को पाने के लिए बिट स्विचिंग जैसे कुछ निम्न स्तर के सामान कर रहा था इसलिए मैं वास्तविक अंतिम समाधान के बारे में सुनिश्चित नहीं हूं


इससे मुझे अपने मुद्दे को हल करने में मदद मिली: मुझे onRequestPcriResult को माता-पिता के टुकड़े से बच्चे (नेस्टेड) ​​टुकड़े में पुनर्निर्देशित करना पड़ा। पारितोषिक के लिए धन्यवाद!
मर्फी

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

सुपर कार्यान्वयन खंडों को लागू करता है जिसे एचटीटी फ्रेमवर्क नहीं कहा जाता है
मोहम्मद याहिया

5

यदि आप एक खंड से इस कोड को बुला रहे हैं, तो इसका स्वयं का अनुरोध तरीका है।

इसलिए मूल अवधारणा है, यदि आप किसी गतिविधि में हैं, तो कॉल करें

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);

और अगर एक टुकड़ा में, बस फोन

requestPermissions(permissionsList,
                            permissionscode);

1
एपीआई स्तर 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 नहीं है !!!

FragmentActivity.java में onRequestPimsResult () के कोड की जाँच करें:

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

मेरे पास इसे प्राप्त करने के लिए एक अद्भुत समाधान है इस तरह एक बेसएक्टिविटी बनाएं।

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

आप उपयोग कर सकते हैं requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);। यदि आप v4 का उपयोग कर रहे हैं तो FragmentCompat का उपयोग न करें।


कृपया विस्तार से बताएं।
12

1

विवरण

  • कोटलिन 1.2.70
  • minSdkVersion 19 में जाँच की गई
  • एंड्रॉइड स्टूडियो 3.1.4

कलन विधि

मॉड्यूल - कैमरा, स्थान, ...।

  1. जांचें कि क्या हैसिस्टमफिट्योर (यदि मॉड्यूल फोन में मौजूद है)
  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;
                }
            }
    }
}

अब ऑनक्रीट विधि में आपको requestForPermission () फ़ंक्शन को कॉल करने की आवश्यकता है।

यही है। इसके अलावा, आप एक बार में कई अनुमति का अनुरोध कर सकते हैं।


1

अद्यतन:super.onRequestPermissionResult() गतिविधि में कॉल करने के बारे में किसी और के उत्तर को देखा और जो मेरे द्वारा उल्लिखित अनुरोध कोड समस्या को ठीक करता है और खंड के onRequestPermissionResult को कॉल करता है

इस सामान को अनदेखा करें:

मेरे लिए यह मेरे बुलाए जाने onRequestPermissionResultके बावजूद गतिविधि को बुला रहा थाfragment.requestPermission(...) , लेकिन क्या यह गलत अनुरोध के साथ परिणाम लौटाता है (111 65647 में बदल गया क्यों ??? मुझे कभी पता नहीं चलेगा)।

सौभाग्य से यह एकमात्र अनुमति है जो हम उस स्क्रीन पर अनुरोध करते हैं इसलिए मैं केवल अनुरोध कोड को अनदेखा करता हूं (यह पता लगाने का समय नहीं है कि यह अभी क्यों नहीं है)


65536 और 111 जोड़ें और आप इसे प्राप्त करेंगे। इसका कारण बिट मास्क है। कुछ विषय देखें।
कूलमैन्ड

0

मुझे एक समस्या यह भी हुई कि अगर आप सही रिक्वेस्ट कॉल करते हैं, तो भी आपको यह समस्या हो सकती है। मुद्दा यह है कि मूल गतिविधि सुपर बुलाए बिना इस पद्धति को ओवरराइड कर सकती है। सुपर जोड़ें और इसे ठीक किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.