二进制 XML 文件第14行:膨胀类片段错误 - 地图 v2

3
我想使用以下示例,但当我启动它时,会出现以下错误:

示例链接:

http://wptrafficanalyzer.in/blog/driving-distance-and-travel-time-duration-between-two-locations-in-google-map-android-api-v2/

> 09-03 12:46:33.936: E/AndroidRuntime(15207): FATAL EXCEPTION: main
> 09-03 12:46:33.936: E/AndroidRuntime(15207):
> java.lang.RuntimeException: Unable to start activity
> ComponentInfo{in.wptrafficanalyzer.locationdistancetimemapv2/in.wptrafficanalyzer.locationdistancetimemapv2.MainActivity}:
> android.view.InflateException: Binary XML file line #14: Error
> inflating class fragment 09-03 12:46:33.936: E/AndroidRuntime(15207):
>   at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.app.ActivityThread.access$700(ActivityThread.java:152) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.os.Handler.dispatchMessage(Handler.java:99) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> android.os.Looper.loop(Looper.java:137) 09-03 12:46:33.936:
> E/AndroidRuntime(15207):  at
> android.app.ActivityThread.main(ActivityThread.java:5328) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> java.lang.reflect.Method.invokeNative(Native Method) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> java.lang.reflect.Method.invoke(Method.java:511) 09-03 12:46:33.936:
> E/AndroidRuntime(15207):  at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> dalvik.system.NativeStart.main(Native Method) 09-03 12:46:33.936:
> E/AndroidRuntime(15207): Caused by: android.view.InflateException:
> Binary XML file line #14: Error inflating class fragment 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> android.view.LayoutInflater.inflate(LayoutInflater.java:495) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> android.view.LayoutInflater.inflate(LayoutInflater.java:397) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> android.view.LayoutInflater.inflate(LayoutInflater.java:353) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:327)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.app.Activity.setContentView(Activity.java:1928) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> in.wptrafficanalyzer.locationdistancetimemapv2.MainActivity.onCreate(MainActivity.java:42)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.app.Activity.performCreate(Activity.java:5250) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  ... 11 more 09-03
> 12:46:33.936: E/AndroidRuntime(15207): Caused by:
> java.lang.IllegalStateException: The meta-data tag in your app's
> AndroidManifest.xml does not have the right value.  Expected 5089000
> but found 0.  You must have the following declaration within the
> <application> element:     <meta-data
> android:name="com.google.android.gms.version"
> android:value="@integer/google_play_services_version" /> 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> com.google.android.gms.common.GooglePlayServicesUtil.A(Unknown Source)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(Unknown
> Source) 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> com.google.android.gms.maps.internal.u.I(Unknown Source) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> com.google.android.gms.maps.internal.u.H(Unknown Source) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> com.google.android.gms.maps.SupportMapFragment$b.jz(Unknown Source)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> com.google.android.gms.maps.SupportMapFragment$b.a(Unknown Source)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> com.google.android.gms.dynamic.a.a(Unknown Source) 09-03 12:46:33.936:
> E/AndroidRuntime(15207):  at
> com.google.android.gms.dynamic.a.onInflate(Unknown Source) 09-03
> 12:46:33.936: E/AndroidRuntime(15207):    at
> com.google.android.gms.maps.SupportMapFragment.onInflate(Unknown
> Source) 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:279)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  at
> android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:682)
> 09-03 12:46:33.936: E/AndroidRuntime(15207):  ... 21 more

在我的布局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=".MainActivity" >

    <TextView
        android:id="@+id/tv_distance_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" 
        android:layout_alignParentTop="true" />

    <fragment 
        android:id="@+id/map"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"        
        class="com.google.android.gms.maps.SupportMapFragment" 
        android:layout_below="@id/tv_distance_time" />    

</RelativeLayout>

在MainActivity中:

 SupportMapFragment fm =
 (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

我的 manifest.xml :

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

    <permission
        android:name="info.androidhive.googlemapsv2.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="info.androidhive.googlemapsv2.permission.MAPS_RECEIVE" />

    <uses-sdk
        android:minSdkVersion="12"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <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.WRITE_EXTERNAL_STORAGE" />

    <!-- Required to show current location -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!-- Required OpenGL ES 2.0. for Maps V2 -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <!-- Requires OpenGL ES version 2 -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <activity
            android:name="info.androidhive.googlemapsv2.MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppBaseTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <!-- Goolge API Key -->
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyBZ*****9p6wksdax4TEjDVLgo" />
    </application>

</manifest>

更新:

我在manifest.xml中添加了以下代码:

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" /> 

我把片段元素从以下内容进行了更改:

<fragment 
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"        
    class="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_below="@id/tv_distance_time" />

到:

 <fragment
    android:name="com.google.android.gms.maps.SupportMapFragment"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/tv_distance_time"/> 

我的项目能够运行,但是我在屏幕上看不到任何地图。(我已经在真实设备上测试过了)。

09-03 14:17:26.206: E/dalvikvm(8462): Could not find class 'gpq', referenced from method gpr.a
09-03 14:17:26.206: E/dalvikvm(8462): Could not find class 'gpq', referenced from method gpr.a
09-03 14:17:26.206: E/dalvikvm(8462): Could not find class 'gpq', referenced from method gpr.a
09-03 14:17:26.776: E/dalvikvm(8462): Could not find class 'com.google.android.gms.location.internal.ParcelableGeofence', referenced from method gls.a
09-03 14:17:43.591: E/Google Maps Android API(8462): Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors).

添加了我的 manifest.xml。 - S.M_Emamian
你是否已经链接了所需的 .jar 包? - bhargavg
可能是重复问题 Android:从活动中打开googleMaps - williamj949
请查看我的回答 @S.M_Emamian - GrIsHu
请确保在您的项目中添加了支持库,因为您正在使用低于11的API级别。 - GrIsHu
3个回答

3

你需要在布局文件中更改fragment,步骤如下:

<fragment 
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"        
    class="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_below="@id/tv_distance_time" />   

致:

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

仔细看一下这两者之间的区别:class="com.google.android.gms.maps.SupportMapFragment" 和:
android:name="com.google.android.gms.maps.SupportMapFragment"

请查看我在这个话题上写的博客文章,并确保你没有遗漏任何内容,比如你在 Manifest xml 文件中遗漏的 mata-data 部分,这一点从你接收到的错误中可以清楚地看出:

Google 地图 API V2 指南

更新:

你的清单文件中有一个重复的权限:

<!-- Required OpenGL ES 2.0. for Maps V2 -->
<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<!-- Requires OpenGL ES version 2 -->
<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

你需要移除它们中的一个。既然你的应用程序是针对API 11及以上版本编写的,因此没有理由使用SupportMapFragment。所以只需改用MapFragment并对Activity进行相关更改即可。


问题已解决,但我在屏幕上看不到任何地图。(我已在真实设备上测试过) - S.M_Emamian
你看过我所有的博客文章了吗? - Emil Adz

1

你在清单文件中缺少这个 meta 标签:

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

很明显错误信息中已经说明了:


> java.lang.IllegalStateException: The meta-data tag in your app's
> AndroidManifest.xml does not have the right value.  Expected 5089000
> but found 0.  You must have the following declaration within the
> <application> element:     <meta-data
> android:name="com.google.android.gms.version"
> android:value="@integer/google_play_services_version" /> 09-03

0

只需在<application>标签内的AndroidManifest.xml文件中添加以下行:

<meta-data
 android:name="com.google.android.gms.version"
 android:value="@integer/google_play_services_version" />

如果您想获取GoogleMap,则可以按照以下方式初始化以访问它并在应用程序中加载它。
更改您下面的代码行:
SupportMapFragment fm =
 (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

private GoogleMap mMap;
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();

发布一个已经在5分钟前发布过的答案有什么意义呢? - Emil Adz
不是我的答案,@user3249477 在你之前5分钟就已经指出了这个解决方案。而且实际上我的答案也包含在内。如果您访问博客,可以了解更多细节。但这与您发布已经写过的答案无关。 - Emil Adz
尝试使用 mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 获取地图,可以查看我的答案。 - GrIsHu
这与他在屏幕上看不到地图无关。 - Emil Adz
请在您的问题中发布您的错误 @S.M_Emamian - GrIsHu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接