Google Map API 问题:android.view.InflateException:二进制 XML 文件第 2 行:二进制 XML 文件第 2 行:膨胀类片段时出错

Posted

技术标签:

【中文标题】Google Map API 问题:android.view.InflateException:二进制 XML 文件第 2 行:二进制 XML 文件第 2 行:膨胀类片段时出错【英文标题】:Google Map API issue : android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment 【发布时间】:2016-12-12 19:57:11 【问题描述】:

当我尝试将 google map api 用于我的一个 android 应用程序时,我总是看到这个错误。我发现许多类似类型的问题,但没有一个答案适合我。

这是我看到的错误:

块引用 08-06 19:31:47.606 2602-2602/com.example.ank.mymap E/AndroidRuntime: 致命异常: main 进程:com.example.ank.mymap,PID:2602 java.lang.RuntimeException:无法启动活动 ComponentInfocom.example.ank.mymap/com.example.ank.mymap.MainActivity:android.view.InflateException:二进制 XML 文件第 2 行:二进制 XML 文件第 2 行: 膨胀类片段时出错 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:android.view.InflateException:二进制 XML 文件第 2 行:二进制 XML 文件第 2 行:膨胀类片段时出错 在 android.view.LayoutInflater.inflate(LayoutInflater.java:539) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:374) 在 com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 在 android.app.Activity.setContentView(Activity.java:2166) 在 com.example.ank.mymap.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6237) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:android.view.InflateException:二进制 XML 文件第 2 行:膨胀类片段时出错 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:374) 在 com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 在 android.app.Activity.setContentView(Activity.java:2166) 在 com.example.ank.mymap.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6237) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:java.lang.RuntimeException:未找到 API 密钥。检查它是否在 AndroidManifest.xml 的元素中 在 maps.y.k.a(未知来源) 在 maps.v.c.a(未知来源) 在 com.google.android.gms.maps.internal.CreatorImpl.b(未知来源) 在 com.google.android.gms.maps.internal.CreatorImpl.newMapFragmentDelegate(未知来源) 在 vl.onTransact(:com.google.android.gms.DynamiteModulesB:62) 在 android.os.Binder.transact(Binder.java:387) 在 qle.newMapFragmentDelegate(:com.google.android.gms:179) 在 com.google.android.gms.maps.internal.CreatorImpl.newMapFragmentDelegate(:com.google.android.gms:101) 在 qld.onTransact(:com.google.android.gms:62) 在 android.os.Binder.transact(Binder.java:387) 在 com.google.android.gms.maps.internal.zzc$zza$zza.zzag(未知来源) 在 com.google.android.gms.maps.MapFragment$zzb.zzbow(未知来源) 在 com.google.android.gms.maps.MapFragment$zzb.zza(未知来源) 在 com.google.android.gms.dynamic.zza.zza(未知来源) 在 com.google.android.gms.dynamic.zza.onInflate(未知来源) 在 com.google.android.gms.maps.MapFragment.onInflate(未知来源) 在 android.app.Fragment.onInflate(Fragment.java:1359) 在 android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2200) 在 android.app.FragmentController.onCreateView(FragmentController.java:98) 在 android.app.Activity.onCreateView(Activity.java:5546) 在 android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:36) 在 android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:754) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:492) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:374) 在 com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 在 android.app.Activity.setContentView(Activity.java:2166) 在 com.example.ank.mymap.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6237) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在 android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 块引用

MainActivity.java

// all the import statements 

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.GoogleMap;

 //public class MainActivity extends AppCompatActivity 
 public class MainActivity extends FragmentActivity 

    GoogleMap mMap;
    private  static final  int ERROR_DIALOG_REQUEST = 9001;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        if(servicesOK()) 
            //setContentView(R.layout.activity_main);
            setContentView(R.layout.activity_map);
            Toast.makeText(this, "Ready to map!", Toast.LENGTH_SHORT).show();
         else 
            setContentView(R.layout.activity_main);
        
    
    public boolean servicesOK() 

        int isAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

        if (isAvailable == ConnectionResult.SUCCESS) 
            return true;
         else if (GooglePlayServicesUtil.isUserRecoverableError(isAvailable)) 
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isAvailable, this, ERROR_DIALOG_REQUEST);
            dialog.show();
         else 
            Toast.makeText(this, "Can't connect to mapping service", Toast.LENGTH_SHORT).show();
        

        return false;
    

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.aveekadhya.mymap.MainActivity">

    <TextView
        android:layout_
        android:layout_
        android:text="Hello World!" />
</RelativeLayout>

activity_map.xml

    <?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:map="http://schemas.android.com/apk/res-auto"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.MapFragment"
    android:layout_
    android:layout_ />

AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.aveekadhya.mymap">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

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

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

目标SDK和最小SDK如下: minSdkVersion 16 targetSdkVersion 24

不知道我做错了什么。任何建议表示赞赏。我在基于 Android Studio 2.1.2 的模拟器上运行。

【问题讨论】:

java.lang.RuntimeException: API key not found. Check that is in the element of AndroidManifest.xml at maps.. 你确定你在清单中包含了谷歌地图 api 密钥吗? 是的,它存在于 AndroidManifest.xml 文件中。有没有办法检查密钥是否有效? 您是否尝试在 activity_map 中将 android:name="com.google.android.gms.maps.MapFragment" 更改为 android:name="com.google.android.gms.maps.SupportMapFragment" .xml 是的,我尝试修改为“android:name="com.google.android.gms.maps.SupportMapFragment"。但我得到了同样的错误。 【参考方案1】:

Android Studio 报错:

原因:java.lang.RuntimeException:未找到 API 密钥。检查 在元素中 AndroidManifest.xml

感谢 much-overflow 指出这一点。 实际的问题是我在 AndroidManifest.xml 的元素之外声明了 google map api 键。 一旦我将它剪切粘贴到元素中,它就可以正常工作了。

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyCU....." />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

感谢大家的宝贵时间。

【讨论】:

以上是关于Google Map API 问题:android.view.InflateException:二进制 XML 文件第 2 行:二进制 XML 文件第 2 行:膨胀类片段时出错的主要内容,如果未能解决你的问题,请参考以下文章

捕获 Google Map Android API V2 的屏幕截图

如何在现有较旧的 android 项目中使用最新 API 添加 Google Map?

捕获 Google Map Android API V2 的屏幕截图

如何在 Google Map Api V2 Android 中搜索?

使用google map direction api android计算两个位置之间的距离

Google Developer 控制台“Google Map Android API V2”选项未查看启用