2

首先,我知道这里有很多关于这个问题的线索,但我都阅读了它们,并尝试了几乎所有的东西。那么我的问题是什么。我正在开发一个带有谷歌地图的应用程序,我也遇到了一个众所周知的问题,即 mapView 加载良好,但它不包含任何内容(只有灰色的空白矩形)。

这是我尝试过的:

  • 我三重检查我的 API 代码
  • 我重新生成了我的 API 代码
  • 我检查了所有的权限
  • 还有很多其他的东西

主布局:

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

<com.google.android.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:enabled="true"
    android:apiKey="my key"/>

</RelativeLayout>

显现:

<?xml version="1.0" encoding="utf-8"?>

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />



    <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.gps.gpsclientsoftware.GPSClientActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


    </application>


</manifest>

活动代码:

package com.gps.gpsclientsoftware;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class GPSClientActivity extends MapActivity {

    private MapView mapView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);


    }


    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }

}

我在启动应用程序时发现的一个警告是:

03-11 17:51:03.751: E/MapActivity(8581): Couldn't get connection factory client

希望您能够帮助我。

4

4 回答 4

6

检查这个...

http://ucla.jamesyxu.com/?p=287

您需要覆盖所有方法。不要错过任何一个。

我做到了,我得到了一个工作的 MapView。

(onLowMemory 似乎可以跳过。)

(MapView 比 MapFragment 效果更好。)

于 2015-08-20T04:00:37.353 回答
1

自 2012 年 12 月起,Google 发布了 Google 地图第 2 版。这意味着新应用程序应使用此版本,并且仅为 v2 地图提供 api 密钥。
您的实施似乎适用于谷歌地图 v1。在这里
查看详细指南,但快速浏览一下,我发现您的 android 清单中缺少以下内容:

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="your_api_key"/>
<permission
        android:name="your.project.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>

<uses-permission android:name="your.project.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="your key" />

此外,要在手机上运行谷歌地图,您需要安装谷歌播放服务。为了检查它是否已经安装并且谷歌地图 v2 在您的设备上工作,我建议使用使用 v2 地图的应用程序,如trulia

于 2013-03-11T17:46:08.063 回答
1

正如hsu.tw 所指出的,我们需要MapView从片段生命周期方法中调用生命周期方法。

但是拥有布局文件的MapView部分会导致问题,因为在膨胀片段布局之前调用onCreateMapView's onCreate() [所以永远不会被调用]。

下面的方法对我有用。[如果您将此 Fragment 添加到 BackStack ,可能需要注意删除MapView]

class MapFragment : BaseFragment() {

    var mapView: MapView? = null

    override fun getFragmentLayout() = R.layout.fragment_map

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        (view as? LinearLayout)?.addView(mapView, LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT))
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // create map view
        mapView = MapView(context /*, GoogleMapOption for configuration*/)
        mapView?.onCreate(savedInstanceState)
    }

    override fun onStart() {
        super.onStart()
        mapView?.onStart()
    }

    override fun onPause() {
        super.onPause()
        mapView?.onPause()
    }

    override fun onResume() {
        super.onResume()
        mapView?.onResume()
    }

    override fun onSaveInstanceState(outState: Bundle?) {
        super.onSaveInstanceState(outState)
        mapView?.onSaveInstanceState(outState)
    }

    override fun onStop() {
        super.onStop()
        mapView?.onStop()
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mapView?.onLowMemory()
    }

    override fun onDestroy() {
        super.onDestroy()
        mapView?.onDestroy()
    }
}
于 2018-01-18T13:27:22.410 回答
-3

将清单中的“我的密钥”替换为您的实际 API 密钥。

android:apiKey="my key"/>

可以在此处获取 API 密钥: https ://developers.google.com/maps/documentation/android/start#obtaining_an_api_key

于 2013-03-11T17:16:32.080 回答