18

देता है मैं एंड्रॉइड सपोर्ट लाइब्रेरी का उपयोग कर एक नए एप्लिकेशन में नए Google मानचित्र एंड्रॉइड एपीआई v2 को शामिल करने की कोशिश कर रहा हूं। मैं कहीं और काम करने की कोशिश करने के लिए कई पुनरावृत्ति से गुज़र चुका हूं और अब मैंने छोड़ दिया है और सोचा है कि मुझे यहां पूछना चाहिए।Google मानचित्र एंड्रॉइड एपीआई v2 GooglePlayServicesNotAvailableException को फेंक देता है, पुराना है, SupportMapFragment.getMap() शून्य

मैं एपीआई कंसोल में गया, एक प्रोजेक्ट बनाया, एंड्रॉइड के लिए Google मैप्स एपीआई v2 सक्षम किया, आवश्यकतानुसार एक डीबग कुंजी बनाया और इसे मैनिफेस्ट पर चिपकाया। कोई प्रमाणीकरण समस्या या ऐसा कुछ भी नहीं। बहुत यकीन है कि मैंने यह सही किया है।

मेरी परियोजना के libs फ़ोल्डर में मैंने android-support-v4.jar (प्रोजेक्ट राइट-क्लिक-> एंड्रॉइड-> समर्थन लाइब्रेरी जोड़ें ...) डाल दिया है। ग्रहण में मैंने फ़ाइल-> आयात-> एंड्रॉइड-> कार्यक्षेत्र में मौजूदा एंड्रॉइड कोड किया और एंड्रॉइड-एसडीके/google/google_play_services/libproject/google-play-services_lib के नवीनतम (पुन: 3) आयात किए। तब मैं अपने प्रोजेक्ट में कोई निर्भरता पुस्तकालय के रूप में यह जोड़ा (परियोजना को राइट-क्लिक-> गुण> Android-> तल पर एक पुस्तकालय निर्भरता के रूप में यह जोड़े

मेरी प्रकट में मेरे पास है:।

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> 
    <permission 
     android:name="myapp.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature"/> 

    <All the uses-permission required like INTERNET, ACCESS_NETWORK_STATE, WRITE_EXTERNAL_STORAGE, FINE AND COARSE LOCATION, etc> 
    <uses-permission android:name="myapp.permission.MAPS_RECEIVE"/> 
    <uses-feature android:glEsVersion="0x00020000" android:required="true"/> 
    <application ...> 
     ... 
     <uses-library android:name="com.google.android.maps" /> 
     <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AI..."/> 
    </application> 

मेरी mainview.xml में मेरे पास है:

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 

अब MainView.java पर मेरे पास है:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 

public class MainView extends FragmentActivity ... { 
    private GoogleMap mMap; 

    @Override 
    protected void onResume() { 
     ... 
     Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.map); 
     SupportMapFragment mapFragment = (SupportMapFragment)fragment; 
     mMap = mapFragment.getMap(); 
     //PROBLEM: mMap is null here even though mapFragment is not 
    } 
} 

तो मैं यद्यपि , तब

//Fragments 
FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction(); 
transaction.add(R.id.map, SupportMapFragment.newInstance()); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
transaction.commit(); 

मैंने कहा शायद यह SupportMapFragment नहीं है, लेकिन मैं वास्तव में वास्तविक टुकड़ा का संदर्भ लेना चाहिए, और मेरे onResume मैं में: ught मैं शायद सामग्री दृश्य सेट करने के बाद टुकड़े इसलिए मैं अपने onCreate में जोड़ा प्रारंभ करने की आवश्यकता किया:

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.map); 
SupportMapFragment mapFragment = (SupportMapFragment)fragment; 

//Fragments 
FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction(); 
transaction.add(R.id.map, mapFragment); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
transaction.commit(); 

mMap = mapFragment.getMap(); 

mMap इसके बाद फिर से शून्य है।

तब मैंने देखा कि MapsInitializer कक्षा है, इसलिए मैंने सोचा कि शायद मुझे पहले इसे कॉल करना चाहिए। चेतावनी सूचना (लाइन 313 MapsInitializer.initialize(this) है)

try { 
    MapsInitializer.initialize(this); 
} catch (GooglePlayServicesNotAvailableException e) { 
    e.printStackTrace(); 
} 
इस Logcat साथ

:

तो मैं उपरोक्त कोड में टुकड़ा होने से पहले कोड जोड़ा

com.google.android.gms.common.GooglePlayServicesNotAvailableException 
    at com.google.android.gms.internal.n.c(Unknown Source) 
    at com.google.android.gms.internal.n.a(Unknown Source) 
    at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source) 
    at myapp.activities.MainView.inflateSelectedViewAndSetData(MainView.java:313) 
    at myapp.activities.MainView.onClick(MainView.java:642) 
    at android.view.View.performClick(View.java:3153) 
    at android.view.View$PerformClick.run(View.java:12148) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:152) 
    at android.app.ActivityThread.main(ActivityThread.java:4615) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:491) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 
मेरे प्रयास के दौरान

Logcat निम्नलिखित चेतावनी की रिपोर्ट करेगा:

Google Play services out of date. Requires 2010100 but found 1013 

यह हो सकता है एक/अपराधी लेकिन मुझे कोई समाधान नहीं मिला।

इस बिंदु पर मैं विचारों से बाहर हूं। मैंने कई धागे here, here, here पढ़े लेकिन किसी भी सुझाव ने समस्या का समाधान नहीं किया। उत्तरार्द्ध में वे परियोजना निर्भरता और जार फ़ाइल समेत शामिल नहीं करने का सुझाव देते हैं। खैर, यह google-play-services.jar या तो google-play-services_lib/libs फ़ोल्डर से या उस परियोजना से अपना खुद का जार निर्यात करने का काम नहीं कर रहा था।

जिस तरह से मैं एक वास्तविक डिवाइस (2.3.5 और 3.2 के साथ एक टैबलेट) पर चल रहा हूं, एम्यूलेटर नहीं।

किसी भी मदद की पूरी तरह से सराहना की। :)

अद्यतन:

समाधान qubit से नीचे है।

जहाँ तक FatJar का उपयोग करें और google_play_services_lib परियोजना (जो मैं से एक स्थानीय प्रति का निर्माण नहीं किया निर्यात करने के लिए किया जाता है पुस्तकालय निर्भरता, एक साफ रास्ता करने के लिए इसके साथ सौदा करने के लिए (जो एक दर्द जब खजाने के साथ काम कर रहा है) नहीं निर्यात क्योंकि जब यह अद्यतन होता है तो मैं फिर से आयात नहीं करना चाहता), और अपनी परियोजना में थै आउटपुट वसा जार फ़ाइल को एक और जार फ़ाइल के रूप में शामिल करें। नोट: जब वसा जार में कौन सी जार फ़ाइलों को शामिल करना है, तो मुझे annotations.jar फ़ाइल को बाहर करना पड़ा क्योंकि यह पहले से ही शामिल था और डुप्लिकेशन के लिए त्रुटियां पैदा कर रहा था। अब मुझे अपने प्रोजेक्ट के libs फ़ोल्डर में google_play_services_rev_3.jar शामिल करना है और मुझे जाना अच्छा लगता है।

+0

चूंकि यह आपकी समस्या का उत्तर नहीं है, इसलिए मैं इसे केवल टिप्पणी के रूप में दूंगा: जब आप जीपीएस/डब्ल्यूएलएएन आधारित स्थानीयकरण से अधिक नहीं करना चाहते हैं, नक्शे दिखा रहे हैं, दिखाए गए मानचित्रों में चित्रण I http://sourceforge.net/projects/libwlocate/ के कक्षाओं का उपयोग करने की अनुशंसा करते हैं। आईएमएचओ वे कई मानचित्र प्रकारों के लिए हैंडल और समर्थन प्रदान करने के लिए बहुत आसान हैं। – Elmi

+0

यह "google_play_services_rev_3.jar" जेनेरिक, किसी भी प्रोजेक्ट और कॉन्फ़िगरेशन के लिए समान काम होना चाहिए, मुझे लगता है?फतजार के संकेत के लिए धन्यवाद, अब मुझे अपनी परियोजना जेनकिंस सीआई में इस प्रक्रिया के साथ काम कर रही है। – JaakL

+0

@ जैकएल हाँ, यह सामान्य है और आप इसे किसी भी परियोजना पर आयात कर सकते हैं। :) – iliask

उत्तर

5

Play Store से नवीनतम Google Play services डाउनलोड और इंस्टॉल करें। किसी कारण से, मुझे खोज करके यह नहीं मिला। फ़ोल्डर /extras/google/google_play_services/samples/maps फ़ोल्डर में एसडीके से नमूना ऐप चलाकर मुझे अपग्रेड इंस्टॉल करने के लिए कहा गया था और इसे करने के लिए Play Store पर ले जाया गया था।

+0

वे डिफ़ॉल्ट रूप से स्थापित हैं। यह एक वाणिज्यिक (गैर-रूट) एचटीसी फ्लायर है और मूल एचटीसी डिजायर एस में गैप्स इंस्टॉल हैं (और Google Play सेवाएं वहां हैं)। – iliask

+1

आपको नवीनतम संस्करण की आवश्यकता है। आपके द्वारा पोस्ट की गई त्रुटि डिफ़ॉल्ट 'फैक्ट्री स्थापित' संस्करण को संदर्भित करती है। – qubz

+2

मैंने अभी यहां पढ़ा है [http://code.google.com/p/gmaps-api-issues/issues/detail?id=4627#c1 ](http://code.google.com/p/gmaps- एपीआई-मुद्दों/मुद्दों/विवरण? आईडी = 4627 # सी 1) कि एक सक्रिय पृष्ठ पर नया MapFragment जोड़कर अद्यतन को ट्रिगर करेगा। यदि आपके पास पहले से कोई ऐप बनाया गया है तो नमूना ऐप को चलाने के लिए यह आसान हो सकता है। – qubz

15

जैसा कि लिंक के नीचे वर्णित है; http://developer.android.com/google/play-services/setup.html

और यहां इसे ठीक से संभालने के लिए नमूना कोड आता है;

int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext); 
    if (checkGooglePlayServices != ConnectionResult.SUCCESS) { 
    // google play services is missing!!!! 
    /* Returns status code indicating whether there was an error. 
    Can be one of following in ConnectionResult: SUCCESS, SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. 
    */ 
     GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, mActivity, 1122).show(); 
    } 
6

मुझे मेरी परियोजना में एक ही समस्या थी। समाधान बहुत आसान है संभावना है कि ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();null वापस कर सकते हैं। यदि आप null को संभाल लेंगे तो SupportMapFragmentGoogle Play services out of date. त्रुटि को संभाल लेंगे और Google Play सेवा को अपडेट करने के लिए आपको नक्शा स्थानीयकृत संदेश और बटन दिखाएगा, जैसे कि @qubz नमूना प्रोजेक्ट में बता रहा है। नमूना से

कोड:

@Override 
protected void onResume() { 
    super.onResume(); 
    setUpMapIfNeeded(); 
} 

/** 
* Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly 
* installed) and the map has not already been instantiated.. This will ensure that we only ever 
* call {@link #setUpMap()} once when {@link #mMap} is not null. 
* <p> 
* If it isn't installed {@link SupportMapFragment} (and 
* {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to 
* install/update the Google Play services APK on their device. 
* <p> 
* A user can return to this FragmentActivity after following the prompt and correctly 
* installing/updating/enabling the Google Play services. Since the FragmentActivity may not have been 
* completely destroyed during this process (it is likely that it would only be stopped or 
* paused), {@link #onCreate(Bundle)} may not be called again so we should call this method in 
* {@link #onResume()} to guarantee that it will be called. 
*/ 
private void setUpMapIfNeeded() { 
    // Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .getMap(); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 
      setUpMap(); 
     } 
    } 
} 

/** 
* This is where we can add markers or lines, add listeners or move the camera. In this case, we 
* just add a marker near Africa. 
* <p> 
* This should only be called once and when we are sure that {@link #mMap} is not null. 
*/ 
private void setUpMap() { 
    mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
} 

और परिणाम:

enter image description here

दुख की बात प्रलेखन के रूप में

एक GoogleMap केवल getMap() जब अंतर्निहित नक्शे का उपयोग प्राप्त किया जा सकता प्रणाली लोड हो गई है और खंड में अंतर्निहित दृश्य मौजूद है। यह वर्ग स्वचालित रूप से मानचित्र प्रणाली और दृश्य को प्रारंभ करता है; हालांकि जब आप तैयार होंगे तो आपको गारंटी नहीं दी जा सकती क्योंकि यह Google Play सेवाओं एपीके की उपलब्धता पर निर्भर करता है। यदि कोई GoogleMap उपलब्ध नहीं है, तो getMap() शून्य वापस आ जाएगा। SupportMapFragment

+0

थोड़ा उलझन में अद्यतन कैसे कॉल करें मानचित्र एप्लिकेशन के लिए, जैसे कि आप "Google Play सेवा प्राप्त करें" –

+0

@AbdulWahab की कॉल का उल्लेख करते हुए, यदि आप संभावना को संभालेंगे ((SupportMapFragment) getSupportFragmentManager()। findFragmentById (R.id.map))। getMap(); Google Play सेवा लाइब्रेरी को वापस कर सकते हैं, मैपफ्रैगमेंट – Lemberg

+0

हमम के अपडेट स्क्रीन को दिखाएगा, मुझे मिल गया है, अपडेट स्क्रीन Google play service libraya से मूल कॉल है, मैं सोच रहा था, यह getMap() वापस कस्टम अपडेट पर वापस बटन को अपडेट करने के लिए मुझे किस उद्देश्य का विश्लेषण करना है जैसे कि हमारे पास यह है: इरादा व्यूइन्टेंट = नया इरादा ("android.intent.action.VIEW", Uri.parse ("http://www.stackoverflow.com/ ")); प्रारंभ सक्रियता (देखेंइन्टेंट); –

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