6

मैं एंड्रॉइड बीकन लाइब्रेरी का उपयोग कर रहा हूं। मार्शमलो के बाद से, मुझे अपेक्षित और दस्तावेज के रूप में निम्न त्रुटि दिखाई दे रही है।पृष्ठभूमि में निगरानी नहीं करते समय स्थान अनुमति के लिए संकेत?

अनुमति इनकार: ACCESS_COARSE_LOCATION की जरूरत है या ACCESS_FINE_LOCATION अनुमति स्कैन परिणाम

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

अग्रभूमि में जब अपवाद फेंक दिया गया है, भले ही मैंने AndroidManifest को अनुमति दी है?

प्रलेखन HERE के अनुसार, यदि आप पृष्ठभूमि में स्कैन कर रहे हैं तो आपको केवल स्थान अनुमति के लिए उपयोगकर्ता को संकेत देने की आवश्यकता है?

आप तब होगी जब आप पृष्ठभूमि में एक ब्लूटूथ स्कैन करने की कोशिश LogCat में निम्न त्रुटि, मिलता है, और कोई बीकन

पता लगाया जाएगा इसका मतलब यह है केवल एक पृष्ठभूमि स्कैन या क्या मैं प्रलेखन की गलत व्याख्या कर रहा हूं, और आपको बिना किसी पर ध्यान देना चाहिए? मैं बचने योग्य ऐप के अंदर अनुमति के लिए अतिरिक्त (ऑफ-डॉटिंग शायद घबराहट उपयोगकर्ताओं को) से बचना चाहता हूं !!

मेरे प्रकट होता है -

<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

मेरे टुकड़ा से snipped कोड है -

public class NearMeNowFragment extends Fragment implements BeaconConsumer { 

//Beacon manager stuff 
private BeaconManager beaconManager; 

<SNIP> 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    beaconManager = BeaconManager.getInstanceForApplication(getActivity()); 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.near_me_now, container, false); 

    //Set up beacon stuff if Bluetooth available 
    if (verifyBluetooth(false)) { 
     beaconManager.bind(this); 
    } 

    <SNIP> 

    return rootView; 
} 


/*************************** 
Beacon config methods 
**************************** 
*/ 

@Override 
public void onBeaconServiceConnect() { 
    //update all scan periods 
    beaconManager.setForegroundScanPeriod(1100l); 
    beaconManager.setForegroundBetweenScanPeriod(8900l); 
    beaconManager.setAndroidLScanningDisabled(true); 
    try { 
     beaconManager.updateScanPeriods(); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 

    beaconManager.setRangeNotifier(new RangeNotifier() { 
     @Override 
     public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
      if (beacons.size() > 0) { 
       <SNIP> 
       //handling beacons here 
       ... 
      } else { 
       Log.i(TAG, "ZERO BEACONS IN SCAN"); 
      } 
     } 
    }); 

    try { 
     beaconManager.startRangingBeaconsInRegion(new Region(TAG, null, null, null)); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public Context getApplicationContext() { 
    return getActivity().getApplicationContext(); 
} 

@Override 
public void unbindService(ServiceConnection serviceConnection) { 
    getActivity().unbindService(serviceConnection); 
} 

@Override 
public boolean bindService(Intent intent, ServiceConnection serviceConnection, int mode) { 
    return getActivity().bindService(intent, serviceConnection, mode); 
} 


@Override 
public void onPause() { 
    super.onPause(); 

    if(beaconManager.isBound(this)){ 
     beaconManager.unbind(this); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    beaconManager.bind(this); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if(beaconManager.isBound(this)){ 
     beaconManager.unbind(this); 
    } 
} 

}

मेरे वास्तविक Logcat त्रुटि

डब्ल्यू/बाइंडर है: बाइंडर स्टब i से एक रनटाइम अपवाद पकड़ा mplementation। java.lang.SecurityException: ACCESS_COARSE_LOCATION की जरूरत है या ACCESS_FINE_LOCATION अनुमति स्कैन परिणाम

उत्तर

20

पाने के लिए आवश्यकता स्पष्ट करने के लिए अलग अलग आप अपने build.gradle फ़ाइल में targetSdkVersion 23 सेट के आधार पर है।

आप एसडीके 23 (Marshmallow) को लक्षित करते हैं:

  • आप अपने मेनिफ़ेस्ट में android.permission.ACCESS_COARSE_LOCATION या android.permission.ACCESS_FINE_LOCATION घोषित करना चाहिए।
  • तुम मेरे ब्लॉग पोस्ट here.
  • उपयोगकर्ता इस अनुमति को स्वीकार करना चाहिए और इसे बंद नहीं में वर्णित के रूप अनुमति के लिए एक उपयोगकर्ता का संकेत चाहिए।
  • यदि उपरोक्त में से कोई भी आवश्यकता पूरी नहीं हुई है, तो आप अग्रभूमि या पृष्ठभूमि में बीकन का पता लगाने में सक्षम नहीं होंगे।

आप एसडीके 23 (Marshmallow) लक्षित नहीं करते हैं:

  • आप वैकल्पिक रूप से अपने मेनिफ़ेस्ट में android.permission.ACCESS_COARSE_LOCATION या android.permission.ACCESS_FINE_LOCATION घोषित कर सकता है।
  • उपयोगकर्ता सेटिंग्स पर जाकर अनुमति चालू या बंद कर सकता है।
  • यदि अनुमतियों में से कोई एक प्रदान नहीं किया गया है, तो भी आप अग्रभूमि में बीकन का पता लगाने में सक्षम होंगे, लेकिन पृष्ठभूमि में नहीं।

अधिक जानकारी के लिए here और here देखें।

+0

उत्कृष्ट! अब मैं प्रॉम्प्ट का उपयोग कर रहा हूं और अनुमति प्राप्त कर रहा हूं। अगर मैं कुछ स्पष्ट याद कर रहा था तो मैं बस इससे बचना चाहता था। पृष्ठभूमि या फोरग्राउंड में कोई बीकन शामिल करने के लिए "requesting_permission" दस्तावेज़ के पहले पैराग्राफ को अपडेट करना उचित हो सकता है? – WallyHale

+0

मैंने अभी आपके ब्लॉग पोस्ट में निष्कर्ष पढ़ा है, यह आपके ऊपर क्या कहा गया है इसके विपरीत है ?? QUOTE - "यदि आपके पास एक बीकन ऐप है जो केवल अग्रभूमि में काम करने की ज़रूरत है, तो कोई बदलाव की आवश्यकता नहीं है। यदि आपके पास एक बीकन ऐप है जिसे पृष्ठभूमि में काम करने की आवश्यकता है, तो आपको उचित स्थान अनुमतियों का अनुरोध करने के लिए इसे अपडेट करने की आवश्यकता है पहला खंड "। मेरा ऐप केवल अग्रभूमि में काम कर रहा है ?? – WallyHale

+1

मुझे खुद को अच्छी तरह से समझा नहीं जाना चाहिए। :) यदि मैं कथन बदलता हूं "यदि आपके पास मौजूदा बीकन ऐप है जो अभी तक एसडीके 23 को लक्षित नहीं करता है और केवल अग्रभूमि में काम करने की आवश्यकता है, तो कोई बदलाव की आवश्यकता नहीं है।" क्या यह कथित विरोधाभास दूर हो जाता है? – davidgyoung

1

जब मैंने इसे मार्शमलो डिवाइस पर परीक्षण किया तो मेरे ऐप के साथ भी यही समस्या थी। अनुमति के लिए उपयोगकर्ता को संकेत देने से बचने के लिए, मैंने अभी लक्ष्य एसडीकेवर्सन को 22 में बदल दिया है। CompileSdkVersion 23 पर बना सकता है। Build.gradle को बदलने के बाद, आपको टूल्स> एंड्रॉइड> सिडल प्रोजेक्ट को ग्राडल फाइलों के साथ चलाने की आवश्यकता हो सकती है। यदि आप ग्रहण का उपयोग करते हैं, तो targetSdkVersion मेनिफेस्ट फ़ाइल में है।

+0

के लिए सेटिंग्स में अपने लॉगकट आउटपुट और अनुमतियों को दिखाते हुए एक नया प्रश्न खोलें हां, आप निचले एसडीके को लक्षित कर सकते हैं, लेकिन यह उन लोगों के लिए समाधान नहीं है जो खून बहने वाले किनारे पर रहना चाहते हैं। नवीनतम संस्करण/उपकरणों के साथ अद्यतित रहने के लिए, एक्सेस के लिए संकेत देना आवश्यक होगा। – WallyHale

+0

मैं सिर्फ उपयोगकर्ता को सूचित करने से बचने के लिए एक विकल्प प्रदान करना चाहता हूं। कुछ ऐप्स को नवीनतम एसडीके पर लक्षित करने की आवश्यकता नहीं है। आपको अपने फैसले का उपयोग करना होगा। –

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