2013-06-05 36 views
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的代码..但它没有奏效。

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

+0

使用google maps api v2? – Raghunandan

+0

你是如何生成API KEY的? – OcuS

+0

@ raghu-是的,我用google api控制台生成它 – jaisonDavis

回答

1

创建新的Android键”

  • 使用新生成的API密钥我觉得很愚蠢的回答我自己的问题(尤其是,带着赏金),但我仍然在做。

    Raghunandan and Emil Adz解决了我的第一个错误(混合gmaps v1和v2代码),谢谢各位。 但后来我遇到了另外两个问题:

    问题1:图书馆未能链接我的项目。
    问题2:我得到一个错误“的错误充气类片段”

    解决方案:

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

    对于问题2:我在内部<fragment>SupportMapFragment(我的活动XML内),这是片段的本地API级11的版本替代该MapFragment

  • +0

    很高兴你可以解决你的问题。感谢奖励赏金。如果遇到问题将很乐意帮助您 – Raghunandan

    +0

    感谢您的帮助! – jaisonDavis

    0

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

    请参阅these instructions

    +0

    我在签署应用程序的时候得到了SHA1,我也用默认的密码存储器试过了它 – jaisonDavis

    1

    这是因为你混合了两个API版本的谷歌地图。一方面,您使用的是MapView,这是另一方面您为API V2生成了密钥的API V1对象,并使用此版本的权限。

    是因为API V1已被弃用,不再可用,因为你是在半路上就实现Google Maps API V2你应该做的是:

    删除此权限,因为它是一个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); 
    

    你可以看看这个指导我写了谷歌地图API V2获得它的全面想法的实现:

    Google Maps API V2

    +0

    我试过了,但得到了“java.lang。 ClassNotFoundException:com.vevolet.maps.MainActivity in loader dalvik.system.PathClassLoader [/data/app/com.vevolet.maps-1.apk]“这个错误 – jaisonDavis

    0

    退房这answer--

    Can't make google maps v2 to work

    这发生在你的谷歌项目的关键不与您在清单中指定的相匹配。请再次执行所有指导步骤,并检查您的密钥。

    +0

    我检查了4次 – jaisonDavis

    0

    我面临同样的问题,它适用于我在使用openGL 2.0的设备中进行测试。但是当我在2.2.1版中测试时,由于缺少openGL2.0,它只显示了网格屏幕。但是我使用SupportMapMapFragment代替了Map-in-XML,正如google-maps-api-v2文档中所述。同时确保Google Play服务在测试前得到更新。

    1

    您的最小sdk是8.您应该使用支持片段。

    取而代之的是

    <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加快转速22

    权点击你的项目转到属性。 Java构建路径。选择订单导出选项卡。确保已选择Android专用库。如果你有引用库项目。也为谷歌播放服务库项目也一样。清洁和构建。

    您可以删除这个由EmilAdz的建议

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

    确保您已按照下面的链接步骤

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

    而且确保您已经启用地图android系统google服务标签下的api控制台。

    在设备上测试。

    编辑:

    你应该参考Google服务库项目在地图项目

    下载谷歌播放services.Goto的Windows。转到Android Sdk Manager。额外选择Google Play服务。如果未安装,请安装软件包。

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

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

    将库项目导入到eclipse中。

    单击文件>导入,选择Android>现有的Android代码到Workspace中,并浏览工作区导入库项目。你可以检查它是否是图书馆项目。右键点击图书馆项目。转到属性。点击左侧面板上的Android。你会看到Is Library被选中。

    参照图书馆项目

    右键单击你的android地图项目。转到属性。选择Android。点击添加borwse并添加库项目。

    +0

    我得到这个错误:java.lang .NoClassDefFoundError:com.google.android.gms.R $ styleable – jaisonDavis

    +0

    你能告诉你是如何引用图书馆项目的吗? – Raghunandan

    +0

    @jaisonDavis尝试编辑我的猜测你没有正确地提到谷歌服务库项目 – Raghunandan

    0

    我有一个使用谷歌地图几个不同的应用程序,只有其中一人有类似你的问题,未来的解决方案帮助我:

    1. 转到Google API Console
    2. 开放API访问选项卡
    3. 选择“在AndroidManifest.xml中