【问题标题】:Google map android api v2 application crashes谷歌地图 android api v2 应用程序崩溃
【发布时间】:2012-11-27 14:56:40
【问题描述】:

我正在使用 Eclipse helios 和 Android 4.1.2 我遵循了以下文档https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw 并完全按照教程中的描述完成了编码。当我在模拟器上运行我的应用程序时,它显示“除非您更新 google play 服务,否则此应用程序不会运行”,但在索尼 xperia 的真实设备上具有谷歌播放服务更新版本与“应用程序已停止工作”崩溃。感谢任何帮助。

这是我的清单

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


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

      <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_CORSE_LOCATION" />

    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
     <permission
         android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"
         android:protectionLevel="signature"/>
<uses-permission  android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<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="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

         <uses-library android:name="com.google.android.maps"/>
        <activity
            android:name="com.example.emeterfinalapp.EmeterMainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:theme="@style/FullscreenTheme" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.emeterfinalapp.EnterLocationActivity"
            android:label="@string/title_activity_enter_location"
            android:parentActivityName="com.example.emeterfinalapp.EmeterMainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.emeterfinalapp.EmeterMainActivity" />
        </activity>

        <activity
            android:name="com.example.emeterfinalapp.SelectLocation"
            android:label="@string/title_activity_select_location"
            android:parentActivityName="com.example.emeterfinalapp.EnterMainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.emeterfinalapp.EnterMainActivity" />


         </activity>
        </application>
 <meta-data
   android:name="com.google.android.maps.v2.API_KEY"
   android:value="my api key"/>
    </manifest>

这是我的 main.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=".SelectLocation" >

    <Button
        android:id="@+id/satellite_button"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/mapview_button"
        android:text="@string/satellitebuttontext" />


        <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"
         android:layout_below="@+id/satellite_button"/>


        <LinearLayout android:id="@+id/zoom" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_centerHorizontal="true" 
        />

        <Button
            android:id="@+id/mapview_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="@string/mapbuttontext" />

</RelativeLayout>

这是我的活动

    package com.example.emeterfinalapp;

        import android.os.Bundle;
        import android.support.v4.app.FragmentActivity;

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

        public class SelectLocation extends FragmentActivity  {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_location);
        // Show the Up button in the action bar.
        getActionBar().setDisplayHomeAsUpEnabled(true);
                                           GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

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

    }


}

我在我的项目中提供了 google_play_services 库的引用,在我的库中添加了 google_play_service 和 android.support.v4 jar 文件....如果我仍然遗漏任何内容,请指导....

我有 api 密钥,我已经在 maifest 中添加了它现在编辑的上方...

这里是我手机日志中的错误跟踪

  I/ActivityManager(  282): Displayed com.example.emeterfinalapp/.EmeterMainActivity:                +206ms
     I/ActivityManager(  282): Displayed com.example.emeterfinalapp/.EnterLocationActivity:      +224ms
     W/InputDispatcher(  282): channel '2c3dbfd0      com.example.emeterfinalapp/com.example.emeterfinalapp.EmeterMainActivity (server)' ~           Consumer closed input channel or an error occurred.  events=0x8
     E/InputDispatcher(  282): channel '2c3dbfd0      com.example.emeterfinalapp/com.example.emeterfinalapp.EmeterMainActivity (server)' ~      Channel is unrecoverably broken and will be disposed!
     W/InputDispatcher(  282): Attempted to unregister already unregistered input channel      '2c3dbfd0 com.example.emeterfinalapp/com.example.emeterfinalapp.EmeterMainActivity      (server)'
     W/InputDispatcher(  282): channel '2c504fb8      com.example.emeterfinalapp/com.example.emeterfinalapp.EnterLocationActivity (server)' ~      Consumer closed input channel or an error occurred.  events=0x8
     E/InputDispatcher(  282): channel '2c504fb8      com.example.emeterfinalapp/com.example.emeterfinalapp.EnterLocationActivity (server)' ~      Channel is unrecoverably broken and will be disposed!
     W/InputDispatcher(  282): Attempted to unregister already unregistered input channel      '2c504fb8 com.example.emeterfinalapp/com.example.emeterfinalapp.EnterLocationActivity      (server)'

【问题讨论】:

  • 您有 API 密钥吗?我在您的清单中没有看到这部分。
  • 我有一个 api 密钥我已经编辑了帖子......直到现在没有结果......我错过了任何东西......
  • 我也做了同样的事情,这段代码不工作。你得到了什么确切的例外?
  • 请从您的手机中发布 logcat...
  • 你能帮我如何从我的手机获取 logcat...

标签: java android eclipse api google-maps


【解决方案1】:

哇...在挠头这么久之后,我终于找到了解决方案 首先,我使用 DDMS 按照其文档进行了真实设备的调试,这非常棒,然后我发现了以下错误

12-12 15:08:29.458: E/AndroidRuntime(26382): java.lang.RuntimeException: Unable to start     activity ComponentInfo{com.example.emeterfinalapp/com.example.emeterfinalapp.SelectLocation}:     android.view.InflateException: Binary XML file line #17: Error inflating class fragment

再写几行代码后,又出现了一个引人注目的错误

12-12 15:08:29.458: E/AndroidRuntime(26382): 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

然后我意识到我的 api 密钥代码是清单的子代码,而不是上述错误指出的应用程序,然后我将清单改正为以下

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


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

  <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_CORSE_LOCATION" />

<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
 <permission
     android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"
     android:protectionLevel="signature"/>
<uses-permission  android:name="com.example.emeterfinalapp.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<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="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

     <uses-library android:name="com.google.android.maps"/>
    <activity
        android:name="com.example.emeterfinalapp.EmeterMainActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name"
        android:theme="@style/FullscreenTheme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.emeterfinalapp.EnterLocationActivity"
        android:label="@string/title_activity_enter_location"
        android:parentActivityName="com.example.emeterfinalapp.EmeterMainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.emeterfinalapp.EmeterMainActivity" />
    </activity>

    <activity
        android:name="com.example.emeterfinalapp.SelectLocation"
        android:label="@string/title_activity_select_location"
        android:parentActivityName="com.example.emeterfinalapp.EnterMainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.emeterfinalapp.EnterMainActivity" />
    </activity>

     <meta-data
   android:name="com.google.android.maps.v2.API_KEY"
   android:value="my api key"/>
</application>

然后它就像缩放一样,一切都完美无缺...使用真实设备进行调试有很大帮助...

【讨论】:

    【解决方案2】:

    我一直在使用Android Log Viewer (logcat) Application 从手机收集应用程序日志,似乎效果很好。

    【讨论】:

    • 这与问题有什么关系?
    • 为了诊断应用程序执行期间崩溃的可能原因是一个很好的做法,开始查看日志。然而,在为 Android 开发应用程序时,它们并不是很容易访问。使用我提到的应用程序很方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多