अगर टुकड़ा और गतिविधि दोनों में परिभाषित नहीं किया जा रहा है, तो onRequestPeaksResult को टुकड़े में नहीं बुलाया जा सकता है


167

मेरे पास एक टुकड़ा है जिसमें मैंने recyclerview और recyclerview एडाप्टर का उपयोग करके इस recyclerview में डेटा सेट किया है।

अब, मुझे एडॉप्टर की सूची आइटम में एक बटन है जिस पर क्लिक करके मुझे Android में नए अनुमति मॉडल के लिए Android में READ_EXTERNAL_STORAGE अनुमति की जांच करने की आवश्यकता है।

मैंने इस एडॉप्टर के टुकड़े में एक नया फ़ंक्शन बनाया है ताकि यह जांचा जा सके कि अनुमति दी गई है या नहीं और पहले से ही अनुमति नहीं है या नहीं।

मैंने एडाप्टर में एक पैरामीटर के रूप में MyFragment.this पास किया है और एडाप्टर में बटन क्लिक पर टुकड़े के तरीके को कॉल कर रहा है।

मैंने खंड में अनुरोध करने के लिए नीचे दिए गए कोड का उपयोग किया है।

if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED){
       requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                ConstantVariables.READ_EXTERNAL_STORAGE);
    }

मैंने onRequestPermissionsResultनीचे दिए गए कोड का उपयोग करके टुकड़े में विधि को ओवरराइड किया है :

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case ConstantVariables.READ_EXTERNAL_STORAGE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, proceed to the normal flow.
                startImageUploading();
            } else {}

लेकिन इसे कॉल नहीं किया जा रहा है, इसके बजाय इस गतिविधि के onRequestPeaksResult विधि को बुलाया जा रहा है।

मैंने खंडित मूल गतिविधि में समान onRequestPeaksResult पद्धति को भी परिभाषित किया है और इसे कहा जा रहा है।

जब मैं खंड से अनुमति का अनुरोध करता हूं, तो मैं गतिविधि की onRequestPlinesResult विधि को निकाल नहीं सकता, लेकिन खंड के onRequestPiersResult विधि को कॉल करना चाहता हूं। मैं यह कैसे कर सकता हूँ? क्या मैं यहाँ कुछ गलत कर रहा हूँ, कृपया मेरी मदद करें यदि किसी के यहाँ विचार हो।


1
खंड में इस लिंक रन टाइम अनुमतियों को देखें। यह सटीक समाधान है
एंटनी जैक्सन

जवाबों:


372

व्यापक मुद्दों को कवर करने के लिए संपादित उत्तर

मुझे लगता है कि आप खंड और गतिविधि के लिए विधि भ्रमित कर रहे हैं। पिछले महीने मेरी परियोजना इसी तरह का मुद्दा था। कृपया जांचें कि आपके पास आखिरकार निम्नलिखित हैं:

  1. AppCompatActivity में विधि का उपयोग ActivityCompat.requestpermissions
  2. V4 समर्थन टुकड़े में आपको अनुरोधकर्ता का उपयोग करना चाहिए
  3. कैच अगर आप अपने टुकड़े में AppcompatActivity.requestpermissions पर कॉल करते हैं तो कॉलबैक गतिविधि में आएगा या नहीं
  4. super.onRequestPermissionsResultगतिविधि से कॉल करना सुनिश्चित करें onRequestPermissionsResult

देखें कि क्या यह मदद करता है।


9
बस यह सुनिश्चित करने के लिए कि आप अपनी गतिविधि में
सुपर.ऑनरेक्वेस्टेम्परेरीसेन्ट

27
super.onrequestpermissionresultगतिविधि के onrequestpermissionresult में जोड़ना , जब मैं उपयोग करने की अनुमति का अनुरोध करता हूं, तो टुकड़े के onrequestpermissionresult को कॉल करता है requestpermissions। यह अब ठीक काम कर रहा है, आपका बहुत-बहुत धन्यवाद .. :)
पृथ्वीराज निसोनोन

1
Super.onrequestperpermissionresult एक्टिविटी कॉलबैक से गायब था, जिसके कारण मेरे टुकड़े कॉलबैक नहीं हो रहे थे
sakis kaliakoudas

4
requestPokes () के लिए API स्तर 23 की आवश्यकता है। क्या कोई अन्य समाधान है जो एपीआई स्तर 21 के लिए पीछे की ओर संगत है?
एडम हर्विट्ज़

2
@ msc87 1. गतिविधि और टुकड़े के onRequestPeaksResult में, पहली पंक्ति होनी चाहिए: super.onRequestPiersResult (requestCode, अनुमतियाँ, allowResults); 2. इन खंडों में जहां आप अनुमति दी जाती है, केवल इस तरह से कॉल अनुरोध अनुरोध विधि को मान्यता नहीं देते हैं: अनुरोधकर्ता (नया स्ट्रिंग [] {मैनिफेस्ट.पेरिमेंट। CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
अरेएफ

122

मैंने एक टुकड़े से स्थान की अनुमति मांगी और टुकड़े में, मुझे इसे बदलने की आवश्यकता थी:

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

इसके लिए:

            requestPermissions(new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

तब onRequestPiersResult को टुकड़े में कहा गया था।


2
एक आकर्षण की तरह काम करता है :)
एंटोनियो Vlasic

1
यह kotlin साथ काम नहीं कर रहा तुम यहाँ उसी के लिए मुझे मदद कृपया कर सकते यह प्रयोग किया जाता है requestPermissions (गतिविधि के रूप में संदर्भ, permissionList.toTypedArray (), MY_PERMISSIONS_REQUEST)
Arbaz.in

धन्यवाद :), आप मेरा समय
बचाएं

19

यह एक सामान्य गलती है जो लोग मार्शमॉलो के लिए कोडिंग करते समय करते हैं।

जब AppCompatActivity में, आपको ActivCompat.requestPims का उपयोग करना चाहिए; जब android.support.v4.app.Fragment में, आपको बस अनुरोधों का उपयोग करना चाहिए (यह android.support.v4.app.Fragment का एक इंस्टेंस तरीका है) यदि आप एक गतिविधि में ActivCompat.requestPien को कॉल करते हैं, तो onRequestPcriResult कॉलबैक को कॉलबैक कहा जाता है। गतिविधि और टुकड़ा नहीं।

requestPermissions(permissions, PERMISSIONS_CODE);

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

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

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

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

requestPermissions(new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);

संदर्भ के लिए, मुझे इस लिंक https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/ से उत्तर प्राप्त हुआ है।


6

requestPermissionsटुकड़े पर विधि एपीआई स्तर 23 या उच्चतर की आवश्यकता है।
यदि आपका ऐप निम्न संस्करण को लक्षित करता है तो आप उपयोग कर सकते हैं

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

सबसे पहले आपको support-v13 निर्भरता जोड़ने की आवश्यकता है:

implementation "com.android.support:support-v13:$supportLibVersion"

FragmentCompat को संस्करण 27.1.0 से हटा दिया गया है
Raj kannan Iyyappan

6

इसे बदलो :

ActivityCompat.requestPermissions(
    activity,
    arrayOf(Manifest.permission.READ_CONTACTS),
    PERMISSIONS_REQUEST_READ_CONTACTS
)

इसके लिए :

requestPermissions(
     arrayOf(Manifest.permission.READ_CONTACTS),
     PERMISSIONS_REQUEST_READ_CONTACTS
)

निचला एक टुकड़ा में उपयोग के लिए है (onRequestPcriResult को टुकड़े में कहा जाता है), गतिविधिकंपेट संस्करण उपयोग के लिए है जब OnRequestPcriResult गतिविधि में sited हो।
रोर ग्रामो

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

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

परिवर्तन की अनुमति


2
हाय user2002721; आपका कोड सही हो सकता है, लेकिन कुछ संदर्भों के साथ यह बेहतर उत्तर देगा; उदाहरण के लिए, आप यह बता सकते हैं कि यह प्रस्तावित परिवर्तन प्रश्नकर्ता की समस्या को कैसे और क्यों हल करेगा, शायद संबंधित दस्तावेज के लिंक सहित। यह उनके लिए अधिक उपयोगी होगा, और अन्य साइट पाठकों के लिए भी अधिक उपयोगी होगा जो समान समस्याओं के समाधान की तलाश में हैं।
विंस बॉउड्रेन

यदि आप कोशिश करते हैं और लंबाई पहले चेक किए बिना अनुदान के सूचकांक 0 तक पहुंच प्राप्त करते हैं, तो प्रोग्राम सीमा अपवाद से एक सरणी फेंक सकता है। यह मेरे कार्यक्रम के लिए हुआ। मैंने ifResults के लिए स्टेटमेंट को एक इनर के रूप में अलग किया यदि स्टेटमेंट को ऐसा करने से रोका जाए, और यह अब ठीक काम करता है।
पीटर ग्रिफिन

1

यह स्वीकृत उत्तर मेरे लिए काम नहीं किया गया है, इसलिए मैंने अपना समाधान ढूंढा, नीचे समझाया गया है:

1. पहले मैंने एक विधि बनाई, टुकड़े में:

public static void MyOnRequestPermissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
        if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "Permission: true");
        } else {
            Log.d(TAG, "permission: false");
        }
}

2. और फिर इसे अपनी अंतर्निहित गतिविधि से बुलाया:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(requestCode ==1){
        SignupFragment.MyOnRequestPermissionResult(requestCode, permissions, grantResults);
    }
}

और यह काम कर रहा है ...


0

सत्यापित करें कि आपके और अंदर दोनों PERMISSION_REQUEST_CODEका मूल्य समान है।onRequestPermissionsResultFragment


0

TragetSDK 28 के लिए, खंड से SDK चेक (> 23) और अनुरोधकर्ता काम करेंगे। ActivityCompat.requestPmail विफल हो रहा है (यदि आप 65536 के नीचे अनुरोध कोड सेट करते हैं, तो अनुमति संवाद दिखाई देगा और यदि उपयोगकर्ता अनुमति देता है, तो अनुमतियाँ प्रदान की जाती हैं, लेकिन कोई कॉलबैक नहीं होगा। लेकिन यदि आप 65536 से ऊपर सेट करते हैं, तो गतिविधिCompat.requestPims) तुरंत विफल। मुझे नहीं पता कि इस तर्क के पीछे तर्क एक बग या जानबूझकर हो सकता है)।

काम कोड:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }

आपको संस्करण की जाँच करने की आवश्यकता नहीं है। 23 से नीचे के संस्करणों में, यह केवल 'अनुमति दी गई' मान लौटाएगा। डेवलपर की पसंद यहां: सरलता के लिए 'यदि' ब्लॉक से बचें या अनुरोध न होने पर कॉल से बचें
Psest328

0

यदि आप कोटलिन के साथ काम कर रहे हैं, तो आपको स्पष्ट रूप से निर्दिष्ट करना चाहिए कि आप खंड विधि कह रहे हैं, गतिविधि नहीं

 fragment.requestPermissions(permissions, PERMISSIONS_CODE);

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

V4.Fragment से रनटाइम अनुमतियों का अनुरोध करें और कॉलबैक फ्रैगमेंट पर जाएं?


0

मेरी भी यही समस्या थी। आपकी गतिविधि गतिविधि लेआउट से आरंभ की जा सकती है। उसके जैसा:

main_activty.xml

<fragment
    android:id="@+id/fragment"
    android:name="com.exampe.SomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

यह मुद्दा मेरे लिए हल हो गया था जब मैंने FragmentTransactionइसके बजाय उपयोग किया था


0

23 से नीचे के एपीआई में आप गतिविधि में एक इंटरफ़ेस बना सकते हैं और फिर इसे बच्चे के टुकड़े में लागू कर सकते हैं और जब आपको अनुमति का अनुरोध प्राप्त होता है, तो गतिविधि में इसे कार्यान्वित इंटरफ़ेस में पास कर दें। इसका यह सरल :)


0

आप नीचे फ्रैगमेंट विधि कह सकते हैं

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_CODE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission is granted. Continue the action or workflow
                // in your app.
                doActionBecauseNowYouCanBro();
            } else {
                // Explain to the user that the feature is unavailable because
                // the features requires a permission that the user has denied.
                // At the same time, respect the user's decision. Don't link to
                // system settings in an effort to convince the user to change
                // their decision.
                showWhyRequestPermissionsAndDontBlockUserItsCalledManners();
            }
            return;
    }
    // Other 'case' lines to check for other
    // permissions this app might request.

}

-5

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

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


3
उत्तर की प्रतिलिपि बनाने के बजाय, आप बस एक लिंक प्रदान कर सकते हैं - stackoverflow.com/a/33081173/630833
jayeffkay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.