Google Play services और रनटाइम की अनुमतियां

Android 6.0 Marshmallow के बाद से, Android Android अनुमतियों का मॉडल जो ऐप्लिकेशन इंस्टॉल करने की प्रोसेस को आसान बनाता है और अपने-आप अपडेट होने की प्रोसेस के बारे में ज़्यादा जानें. अनुमतियों का अनुरोध पहले के बजाय रनटाइम पर किया जाता है ऐप इंस्टॉलेशन. इसके अलावा, उपयोगकर्ता कुछ खास अनुमतियों को अस्वीकार करने का विकल्प भी चुन सकते हैं. लोगों को यह सुविधा देने के लिए, आपको यह पक्का करना होगा कि आपका ऐप्लिकेशन इस तरह काम करे तब उम्मीद की जाती है, जब कोई उपयोगकर्ता किसी खास अनुमति को चालू या बंद करता है.

Google Play services के पास रनटाइम की अनुमतियां होती हैं, जिन्हें उपयोगकर्ता चुन सकते हैं उन अनुमतियों को अलग से अस्वीकार करें जिनका अनुरोध खास तौर पर आपके का इस्तेमाल करें. Google Play services को सभी ज़रूरी अनुमतियां अपने-आप मिल जाती हैं ताकि एपीआई काम कर सके. हालांकि, आपके ऐप्लिकेशन को अब भी रनटाइम की जांच करके, उसके लिए अनुरोध करना चाहिए अनुमतियों को ज़रूरत के मुताबिक सेट अप करती हैं. साथ ही, ऐसे मामलों में गड़बड़ियों को सही तरीके से हैंडल करती हैं जहां कोई उपयोगकर्ता ने Google Play सेवाओं को उस एपीआई के लिए ज़रूरी अनुमति नहीं दी है जिसका इस्तेमाल आपका ऐप्लिकेशन करता है.

यह एक अच्छा तरीका है कि आप ऐसी अनुमतियां सेट करें जो उपयोगकर्ता की उम्मीदों पर खरी उतरें रनटाइम की ज़रूरत पड़ सकती है. इन सबसे सही तरीकों की मदद से, समस्याओं का पता लगाना.

ज़रूरी शर्तें

आपको अपनी AndroidManifest.xml फ़ाइल में अनुमतियों का एलान करना होगा. उदाहरण के लिए:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

दिशा-निर्देश

एपीआई को कॉल करने से पहले अनुमतियों की पुष्टि करें

जिन एपीआई का इस्तेमाल आपको अपने AndroidManifest.xml फ़ाइल अपलोड करते समय, पक्का करें कि आपके पास ज़रूरी अनुमति हो को कॉल करें. checkSelfPermission तरीके का इस्तेमाल करके ऐसा किया जा सकता है ActivityCompat या ContextCompat में से.

अगर कॉल में गलत जवाब मिलता है, तो इसका मतलब है कि अनुमतियां नहीं दी गई हैं और आपको अनुरोध करने के लिए, को requestPermissions का इस्तेमाल करना चाहिए. इसका जवाब यह है 'वापस जाएं' पर क्लिक करें. यह आपको अगले चरण में दिखेगा.

उदाहरण के लिए:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED) {
  // Check Permissions Now
  ActivityCompat.requestPermissions(this,
      new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
      REQUEST_LOCATION);
} else {
  // permission has been granted, continue as usual
  Task<Location> locationResult = LocationServices
      .getFusedLocationProviderClient(this /** Context */)
      .getLastLocation();
}

अनुरोध की अनुमति का कॉलबैक लागू करें

अगर उपयोगकर्ता ने आपके ऐप्लिकेशन को वह अनुमति नहीं दी है जिसकी ज़रूरत है, तो requestPermissions तरीके को कॉल करके यह पूछा जाना चाहिए कि उपयोगकर्ता को अनुमति देनी होगी. उपयोगकर्ता का जवाब onRequestPermissionsResult कॉलबैक. आपके ऐप्लिकेशन को चाहिए इसे लागू करें और हमेशा रिटर्न वैल्यू की जांच करें, क्योंकि अस्वीकार या रद्द किया गया. यहां पर एक से ज़्यादा अनुमतियों का अनुरोध किया जा सकता है और उनके लिए जांच भी की जा सकती है एक बार--नीचे दिया गया नमूना सिर्फ़ एक अनुमति की जांच करता है.

public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions,
                                       int[] grantResults) {
    if (requestCode == REQUEST_LOCATION) {
        if(grantResults.length == 1
           && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // We can now safely use the API we requested access to
            Task<Location> locationResult = LocationServices
                .getFusedLocationProviderClient(this /** Context */)
                .getLastLocation();
        } else {
            // Permission was denied or request was cancelled
        }
    }
}

अनुमति की वजह दिखाएं

अगर आपके ऐप्लिकेशन ने जिन अनुमतियों का अनुरोध किया है वे और उपयोगकर्ता ने पहले ही अनुमति के अनुरोध को अस्वीकार कर दिया हो, तो आपके ऐप्लिकेशन को फिर से अनुमति का अनुरोध करने से पहले, एक और जानकारी दिखाएं. लोग जब वे यह समझ जाते हैं कि अनुमति की ज़रूरत और उन्हें तुरंत इसका फ़ायदा मिल सकता है.

ऐसे मामले में, requestPermissions पर कॉल करने से पहले, आपको कॉल करना चाहिए shouldShowRequestPermissionRationale. अगर यह वापस आता है सही है, तो आपको अनुमति.

उदाहरण के लिए, आपका कोड कुछ ऐसा दिख सकता है:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED) {
    // Check Permissions Now
    private static final int REQUEST_LOCATION = 2;

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.ACCESS_FINE_LOCATION)) {
        // Display UI and wait for user interaction
    } else {
        ActivityCompat.requestPermissions(
            this, new String[]{Manifest.permission.LOCATION_FINE},
            ACCESS_FINE_LOCATION);
    }
} else {
    // permission has been granted, continue as usual
    Task<Location> locationResult = LocationServices
        .getFusedLocationProviderClient(this /** Context */)
        .getLastLocation();
}

कनेक्शन से जुड़ी गड़बड़ियां ठीक करना

कॉल करते समय, अगर आपका ऐप्लिकेशन ऐसे GoogleApiClient का इस्तेमाल करता है जो अब काम नहीं करता connect(), Google Play services पुष्टि करती है कि इसमें ज़रूरी अनुमतियां चाहिए. अनुमति का कोई ग्रुप होने पर, connect() काम नहीं करता इसकी ज़रूरत Google Play services को नहीं होती.

अगर connect() को कॉल नहीं किया जा सकता, तो पक्का करें कि आपका ऐप्लिकेशन सही तरीके से कनेक्शन नहीं हो सका. अगर Google Play services में अनुमतियां नहीं हैं, तो आप startResolutionForResult() का इस्तेमाल करके, इन्हें ठीक करने के लिए, यूज़र फ़्लो शुरू करें.

उदाहरण के लिए:

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (mResolvingError) {
        // Already attempting to resolve an error.
        return;
    } else if (result.hasResolution()) {
        try {
            mResolvingError = true;
            result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
        } catch (SendIntentException e) {
            // There was an error with the resolution intent. Try again.
            mGoogleApiClient.connect();
        }
    } else {
        // Show dialog using GooglePlayServicesUtil.getErrorDialog()
        showErrorDialog(result.getErrorCode());
        mResolvingError = true;
    }
}

GoogleApi पर आधारित नए एपीआई कॉल में, डायलॉग बॉक्स अपने-आप दिखेगा (अगर क्लाइंट को Activity) या सिस्टम ट्रे सूचना से इंस्टैंशिएट किया जाता है (अगर क्लाइंट को Context से इंस्टैंशिएट किया जाता है) अनुमतियों का रिज़ॉल्यूशन इस्तेमाल करें. कॉल की कतार में की अनुमति दी गई है.