3

我试图让一个基本的地图应用程序工作,但我只得到网格屏幕。

代码:

1.ActivityMain.java

import android.os.Bundle;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
public class MainActivity extends MapActivity {
    MapView mapView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main);
        mapView = (MapView) findViewById(R.id.map_view);       

    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

2.activity_main.xml

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

 <com.google.android.maps.MapView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/map_view"
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent"
  android:clickable="true" 
  android:enabled="true" 
  android:apiKey="[api_key]" />

</RelativeLayout>

3.Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.vevolet.maps"
    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_NETWORK_STATE" />

    <permission
        android:name="com.vevolet.maps.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" >
    </permission>

    <uses-permission android:name="com.vevolet.maps.permission.MAPS_RECEIVE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

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

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

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

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

        <activity
            android:name=".MainActivity"
            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>

我还尝试了使用从应用程序生成的密钥库生成的 api 代码..但它不起作用。

请告诉我问题是什么。谢谢

4

7 回答 7

1

您的 min sdk 为 8。您应该使用 Support Fragment。

而不是这个

<com.google.android.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map_view"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:clickable="true" 
android:enabled="true" 
android:apiKey="[api_key]" />

使用以下

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

您的活动必须扩展FragmentActivity。将使用 SupportFragment

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

确保您已添加支持库

还要确保您导入了以下内容

import android.support.v4.app.FragmentActivity;  
import com.google.android.gms.maps.SupportMapFragment;    

此外,如果您已将 adt 更新为 rev 22

右键单击您的项目转到属性。Java 构建路径。选择订单导出选项卡。确保选择了 Android Private Libraries。如果您引用了库项目。对谷歌播放服务库项目也做同样的事情。清洁和建造。

您可以按照 EmilAdz 的建议删除它

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

确保您已按照以下链接中的步骤操作

https://developers.google.com/maps/documentation/android/

还要确保您已在服务标签下的 google api 控制台中为 android 启用地图

在设备上进行测试。

编辑:

您应该在地图项目中参考谷歌服务库项目

下载 Google Play 服务。转到 Windows。转到 Android SDK 管理器。在 extras 下选择 Google play services。如果未安装,请安装该软件包。

将 google-play services_lib 库项目复制到您的工作区。库项目可以在以下路径下找到。

<android-sdk-folder>/extras/google/google_play_services/libproject/google-play-services_lib library project .

将库项目导入 Eclipse。

点击 File > Import,选择 Android > Existing Android Code into Workspace,浏览工作区导入库项目。您可以检查它是否是库项目。右键单击库项目。转到属性。单击左侧面板上的 Android。您将看到 Is Library 已选中。

参考图书馆项目

右键单击您的 android 地图项目。转到属性。选择安卓。单击添加 borwse 并添加库项目。

于 2013-06-13T14:37:41.983 回答
1

我觉得回答自己的问题很愚蠢(尤其是有赏金),但无论如何我都在做。

RaghunandanEmil Adz解决了我犯的第一个错误(混合 gmaps v1 和 v2 代码),谢谢你们。但后来我遇到了另外两个问题:

问题 1:库无法与我的项目链接。
问题 2:我收到一个错误“错误膨胀类片段”

解决方案:

对于问题 1:我复制了google-play-services_lib里面的文件夹C:\Android\android-sdk\extras\google\google_play_services\libproject并将其粘贴到另一个驱动器中,然后从新位置导入它并将其引用到我的项目中。

对于问题 2:MapFragmentSupportMapFragmentin inside <fragment>(在我的活动 xml 中)替换了用于原生 API 级别 11 版本的片段。

于 2013-06-16T10:21:14.720 回答
1

这是因为您混淆了 Google Maps 的两个 API 版本。一方面,您正在使用MapViewwhich 是一个API V1对象,另一方面,您已经为此版本生成了密钥API V2并使用了该版本的权限。

因此,因为API V1已弃用且不再可用,并且因为您正在实施Google Maps API V2您应该做的事情的一半:

1.移除此权限,因为它是 API V1 权限:

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

2.在您的 xml 中替换此代码:

 <com.google.android.maps.MapView
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/map_view"
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent"
 android:clickable="true" 
 android:enabled="true" 
 android:apiKey="[api_key]" />

这个:

<fragment
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

3.从您的 java 代码中删除这一行:

mapView = (MapView) findViewById(R.id.map_view); 

您可以查看我在 Google Maps API V2 上编写的本指南,以全面了解它的实现:

谷歌地图 API V2

于 2013-06-06T08:44:10.390 回答
0

我遇到了同样的问题,当我在使用 openGL 2.0 的设备中进行测试时,它对我有用。但是当我在 2.2.1 版本中测试时,由于缺少 openGL2.0,它只显示网格屏幕。但是我使用 SupportMapFragment 代替了 google-maps-api-v2 文档中指定的 XML 中的 MapView。还要确保在测试之前更新 google play 服务。

于 2013-06-07T08:47:28.583 回答
0

看看这个答案——

无法使谷歌地图 v2 工作

当您的 google 项目的密钥与您在清单中指定的密钥不匹配时,就会发生这种情况。请再次执行所有指示的步骤,并检查您的密钥。

于 2013-06-06T08:51:40.147 回答
0

您使用哪个证书生成 API 密钥?如果您从 Eclipse 启动,您的 apk 使用调试证书而不是您的发布证书进行签名,因此您需要为调试密钥库使用不同的 API 密钥。

请参阅这些说明

于 2013-06-05T15:46:49.690 回答
0

我有几个不同的应用程序使用谷歌地图,只有一个有与你类似的问题,下一个解决方案帮助了我:

  1. 转到Google API 控制台
  2. 打开 API 访问选项卡
  3. 选择“创建新的 Android 密钥”
  4. 在您的 AndroidManifest.xml 中使用新生成的 API 密钥
于 2013-06-13T23:11:51.290 回答