2015-11-23 23 views
20

ACCESS_FINE_LOCATION अनुमति एंड्रॉयड मैनिफ़ेस्ट फ़ाइल में जीपीएस स्थान"जीपीएस" स्थान प्रदाता के लिए एंड्रॉयड 6.0

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

मैं स्थान प्रबंधक कक्षा

का उपयोग कर नीचे के रूप में स्थान अपडेट fecthing हूँ का उपयोग करने के लिए मैं नीचे अनुमतियों को शामिल किया है की आवश्यकता है
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 
locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 
        MIN_TIME_BW_UPDATES, 
        MIN_DISTANCE_CHANGE_FOR_UPDATES, 
        this 
       ); 

लेकिन इसके बाद के संस्करण लाइन एक अपवाद बताते हुए दे रहा है

"gps" location provider requires ACCESS_FINE_LOCATION permission 

यह बात केवल लक्ष्य एसडीकेवीरियन 23 (यानी एंड्रॉइड 6.0 के साथ) के साथ होती है और मैंने एंड्रॉइड 5.1 में भी परीक्षण किया है जो ठीक काम करता है।

कृपया मदद करें !! अग्रिम में धन्यवाद।

+0

आप के लिए <का उपयोग करता है-अनुमति जोड़ दिया ... टैग:

public boolean checkLocationPermission() { String permission = "android.permission.ACCESS_FINE_LOCATION"; int res = this.checkCallingOrSelfPermission(permission); return (res == PackageManager.PERMISSION_GRANTED); } 

यह सब Android दस्तावेज़ पर समझाया है: तो फिर स्थान अनुरोध करने से पहले, आप परीक्षण करने के लिए करता है, तो अनुमति अभी भी प्रदान किया जाता है के लिए होता है अपने AndroidManifest.xml का मैनिफेस्ट नोड? जैसे http: // stackoverflow देखें।कॉम/ए/16691500/1615430 – RookieGuy

+1

हाँ मैंने मैनिफेस्ट नोड में जरूरी ठीक किया है। यहां पर समस्या केवल एंड्रॉइड 6.0 –

उत्तर

42

6.0 के बाद से कुछ अनुमतियों के रूप में "खतरनाक" (FINE_LOCATION उनमें से एक है) माना जाता है।

उपयोगकर्ता की सुरक्षा के लिए, उन्हें रनटाइम पर अधिकृत होना होगा, इसलिए उपयोगकर्ता को पता है कि यह उसकी कार्रवाई से संबंधित है या नहीं।

ऐसा करने के लिए:

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

यह एक DialogBox जिसमें उपयोगकर्ता का चयन करेंगे मौसम वह स्थान का उपयोग करें या नहीं करने के लिए अपने अनुप्रयोग autorize दिखाएगा।

फिर इस समारोह का उपयोग करके उपयोगकर्ता जवाब पाने:

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

      } else { 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
     return; 
     } 
      // other 'case' lines to check for other 
      // permissions this app might request 
    } 
} 

उपयोगकर्ता यह एक बार स्वीकार करते हैं, और फिर अपने ऐप यह याद होगा और इसके बाद आप इस DialogBox भेजने की जरूरत नहीं होगी। ध्यान दें कि अगर उपयोगकर्ता ने फैसला किया तो उपयोगकर्ता इसे बाद में अक्षम कर सकता है। http://developer.android.com/training/permissions/requesting.html

+0

अच्छा और विस्तृत उत्तर, बढ़िया! यह भी कोशिश करेगा, अभी तक एंड्रॉइड मार्शमेलो के साथ जांच नहीं की है। यह मुझे लगता है कि बहुत सारे ऐप्स के लिए संगतता तोड़ता है, तो वे पिछले संस्करण का उपयोग कर उपकरणों पर जल्दी से बाहर नहीं रोल करेंगे? – RookieGuy

+0

मैंने अपने बारे में ऐसा नहीं सोचा था क्योंकि मैंने हाल ही में एक ऐप पर कोशिश की है जिसे मैं विकसित कर रहा हूं :) मुझे लगता है कि इस अद्यतन से पहले दी गई खतरनाक अनुमतियां दी जाएंगी, भले ही उन्हें इंस्टॉल पर दिया गया हो। –

+0

ध्यान दें कि उपयोगकर्ता अब एंड्रॉइड सेटिंग्स में अनुमति को अक्षम करने का निर्णय ले सकता है। –

5

इस कोड

private void marshmallowGPSPremissionCheck() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M 
       && getActivity().checkSelfPermission(
       Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED 
       && getActivity().checkSelfPermission(
       Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, 
          Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSION_LOCATION); 
     } else { 
      // gps functions. 
     } 
    } 

प्रयास करें यह भी जोड़ना ..................

@Override 
    public void onRequestPermissionsResult(int requestCode, 
              String[] permissions, int[] grantResults) { 
     if (requestCode == MY_PERMISSION_LOCATION 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // gps functionality 
     } 
    } 
+0

के साथ बनी रहती है एक्टिविटी() यहाँ क्या है? वास्तव में क्या हो रहा है ?? क्या आप कृपया –

+0

समझा सकते हैं कोड एक टुकड़े, या कुछ समान होना चाहिए। संदर्भ प्राप्त करने के लिए आप getActivity() का उपयोग कर सकते हैं, यदि आप उस श्रेणी में हैं जो टुकड़े को बढ़ाता है और गतिविधि नहीं करता है। – Fustigador

+0

क्या यह कोड आपके लिए काम करता है? यदि आप गतिविधि में इसका उपयोग कर रहे हैं तो getActivity() को हटा दें। यह कोड वास्तव में रन टाइम के दौरान स्थान की अनुमति की जांच करता है। – Nivedh

0

हम के बाद से एंड्रॉयड अनुमतियों में कुछ बदलाव किया है संस्करण 6. आपको ऐप इंस्टॉल करते समय, उनका उपयोग करने के समय अनुमतियों से सहमत होना होगा। यदि आप buildtools संस्करण 23 का उपयोग करते हैं तो कुछ समस्याएं हो सकती हैं। समझने के लिए this link देखें। डिवाइस सेटिंग्स> ऐप्स पर जाएं और अपना ऐप चुनें और मैन्युअल रूप से अनुमतियां स्वीकार करें और जांचें कि आपकी समस्या हल हो गई है या नहीं।

0

मैंने हाल ही में इस समस्या का अनुभव किया है। एंड्रॉइड 6.0 में आपको ऐप में उपयोग करते समय आपको आवश्यक अनुमतियों के लिए स्पष्ट रूप से पूछना होगा। यदि आप नहीं करते हैं, तो स्थान अनुमति स्वचालित रूप से अस्वीकार कर दी जाती है।

// Here, thisActivity is the current activity 
    if (ContextCompat.checkSelfPermission(thisActivity, 
        Manifest.permission.READ_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an expanation 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(thisActivity, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_FINE_LOCATION); 

      // MY_PERMISSIONS_REQUEST_FINE_LOCATION is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 

अधिक यहाँ जानकारी: http://developer.android.com/training/permissions/requesting.html

संबंधित मुद्दे