繁体   English   中英

另一个Google Maps Fragment问题

[英]Another Google Maps Fragment Issue

我已经有一个多星期的时间了,这个问题在任何尝试调用SupportMapFragment类的'onCreateView'方法的情况下都会导致运行时错误。 由于调试原因,我扩展了SupportMapFragment类。 该应用程序将编译并运行,但是当被告知显示Google地图片段时,立即崩溃,并出现常见的“无法膨胀地图片段”错误。

笔记:

  • 我将SupportMapFragment与FragmentActivity一起使用
  • Google API 10级是目标
  • 发生问题的位置(下面)在SupportMapFragment类代码下的“ return”语句(由于第5个LogCat输出而闻名)
  • 清单文件包含Google Play服务版本的元数据元素
  • 清单文件包含Google Maps V2 API密钥的元数据元素
  • 清单文件包含GLES 2.0版的元数据元素
  • 清单文件包含com.google.android.providers.gfs.permission.READ_GSERVICES权限(尽管LogCat所说)
  • 我已经从SDK Manager下载了Google Play服务
  • Android私有库,Google API [Android2.2.3]和Android依赖项是项目Java Build Path的一部分,并已选中
  • google-play-services_lib是“属性-> Android”中的库
  • 使用Google API级别4.2.2在AVD上运行(并崩溃)
  • 使用Google API级别4.2.2在物理设备上运行(并崩溃)

表现

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

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

<uses-feature 
    android:glEsVersion="0x00020000"
    android:required="true"/>

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

    <!-- Libraries -->
    <uses-library
        android:name="com.google.android.maps"
        android:required="true"/>

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

    <activity 
        android:name=".SoftCryptMapActivity"
        android:label="Map"
        android:enabled="true">
        <intent-filter>
            <action android:name="com.softcrypt.SoftCryptMapActivity"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>

    <!-- Meta Data -->
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/apiKey" />
    <meta-data 
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>

</application>

logcat的

04-30 18:08:30.367: D/SoftCrypt(1555): SoftCryptMapActivity Started
04-30 18:08:30.787: D/dalvikvm(1555): GC_FOR_ALLOC freed 207K, 9% free 3178K/3456K, paused 40ms, total 42ms
04-30 18:08:30.857: I/Google Maps Android API(1555): Google Play services client version: 4323000
04-30 18:08:30.887: I/Google Maps Android API(1555): Google Play services package version: 4323030
04-30 18:08:30.927: D/SoftCrypt(1555): Creating MapFragment...
04-30 18:08:30.967: D/AndroidRuntime(1555): Shutting down VM
04-30 18:08:30.967: W/dalvikvm(1555): threadid=1: thread exiting with uncaught exception (group=0xb3b0dba8)
04-30 18:08:30.987: E/AndroidRuntime(1555): FATAL EXCEPTION: main
04-30 18:08:30.987: E/AndroidRuntime(1555): Process: com.softcrypt, PID: 1555
04-30 18:08:30.987: E/AndroidRuntime(1555): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.softcrypt/com.softcrypt.SoftCryptMapActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.os.Looper.loop(Looper.java:136)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at java.lang.reflect.Method.invoke(Method.java:515)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at dalvik.system.NativeStart.main(Native Method)
04-30 18:08:30.987: E/AndroidRuntime(1555): Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.Activity.setContentView(Activity.java:1929)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.softcrypt.SoftCryptMapActivity.onCreate(SoftCryptMapActivity.java:33)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.Activity.performCreate(Activity.java:5231)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
04-30 18:08:30.987: E/AndroidRuntime(1555):     ... 11 more
04-30 18:08:30.987: E/AndroidRuntime(1555): Caused by: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior:
04-30 18:08:30.987: E/AndroidRuntime(1555): <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
04-30 18:08:30.987: E/AndroidRuntime(1555):     at maps.e.ci.a(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at maps.e.ay.a(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at maps.e.ay.a(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at maps.e.al.a(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at maps.e.bh.a(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at maps.e.bg.a(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at etu.onTransact(SourceFile:107)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.os.Binder.transact(Binder.java:361)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.google.android.gms.maps.SupportMapFragment$a.onCreateView(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.google.android.gms.dynamic.a$4.b(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.google.android.gms.dynamic.a.a(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.google.android.gms.dynamic.a.onCreateView(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at com.softcrypt.SoftCryptMapFragment.onCreateView(SoftCryptMapFragment.java:24)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1093)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1195)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:291)
04-30 18:08:30.987: E/AndroidRuntime(1555):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
04-30 18:08:30.987: E/AndroidRuntime(1555):     ... 21 more

map_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    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"
    android:baselineAligned="false"
    android:orientation="vertical">

<fragment
    android:id="@+id/mapFragment"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:name="com.softcrypt.SoftCryptMapFragment"/>

FragmentActivity子类

public class SoftCryptMapActivity extends FragmentActivity

{

private GoogleMap map;

public void onCreate(Bundle savedInstanceState)

    {
    Log.d(super.getString(R.string.app_name), "SoftCryptMapActivity Started");
    super.onCreate(savedInstanceState);

    // Check for Service Availability
    if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()) != ConnectionResult.SUCCESS)

        {
        Toast.makeText(getBaseContext(), "No Service", Toast.LENGTH_LONG).show();
        finish();
        }

    super.setContentView(R.layout.map_activity);
    Log.d(super.getString(R.string.app_name), "Content View Set");
    map = ((SupportMapFragment)super.getSupportFragmentManager().findFragmentById(R.id.mapFragment)).getMap();

    // Check for Service Availability
    if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()) != ConnectionResult.SUCCESS)

        {
        Toast.makeText(getBaseContext(), "No Service", Toast.LENGTH_LONG).show();
        finish();
        }   

    }

}

SupportMapFragment子类

public class SoftCryptMapFragment extends SupportMapFragment

{

GoogleMap map;
FragmentManager fm;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

    {
    Log.d(super.getString(R.string.app_name), "Creating MapFragment...");
    return super.onCreateView(inflater, container, savedInstanceState);
    }



}

您需要在清单中添加用户权限com.google.android.providers.gsf.permission.READ_GSERVICES ,才能使用MAP API

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

您的崩溃日志清楚地表明了这一点。

Caused by: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM