How to implement Google Maps new version of API v2

2019-03-19 08:05发布

问题:

Hi every one I came to know that google maps has deprecated its previous version API v1 and introduced a new version of google maps API v2. I tried out one example by following some links in google any how i am pretty sure that i got the api key correctly by providing the exact hash key code and managed to get the correct api key. Now i managed to write some code as well but when i tried to execute the code i am getting the errors please help me to solve this here is my code

and i even tried the sample codes provided by google play services an i got the same problem

this is the sample that i have done by referring some links in google

main activity class

package com.example.apv;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import android.os.Bundle;
import android.app.Activity;
import android.app.FragmentManager;

public class MainActivity extends Activity 
{
     @Override  
     protected void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);  
         setContentView(R.layout.main);  

     FragmentManager fragmentManager = getFragmentManager();  
     MapFragment mapFragment = (MapFragment)fragmentManager.findFragmentById(R.id.map);  
     GoogleMap googleMap = mapFragment.getMap();  
     LatLng sfLatLng = new LatLng(37.7750, -122.4183);  
     googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);  
     googleMap.addMarker(new MarkerOptions().position(sfLatLng).title("San Francisco")
                .snippet("Population: 776733")
            .icon(BitmapDescriptorFactory.defaultMarker(
     BitmapDescriptorFactory.HUE_AZURE)));
     googleMap.getUiSettings().setCompassEnabled(true);  
     googleMap.getUiSettings().setZoomControlsEnabled(true);  
     googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(sfLatLng, 10))

        }  
}  

main.xml

                       <?xml version="1.0" encoding="utf-8"?>  
                <fragment xmlns:android="http://schemas.android.com/apk/res/android"  
                          android:id="@+id/map"  
                              android:layout_width="match_parent"  
                                  android:layout_height="match_parent"  
                               class="com.google.android.gms.maps.MapFragment"/>  

and finally my manifest file

                           <?xml version="1.0" encoding="utf-8"?>  
                 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
                               package="com.example.apv"  
                              android:versionCode="1"  
                               android:versionName="1.0" >  
                  <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/>  

                             <permission  
                     android:name="com.codebybrian.mapsample.permission.MAPS_RECEIVE"  
                                     android:protectionLevel="signature"/>  


                                     <!--Required permissions-->   

            permission oid:name="com.codebybrian.mapsample.permission.MAPS_RECEIVE"/>  

              <!--Used by the API to download map tiles from Google Maps servers: -->  
                 <uses-permission android:name="android.permission.INTERNET"/>  

                   <!--Allows the API to access Google web-based services: -->  
                <uses-permission   
         android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>  

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


                    <!--Optional permissions-->  
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  

        <!--Version 2 of the Google Maps Android API requires OpenGL ES version 2 -->  
                <uses-feature  
                        android:glEsVersion="0x00020000"    
                          android:required="true"/>  

     application android:label="@string/app_name" android:icon="@drawable/ic_launcher">

                 <activity android:name=".MyMapActivity"  
                         android:label="@string/app_name"   
                             >   
                          <intent-filter>  
                      <action android:name="android.intent.action.MAIN"/>  
                         <category android:name="android.intent.category.LAUNCHER"/>  
                              </intent-filter>  
                             </activity>  

                           <meta-data  
                             android:name="com.google.android.maps.v2.API_KEY"  
                             android:value="AZzaSSsBmhi4dXoKSylGGmjkQ5Jev9UdAJBjk"/>  
                            </application>  


                          </manifest>  

i run my application in emulator of version 4.2 and api level of 17 i got following error

12-17 10:06:52.590: E/Trace(826): error opening trace file: No such file or directory (2)  
12-17 10:06:52.590: W/Trace(826): Unexpected value from nativeGetEnabledTags: 0  
12-17 10:06:52.590: W/Trace(826): Unexpected value from nativeGetEnabledTags: 0  
12-17 10:06:52.590: W/Trace(826): Unexpected value from nativeGetEnabledTags: 0  
12-17 10:06:52.680: I/ActivityThread(826): Pub   com.google.android.gms.plus;com.google.android.gms.plus.action:   com.google.android.gms.plus.provider.PlusProvider  
12-17 10:06:52.740: W/Trace(826): Unexpected value from nativeGetEnabledTags: 0   
12-17 10:06:52.740: W/Trace(826): Unexpected value from nativeGetEnabledTags: 0  
12-17 10:06:52.760: W/Trace(826): Unexpected value from nativeGetEnabledTags: 0 

later i came to know that these version cant execute in emulator so i tried executing it with two devices one is Sony xperia u of android version 2.3.7 and Samsung galaxy tab of android version 4.1.1 and these are my outputs

   12-17 16:24:48.965: I/dalvikvm(9088): Could not find method     com.example.apv.MainActivity.getFragmentManager, referenced from method com.example.apv.MainActivity.onCreate
  12-17 16:24:48.965: W/dalvikvm(9088): VFY: unable to resolve virtual method 3460:   Lcom/example/apv/MainActivity;.getFragmentManager ()Landroid/app/FragmentManager;
   12-17 16:24:48.965: D/dalvikvm(9088): VFY: replacing opcode 0x6e at 0x0009
   12-17 16:24:48.965: D/dalvikvm(9088): VFY: dead code 0x000c-0065 in Lcom/example /apv/MainActivity;.onCreate (Landroid/os/Bundle;)V
        12-17 16:24:49.066: D/AndroidRuntime(9088): Shutting down VM
    12-17 16:24:49.066: W/dalvikvm(9088): threadid=1: thread exiting with uncaught exception (group=0x4001d578)
      12-17 16:24:49.086: E/AndroidRuntime(9088): FATAL EXCEPTION: main
      12-17 16:24:49.086: E/AndroidRuntime(9088): java.lang.RuntimeException: Unable  to start activity ComponentInfo{com.example.apv/com.example.apv.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
         12-17 16:24:49.086: E/AndroidRuntime(9088):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
              12-17 16:24:49.086: E/AndroidRuntime(9088):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
           12-17 16:24:49.086: E/AndroidRuntime(9088):  at android.app.ActivityThread.access$1500(ActivityThread.java:121)
           12-17 16:24:49.086: E/AndroidRuntime(9088):  at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
           12-17 16:24:49.086: E/AndroidRuntime(9088):  at android.os.Handler.dispatchMessage(Handler.java:99)
           12-17 16:24:49.086: E/AndroidRuntime(9088):  at android.os.Looper.loop(Looper.java:138)
          12-17 16:24:49.086: E/AndroidRuntime(9088):   at android.app.ActivityThread.main(ActivityThread.java:3701)
          12-17 16:24:49.086: E/AndroidRuntime(9088):   at java.lang.reflect.Method.invokeNative(Native Method)
         12-17 16:24:49.086: E/AndroidRuntime(9088):    at java.lang.reflect.Method.invoke(Method.java:507)
            12-17 16:24:49.086: E/AndroidRuntime(9088):     at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
           12-17 16:24:49.086: E/AndroidRuntime(9088):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
             12-17 16:24:49.086: E/AndroidRuntime(9088):    at  dalvik.system.NativeStart.main(Native Method)
            12-17 16:24:49.086: E/AndroidRuntime(9088): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
             12-17 16:24:49.086: E/AndroidRuntime(9088):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
              12-17 16:24:49.086: E/AndroidRuntime(9088):   at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
              12-17 16:24:49.086: E/AndroidRuntime(9088):   at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
               12-17 16:24:49.086: E/AndroidRuntime(9088):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
                 12-17 16:24:49.086: E/AndroidRuntime(9088):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
               12-17 16:24:49.086: E/AndroidRuntime(9088):  at android.app.Activity.setContentView(Activity.java:1657)
              12-17 16:24:49.086: E/AndroidRuntime(9088):   at com.example.apv.MainActivity.onCreate(MainActivity.java:20)
               12-17 16:24:49.086: E/AndroidRuntime(9088):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
                 12-17 16:24:49.086: E/AndroidRuntime(9088):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
                   12-17 16:24:49.086: E/AndroidRuntime(9088):  ... 11 more
             12-17 16:24:49.086: E/AndroidRuntime(9088): Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/com.example.apv-1.apk]
              12-17 16:24:49.086: E/AndroidRuntime(9088):   at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
               12-17 16:24:49.086: E/AndroidRuntime(9088):  at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
                12-17 16:24:49.086: E/AndroidRuntime(9088):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                  12-17 16:24:49.086: E/AndroidRuntime(9088):   at android.view.LayoutInflater.createView(LayoutInflater.java:471)
                  12-17 16:24:49.086: E/AndroidRuntime(9088):   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:549)
                 12-17 16:24:49.086: E/AndroidRuntime(9088):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
                12-17 16:24:49.086: E/AndroidRuntime(9088):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
                   12-17 16:24:49.086: E/AndroidRuntime(9088):  ... 19 more

could any one please suggest me to how to get this done and give me some links of new version API v2 tutorials of google maps and some examples links please help me

回答1:

Following this guide found on a similar post may be able to help, you need to install 2 .apk files. Source: http://nemanjakovacevic.net/blog/2012/12/how-to-make-android-google-maps-v2-work-in-android-emulator/



回答2:

Be sure to name your main activity as you declare it in manifest:

Caused by: java.lang.ClassNotFoundException: com.example.apv.MyMapActivity

Maybe a package naming issue? Post your entire MyMapActivity, not only the onCreate.



回答3:

Project properties -> Android -> Add... under Library and pick the google-play-services_lib that you added as a library project earlier according to these instructions:

https://developers.google.com/maps/documentation/android/intro



回答4:

The code you provided contains errors. Your activity name is MainActivity but in the manifest file, the only activity you declared has the name MyMapActivity. Also your manifest file doesn't have a opening application tag.

Correcting these two errors, I've run your code and got the exception you mentioned. I fixed the problem by adding the google-play-services library project. I think you forgot to add this or it's not correctly added. You can find details on it in the developer doc of google map v2.

To check this, right click on your project and go to properties. Then select Android from left. At the bottom of this page, you'll find the library projects table. Make sure the google-play-services library project is in the list and have a green mark. If it's not there, add it by clicking the right "Add.." button.

Sometimes, eclipse fails to add library project which is not in the same workspace of your project. If this is your case, keep the google-play-services and your project in the same workspace and then try again.



回答5:

check out this youtube tutorial video. It is for beginners and will help you in creating a simple Google Maps V2 app from scratch youtube link. And as far as running Google Maps V2 on eclipse emulator is concerned see this answer Running Google Maps v2 on emulator



回答6:

If you want to use fragments then your activity i.e your MainActivity should extend FragmentActivity