टुकड़े में अनुमति की जांच कैसे करें


94

मैं एक टुकड़े के अंदर एक अनुमति की जांच करना चाहता हूं।

मेरा कोड:

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

जवाबों:


52

मैंने एक टुकड़े के अंदर एक अनुमति की जांच करने के लिए निम्नलिखित किया है।

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
यदि उपयोगकर्ता ने अनुमति नहीं दी है तो हमें अभी भी अनुमति मांगने की आवश्यकता है।
करण ठक्कर

17
याद रखें कि यदि आप ऐसा करते हैं, तो आपका अनुरोध अनुमति परिणाम उस गतिविधि पर आ जाएगा जिसने आपका टुकड़ा शुरू किया था। अपने टुकड़े में परिणाम प्राप्त करने के तरीके के लिए TheTNaing Mizo का उत्तर देखें ।
lsrom

260

यह मैंने कैसे किया, यह मेरे लिए काम करता है। धन्यवाद!

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

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

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

requestPermissions(permissionsList, REQUEST_CODE);

Fragment requestPokes के लिए Android M की आवश्यकता होती है, लेकिन यह पुराने API संस्करणों के लिए FragmentCompat में उपलब्ध है।
ब्रायन व्हाइट

20
एक टुकड़े के अंदर अनुमति का अनुरोध करने का सही तरीका
तरुण

requestPermissions उपयोग मार्शल और स्तर ऊपर एसडीके है
हामिद

अब AndroidX Fragment लाइब्रेरी में Fragment क्लास के मानक भाग, इसलिए FragmentCompat की आवश्यकता नहीं होनी चाहिए (AndroidX का उपयोग करते समय)।
बड़ा_m

81

टुकड़े में 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 requestPokes के लिए Android M की आवश्यकता होती है, लेकिन यह FragmentCompat में उपलब्ध है।
ब्रायन व्हाइट

6

Fragmentकॉल requestPermissionsविधि में अनुमतियों को संभालने के लिए । यदि आप onRequestPermissionsResultउस टुकड़े से युक्त, खंड और गतिविधि दोनों में विधि को ओवरराइड करते हैं, तो टुकड़ा super.onRequestPermissionsResult(...)में विधि को कॉल करने के लिए गतिविधि विधि में कॉल करना सुनिश्चित करें onRequestPermissionsResult


4

onRequestPermissionsResultटुकड़ा नहीं है गतिविधि में लगाया जाता है। onRequestPermissionsResultइसके बजाय गतिविधि में ओवरराइड करने का प्रयास करें ।


हालांकि यह सच है, इसमें इस बात का स्पष्टीकरण नहीं है कि यह सच क्यों है और इसे कैसे ठीक किया जाए - कैसे onRequestPermissionResultटुकड़े में लाया जाए। टुकड़े टुकड़े में परिणाम प्राप्त करने की व्याख्या और तरीका दोनों को ThetNaing Mizo द्वारा उत्तर में समझाया गया है ।
lsrom

धन्यवाद, मैं सोच रहा था कि मेरा कोड Fragment के अंदर काम क्यों नहीं कर रहा है
Azizjon Kholmatov

4

कोटलिन का उपयोग करते हुए, आप कॉल करते हैं 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 {

}

3

मेरे लिए जो काम किया गया था वह उस गतिविधि में onRequestPeaksResult पद्धति को कॉल कर रहा था जिसके अंदर टुकड़े को स्वयं में कॉल करने के बजाय टुकड़ा लागू किया गया है। टुकड़े में 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();
            }

        }
});

गतिविधि में जो ऑनक्रीट विधि के बाहर, टुकड़े को लागू करने में मदद करता है :

    @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

यदि आपने सेटिंग से ऐप की अनुमति को बंद कर दिया है, तो आप अपनी अनुमति को मार्शमैलो से कम कोड या अपने एंड्रॉइड वर्जन से नहीं खोल सकते।

आप इस दस्तावेज़ की जांच कर सकते https://developer.android.com/training/permissions/requesting.html और यह एक उदाहरण है https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html


0

मैं का उपयोग कर फिसल मिल रही थी, checkSelfPermission()एक में Fragmentऔर सोच क्या सबसे अच्छा तरीका हो सकता है Contextअशक्त जा रहा है (Kotlin विशिष्ट) ... मैं का उपयोग करना चाहिए !!या कुछ और ?

मैं iosched में मिले कोड के आधार पर कुछ और लेकर गया था । नीचे दिए गए नमूने पर एक नज़र डालें, और याद रखें, इससे पहले कि Fragmentएक संलग्न है Activity, Contextइच्छा शून्य होगी।

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.