2012-12-17 194 views
2

我今天的大項目是將我的應用程序遷移到新的Google Maps API V2。但是,現在我似乎無法找到根本原因,所以我遇到了一個錯誤。Android地圖V2崩潰

我的堆棧跟蹤看起來是這樣的:

12-17 17:16:20.366: E/AndroidRuntime(3634): FATAL EXCEPTION: main 
12-17 17:16:20.366: E/AndroidRuntime(3634): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.mobile.barwatch/com.mobile.barwatch.TestActivity}:  android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2088) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.ActivityThread.access$700(ActivityThread.java:139) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.os.Looper.loop(Looper.java:137) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.ActivityThread.main(ActivityThread.java:4918) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at java.lang.reflect.Method.invokeNative(Native Method) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at java.lang.reflect.Method.invoke(Method.java:511) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at dalvik.system.NativeStart.main(Native Method) 
12-17 17:16:20.366: E/AndroidRuntime(3634): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.view.LayoutInflater.inflate(LayoutInflater.java:466) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:306) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.Activity.setContentView(Activity.java:1901) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at com.mobile.barwatch.TestActivity.onCreate(TestActivity.java:18) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.Activity.performCreate(Activity.java:5048) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
12-17 17:16:20.366: E/AndroidRuntime(3634): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  ... 11 more 
12-17 17:16:20.366: E/AndroidRuntime(3634): Caused by: java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at maps.y.z.a(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at maps.y.z.a(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at maps.y.z.a(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at maps.y.ae.a(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at maps.y.bu.a(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at maps.y.p.onCreateView(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at com.google.android.gms.maps.internal.IMapFragmentDelegate$Stub.onTransact(IMapFragmentDelegate.java:107) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at android.os.Binder.transact(Binder.java:326) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at com.google.android.gms.maps.MapFragment$b.onCreateView(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at com.google.android.gms.internal.d$4.a(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at com.google.android.gms.internal.d.a(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at com.google.android.gms.internal.d.onCreateView(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at com.google.android.gms.maps.MapFragment.onCreateView(Unknown Source) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:807) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1013) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1112) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at android.app.Activity.onCreateView(Activity.java:4704) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680) 
12-17 17:16:20.366: E/AndroidRuntime(3634):  ... 20 more 

我的活動類看起來是這樣的:

package com.mobile.barwatch; 

import android.app.Activity; 
import android.os.Bundle; 
import com.google.android.gcm.GCMRegistrar; 
import com.google.android.gms.common.*; 
import com.mobile.barwatch.tasks.*; 
import com.mobile.barwatch.models.Constants; 

public class TestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) {   
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map_screen);    
    } 
} 

我的佈局文件看起來是這樣的:

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

及相關零部件我的清單看起來像這樣:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mobile.barwatch" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="11" 
     android:targetSdkVersion="15" /> 
    <uses-feature 
     android:glEsVersion="0x00020000" 
    android:required="true"/> 
    <permission android:name="com.mobile.barwatch.permission.MAPS_RECEIVE" 
      android:protectionLevel="signature"/> 
    <permission android:name="com.mobile.barwatch.permission.C2D_MESSAGE" 
       android:protectionLevel="signature" />  
    <uses-permission android:name="com.mobile.barwatch.permission.MAPS_RECEIVE"/> 
    <uses-permission android:name="com.mobile.barwatch.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

    <application  
     android:allowBackup="true"  
     android:icon="@drawable/ic_launcher_barwatch" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
    .... 
    <activity android:name="TestActivity" 
       android:label="@string/app_name"> 
    </activity> 
    <meta-data android:name="com.google.android.maps.v2.xx" 
       android:value="xx"/>  
    </application>  
</manifest> 

我真的把我的頭撞在牆上,所以任何幫助將不勝感激。

+1

而你的堆棧跟蹤看起來像? –

+0

@ A - C剛剛添加 – Bobby

+0

'由於:java.lang.RuntimeException:找不到API密鑰。您是否在您的清單中指定了堆棧跟蹤要求的內容? –

回答

6

好的,謝謝A - C和qzikl的回覆,我能夠找出我的問題是什麼。當填寫我的清單,我有:

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

其中xx是我的API密鑰。實際上,它應該是:

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

那麼是什麼原因導致我所有的錯誤是,我是在用我的API密鑰API_KEY填補我在那裏只應該做的價值。

+0

另外,請確保它在元素中。 –

+0

後來我得到了sha1 hash的問題。在谷歌開發者控制檯中更新了api關鍵值並且砰!謝謝。你的解決方案爲我工作。 –

0

堆棧跟蹤包括你的答案:

12-17 17:16:20.366:E/AndroidRuntime(3634):了java.lang.RuntimeException:通過引起了不發現API密鑰。檢查AndroidManifest.xml中的元素

您需要獲取API密鑰並將其包含在清單中。看起來你已經有了一些東西,但也許它被編輯了出來?

+0

我確實添加了一個API密鑰,只是在安全問題中註釋掉了。我試過重新生成一個API密鑰,但沒有骰子 – Bobby

1

你logcat的表現就像另一個錯誤:

12-17 17:16:20.366:E/AndroidRuntime(3634):產生的原因: android.view.InflateException:二進制XML文件行#2:錯誤 充氣類片段

,它是所有問題的線索。正如你看到包含在「類」中的表達錯誤,但在這一刻我不知道解決方案。

+0

該問題是由錯誤的com.google.android.gms.maps實現引起的。MapFragment到你的應用程序項目。要正確顯示地圖,您必須從android示例添加外部jar文件包含帶有api v2的地圖。 – Lllio