8

我正在嘗試使用Google Maps API v2構建應用程序,但事情是,應用程序一直在給我強制關閉,儘管我遵循了所有必需的說明。Google Maps API v2無法正常工作

這裏是Android部分

import android.support.v4.app.FragmentActivity; 
import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 

public class GPSonMap extends FragmentActivity{ 

MapView map; 
MapController controller; 
LocationManager locationManager; 
LocationListener listener; 
PendingIntent pendingIntent ; 
Criteria criteria; 
MapOverlay overlay; 


@Override 
public void onCreate(Bundle onsaved) 
{ 
    super.onCreate(onsaved); 
    setContentView(R.layout.map); 
    Log.d("", "entered"); 


    map = (MapView)findViewById(R.id.mapView); 
    } 

這裏是XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MapsActivity" > 

<fragment 

    class="com.google.android.gms.maps.SupportMapFragment" 
    android:id="@+id/mapView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
/> 

</RelativeLayout> 

,這是我的清單

 <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.bachelor.bond" 
     android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
      android:minSdkVersion="14" 
      android:targetSdkVersion="17" /> 
     <!-- <permission 
       android:name="com.example.example.permission.MAPS_RECEIVE" 
       android:protectionLevel="signature"/> 
      <uses-permission android:name="com.bachelor.bond.permission.MAPS_RECEIVE"/>. --> 

      <uses-permission android:name="android.permission.INTERNET" /> 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
     <permission android:name="com.example.example.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
    <uses-permission android:name="com.example.example.permission.C2D_MESSAGE" /> 

    <!-- App receives GCM messages. --> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <!-- GCM connects to Google Services. --> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
     <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <!-- GCM requires a Google account. --> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <!-- Keeps the processor from sleeping when a message is received. --> 
    <uses-permission android:name="android.permission.WAKE_LOCK" 
     /> 
    <uses-permission android:name="com.example.example.permission.MAPS_RECEIVE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <!-- Permission to vibrate --> 
     <uses-permission android:name="android.permission.VIBRATE"/> 
     <uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION"/> 

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

     <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true"/> 
     <application 
      android:allowBackup="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name"> 
      <uses-library android:name="com.google.android.maps" /> 
      <activity 
       android:name=".GPSonMap" 
       android:label="@string/app_name" 
       > <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 

      </activity> 

      <uses-library android:name="com.google.android.maps" /> 
      <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
     <category android:name="com.example.example" /> 
     </intent-filter> 
       <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" 
       android:permission="com.google.android.c2dm.permission.SEND" > 

    </receiver> 
    <service android:name=".GCMIntentService" /> 
    <activity android:name="Login"></activity> 

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

     </application> 

    </manifest> 

和日誌貓輸出

02-15 00:42:35.257: E/AndroidRuntime(2693): FATAL EXCEPTION: main 
02-15 00:42:35.257: E/AndroidRuntime(2693): java.lang.RuntimeException: Unable to start   activity ComponentInfo{com.bachelor.bond/com.dxample.example.GPSonMap}:  android.view.InflateException: Binary XML file line #7: Error inflating class fragment 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.os.Looper.loop(Looper.java:137) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at dalvik.system.NativeStart.main(Native Method) 
02-15 00:42:35.257: E/AndroidRuntime(2693): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.Activity.setContentView(Activity.java:1881) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at com.bachelor.bond.GPSonMap.onCreate(GPSonMap.java:54) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.Activity.performCreate(Activity.java:5104) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  ... 11 more 
02-15 00:42:35.257: E/AndroidRuntime(2693): Caused by:   android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment  com.google.android.gms.maps.SupportMapFragment: make sure class name exists, is public, and  has an empty constructor that is public 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.support.v4.app.Fragment.instantiate(Fragment.java:401) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.support.v4.app.Fragment.instantiate(Fragment.java:369) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  ... 21 more 
02-15 00:42:35.257: E/AndroidRuntime(2693): Caused by: java.lang.ClassNotFoundException:  Didn't find class "com.google.android.gms.maps.SupportMapFragment" on path:  /system/framework/com.google.android.maps.jar:/data/app/com.bachelor.bond-1.apk 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  at android.support.v4.app.Fragment.instantiate(Fragment.java:391) 
02-15 00:42:35.257: E/AndroidRuntime(2693):  ... 24 more 
0123其他

一個問題,我面對的是,當我嘗試
import com.google.android.gms.maps.MapFragment; 它給出了它不承認一個包的名字com.google.android.gms,所以我不能甚至使用例如GoogleMapMapFragment錯誤。

那麼,有沒有人有任何解決這兩個問題?

回答

3

大概您沒有將對Google Play服務庫項目的引用添加到您的應用程序項目中。請參閱the Google Play Services SDK documentation,特別是標題爲「設置項目以使用Google Play服務SDK」的部分。

+0

這可能是如此愚蠢,但我真的不知道如何着手。我把源代碼轉換成文件夾**的Google Play-services_lib **但是當我從屬性=> Android的導入這個庫,那裏什麼也沒有,我來導入,當我運行應用程序一次,同樣的問題依然存在。 – 2013-02-15 01:34:45

+0

@omar:「我把源代碼轉換成文件夾谷歌播放-services_lib」 - 我不知道你指的是在這裏。將'google-play-services_lib'項目導入到Eclipse中,然後從Project> Properties> Android> Libraries添加對它的引用。 – CommonsWare 2013-02-15 01:38:01

+0

是的,這是很好的,但是當到達一個引用到它,當我點擊「添加」按鈕,將顯示一個空列表。 – 2013-02-15 02:19:22

3

我發現你錯過了代碼中的幾件事。

答案1:您的GPSonMAP.java必須像下面那樣修改;

public class GPSonMap extends android.support.v4.app.FragmentActivity{ 
GoogleMap googlemap; // "MapView map;" is wrong 
//MapController controller; ==> it was depreciated. 
LocationManager locationManager; 
LocationListener listener; 
PendingIntent pendingIntent ; 
Criteria criteria; 
//MapOverlay overlay; ==> it was depreciated. 
SupportMapFragment fm; // add this 


@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map); 
     Log.d("", "entered"); 


    //map = (MapView)findViewById(R.id.mapView); ==> delete it. 

    fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView); 
    googleMap = fm.getMap(); 
    } 


} 

修改上述,按下 「Ctrl + SHFT +(字母)O」和一些所需的類之後將被導入。

回答2:您的佈局中的xml文件必須像下面一樣修改;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".GPSonMap" > 

您的MainActivity不是MapsActivity,而是GPSonMap。

回答3:您的清單文件與您的軟件包名稱與清單文件中描述的軟件包名稱不匹配。請將包名與相同的名稱匹配。

將「com.example.example」修改爲您的軟件包名稱。

複製並粘貼一些代碼後,您至少要檢查包名和類名。

8

如何在Android上通過Google Maps API v2顯示Google地圖。

注意的是所有2箱子被設置谷歌播放服務和清單文件,包括一些權限和API密鑰所需。

1.顯示谷歌地圖中(支持)片段。

main.xml中

<?xml version="1.0" encoding="utf-8"?> 

<!-- This can go anywhere in your layout (see other demos for some examples). --> 
<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.SupportMapFragment"/> 

MainActivity.java

/** 
* This shows how to create a simple activity with a map and a marker on the map. 
* <p> 
* Notice how we deal with the possibility that the Google Play services APK is not 
* installed/enabled/updated on a user's device. 
*/ 
public class BasicMapActivity extends android.support.v4.app.FragmentActivity { 
    /** 
    * Note that this may be null if the Google Play services APK is not available. 
    */ 
    private GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setUpMapIfNeeded(); 
    } 

    @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 Activity after following the prompt and correctly 
    * installing/updating/enabling the Google Play services. Since the Activity 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")); 
    } 
} 

2.在(支援)片段顯示MapView類。

main.xml中

<?xml version="1.0" encoding="utf-8"?> 

<!-- This can go anywhere in your layout. --> 
<com.google.android.gms.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

MainActivity.java

/** 
* This shows how to create a simple activity with a raw MapView and add a marker to it. This 
* requires forwarding all the important lifecycle methods onto MapView. 
*/ 
public class RawMapViewDemoActivity extends android.support.v4.app.FragmentActivity { 
    private MapView mMapView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mMapView = (MapView) findViewById(R.id.map); 
     mMapView.onCreate(savedInstanceState); 


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mMapView.onResume(); 


    } 



    @Override 
    protected void onPause() { 
     mMapView.onPause(); 
     super.onPause(); 
    } 

    @Override 
    protected void onDestroy() { 
     mMapView.onDestroy(); 
     super.onDestroy(); 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     mMapView.onLowMemory(); 
    } 


} 
+0

拜託,你能解釋一下我必須在Java Build Path中檢查哪些依賴項嗎? – 2015-03-16 15:58:51

0

我有這個問題,是在浪費時間(超過1.5天頭髮拉挫折)。然後,我觀看了一段YouTube視頻,該視頻正在執行無聊的步驟,將Google Play服務添加到應用中。那麼,在從sdk管理器添加SDK後的視頻中,他們使用Eclipse「檢查更新」。那小小的魔力就出來了,下載了一個SDK管理器不能做的jar文件!他們確實需要在說明中加入這些內容,併爲人們省去沮喪。我很想從我的應用程序中刪除Google地圖。我使用1.0,我需要更新到2.0或溝渠地圖。

相關問題