android - GoogleApiClient "GoogleApiClient अभी तक कनेक्ट नहीं है" फेंक रहा है




google-play-services google-api-client (6)

googleApi निर्माण को onCreate पर ले जाने से मेरे लिए समस्या हल हो गई।

इसलिए मुझे कुछ ऐसा मिला जो GoogleApiClient के बारे में मेरे लिए बहुत स्पष्ट नहीं है। GoogleApiClient में ऑनकनेक्ट नामक एक फंक्शन है जिसे क्लाइंट कनेक्ट होने पर (निश्चित रूप से) चलाया जाता है

मुझे अपना स्वयं का फ़ंक्शन मिला: startLocationListening जो अंततः GoogleApiClient के ऑनकनेक्ट किए गए फ़ंक्शन पर कॉल किया जा रहा है

तो मेरा startLocationListening फ़ंक्शन GoogleApiClient कनेक्शन के बिना नहीं चल सका।

कोड और लॉग:

@Override
public void onConnected(Bundle bundle) {
    log("Google_Api_Client:connected.");
    initLocationRequest();
    startLocationListening(); //Exception caught inside this function
}

...

private void startLocationListening() {
    log("Starting_location_listening:now");

    //Exception caught here below:
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
   }

अपवाद है:

03-30 12:23:28.947: E/AndroidRuntime(4936):     java.lang.IllegalStateException: GoogleApiClient is not connected yet.
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.jx.a(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.common.api.c.b(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.nf.requestLocationUpdates(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.startLocationListening(GpsService.java:169)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.onConnected(GpsService.java:259)

...

मेरा डिबग लॉग यह भी कहता है कि ऑनकनेक्ट किए गए फ़ंक्शन को कहा जाता है :

03-30 12:23:28.847: I/Locationing_GpsService(4936): Google_Api_Client:connected.
03-30 12:23:28.857: I/Locationing_GpsService(4936): initLocationRequest:initing_now
03-30 12:23:28.877: I/Locationing_GpsService(4936): initLocationRequest:interval_5000
03-30 12:23:28.897: I/Locationing_GpsService(4936): initLocationRequest:priority_100
03-30 12:23:28.917: I/Locationing_GpsService(4936): Starting_location_listening:now

इसके बाद मुझे अपवाद मिला।

क्या मुझसे कोई चूक हो रही है? मुझे "कनेक्टेड" के लिए प्रतिक्रिया मिली, मैंने अपना फ़न चलाया, और मुझे त्रुटि "कनेक्टेड" नहीं मिली यह क्या है? प्लस एक कष्टप्रद बात यह है: मैंने इस स्थान सेवा का उपयोग अब हफ्तों के लिए किया और यह त्रुटि कभी नहीं मिली।

संपादित करें:

मैंने एक अधिक विशिष्ट लॉग आउटपुट जोड़ा, बस मेरे दिमाग को उड़ा दिया, इसे देखें:

@Override
    public void onConnected(Bundle bundle) {

        if(mGoogleApiClient.isConnected()){
            log("Google_Api_Client: It was connected on (onConnected) function, working as it should.");
        }
        else{
            log("Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.");
        }

        initLocationRequest();
        startLocationListening();
    }

इस मामले में लॉग आउटपुट:

03-30 16:20:00.950: I/Locationing_GpsService(16608): Google_Api_Client:connected.
03-30 16:20:00.960: I/Locationing_GpsService(16608): Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.

हां, मुझे सिर्फ mGoogleApiClient.isConnected() == false onConnected() कैसे संभव है?

संपादित करें:

चूंकि कोई भी इसका जवाब प्रतिष्ठा के साथ नहीं दे सकता था, इसलिए मैंने इसे बग के रूप में Google को रिपोर्ट करने का निर्णय लिया। इसके बाद जो आया वह वाकई हैरान करने वाला था। मेरी रिपोर्ट के लिए Google का आधिकारिक उत्तर:

"यह वेबसाइट AOSP Android स्रोत कोड और डेवलपर टूलसेट के साथ डेवलपर समस्याओं के लिए है, न कि Google ऐप या सेवाओं जैसे कि Play सेवाएं, GMS या Google API के लिए। दुर्भाग्य से प्ले सेवाओं के साथ बग की रिपोर्ट करने के लिए उपयुक्त जगह नहीं लगती है। । मैं केवल इतना कह सकता हूं कि यह वेबसाइट नहीं है, क्षमा करें। इसके बजाय Google उत्पाद फ़ोरम पर पोस्ट करने का प्रयास करें। "

पूरी मुद्दा रिपोर्ट यहाँ (मुझे आशा है कि वे इसे सिर्फ इसलिए नहीं हटाएंगे क्योंकि यह मूर्खतापूर्ण है)

तो हाँ, मैंने Google उत्पाद फ़ोरम पर एक नज़र डाली और बस कौडेंट को इस विषय को पोस्ट करने के लिए कोई भी विषय मिला, इसलिए फिलहाल Iam हैरान और अटक गया।

क्या ग्रह पृथ्वी में कोई भी मेरी मदद नहीं कर सकता है?

संपादित करें:

pastebin में पूर्ण कोड


कनेक्ट कनेक्ट () विधि onStart () विधि में

 @Override
       protected void onStart() {
           super.onStart();

           // Call GoogleApiClient connection when starting the Activity
           googleApiClient.connect();
       }

       @Override
       protected void onStop() {
           super.onStop();

           // Disconnect GoogleApiClient when stopping Activity
           googleApiClient.disconnect();
       }

मुझे लगता है कि मुझे समस्या की जड़ मिल गई और इसका एपीआई से कोई लेना-देना नहीं है। जब भी मैं ऐप इंस्टॉल करता हूं, मैंने हर बार इसे जारी किया है। वैसे सबसे लोकप्रिय टिप्पणी की तरह मैं केवल एक googleApi क्लिक पर फिर से शुरू और फिर से शुरू। मैंने देखा कि जियोलोकेशन एक्सेस पॉप अप करने के लिए अनुमति अनुरोध है। जैसा कि आप अपनी गतिविधि में जानते हैं कि यह एक विराम में बदल जाता है, और एक बार पॉपअप के बाद यह आपकी गतिविधि को फिर से शुरू करता है। सबसे अधिक संभावना है कि आपका googleClient उन घटनाओं को डिस्कनेक्ट करने और कनेक्ट करने के लिए भी जंजीर है। अनुमति मिलने के बाद आप बता सकते हैं कि कोई कनेक्शन नहीं है और आप googleApiClient कार्य करने वाले हैं।

 if(googleApiClient.isConnected()){

        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {

                 if (granted) {
                        //here it could be client is already disconnected!!     
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                    }
                });
    }

आप डिस्कनेक्ट करना और कनेक्ट करना छोड़ सकते हैं क्योंकि आप एक ध्वज सेट करते हैं जो अनुमति से पहले सच है और एक बार googleApiClient कार्य पूरा हो गया है या granted है वह गलत है।

if(googleApiClient.isConnected()){
        isRequestingPermission = true;
        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {
                    if (granted && googleApiClient.isConnected()) {
                        //Once the task succeeds or fails set flag to false
                        //at _geolocateAddress
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                        isRequestingPermission = false;
                    }
                });
    }

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

  • आपको ऐप को अनइंस्टॉल नहीं करना पड़ेगा। बस सेटिंग / एप्लिकेशन मैनेजर / अपने ऐप / अनुमतियों पर जाएं और किसी भी बंद करें, फिर एप्लिकेशन का परीक्षण करें।

मेरे पास एक ही त्रुटि थी, लेकिन मेरी समस्या इहेनिल के उत्तर से अलग थी:

मैंने googleApiClient को स्थिर घोषित किया था। इसने Android को सेवा बंद करने से रोक दिया।


मैंने अभी देखा कि आप onStartCommand () में googleApiClient बना रहे हैं। यह एक बुरे विचार की तरह लगता है।

मान लीजिए कि आपकी सेवा दो बार चालू हो जाती है। दो googleApiClient ऑब्जेक्ट बनेंगे, लेकिन आपके पास केवल एक का संदर्भ होगा। यदि वह जिसका संदर्भ आपने अपने कॉलबैक को ऑनकनेक्ट () करने के लिए निष्पादित नहीं किया है, तो आप उस क्लाइंट में कनेक्ट हो जाएंगे, लेकिन क्लाइंट जिसका संदर्भ आप वास्तव में कर सकते हैं, अभी भी असंबद्ध हो सकता है।

मुझे संदेह है कि क्या चल रहा है। अपने googleApiClient निर्माण को onCreate पर ले जाने का प्रयास करें और देखें कि क्या आपको समान व्यवहार मिलता है।


https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html

आपको अपनी गतिविधि के onCreate (बंडल) विधि में एक क्लाइंट ऑब्जेक्ट को इंस्टेंट करना चाहिए और फिर ऑनस्टार्ट () और डिस्कनेक्ट () ऑनस्टॉप () में कॉल कनेक्ट () को राज्य की परवाह किए बिना करना चाहिए।

GoogleApiClient का कार्यान्वयन केवल एक उदाहरण के लिए डिज़ाइन किया गया प्रतीत होता है। यह केवल onCreate में केवल एक बार इसे इंस्टेंट करना सबसे अच्छा है, फिर एकल उदाहरण का उपयोग करके कनेक्शन और डिस्कनेक्ट करें।





android-googleapiclient