如何在API level 10中使用Google Maps API v2?

3
根据1,那里发布的代码可用于Android API 12或更高版本。我在API级别为10(Google API平台2.3.3)的模拟器上尝试了该代码,然后遇到了以下著名错误:

E/AndroidRuntime( 429): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example..../com.example....MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment 下面是我复制粘贴的.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=".MainActivity" >

<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.MapFragment"/>

所以我认为片段元素不被支持...(?). 我在API级别为17的模拟器中尝试了相同的代码,结果显示出现了这个消息(根据我的阅读,目前这是模拟器存在的问题):

This app won't run unless you update Google Play Services.

我没有一个API级别为17的真实设备来测试它,但是我认为它可能可以工作。

在上面的代码中,我是否有任何针对级别10的错误?目前Google支持哪些代码以便在API级别为10的Android设备上开发地图?

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

更新: 改用FragmentActivitySupportMapFragment后,我得到以下结果:

W/dalvikvm( 6718): Unable to resolve superclass of Lmaps/a/du; (406)
W/dalvikvm( 6718): Link of class 'Lmaps/a/du;' failed
W/dalvikvm( 6718): Unable to resolve superclass of Lmaps/a/ej; (2358)
W/dalvikvm( 6718): Link of class 'Lmaps/a/ej;' failed
W/dalvikvm( 6718): Unable to resolve superclass of Lmaps/j/k; (2374)
W/dalvikvm( 6718): Link of class 'Lmaps/j/k;' failed
E/dalvikvm( 6718): Could not find class 'maps.j.k', referenced from method maps. y.ae.a
W/dalvikvm( 6718): VFY: unable to resolve new-instance 3566 (Lmaps/j/k;) in Lmap s/y/ae;
D/dalvikvm( 6718): VFY: replacing opcode 0x22 at 0x007d
D/dalvikvm( 6718): VFY: dead code 0x007f-008f in Lmaps/y/ae;.a(Landroid/view/LayoutInflater;Lcom/google/android/gms/maps/GoogleMapOptions;Z)Lmaps/y/ae;

2秒后:
Google Maps Android API Authorization failure

更新2: 我将项目更改为Android 10的构建目标(之前是Android 4.2)。所以现在我不再看到授权失败的消息。我还粘贴了来自谷歌的API访问api accesses

我的.properties文件中没有启用Proguard,即:
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# 项目目标。
target=android-10
android.library.reference.1=../../adt-bundle-windows-x86/sdk/extras/google/google_play_services/libproject/google-play-services_lib

问题仍然存在:

01-12 09:57:36.306: D/dalvikvm(9072): DexOpt: 找不到字段 Landroid/content/res/Configuration;.smallestScreenWidthDp
01-12 09:57:36.306: W/dalvikvm(9072): VFY: 无法解析实例字段 24
01-12 09:57:36.306: D/dalvikvm(9072): VFY: 正在替换操作码 0x52,在位置 0x0012
01-12 09:57:36.306: D/dalvikvm(9072): VFY: 无用代码 0x0014-0018 在 Lcom/google/android/gms/common/GooglePlayServicesUtil;.b (Landroid/content/res/Resources;)Z 中
01-12 09:57:36.326: W/dalvikvm(1914): disableGcForExternalAlloc: false
01-12 09:57:36.446: D/dalvikvm(9072): GC_CONCURRENT freed 186K, 45% free 3135K/5639K, external 0K/0K, paused 3ms+2ms
01-12 09:57:36.476: W/dalvikvm(9072): Unable to resolve superclass of Lmaps/a/du; (406)
01-12 09:57:36.476: W/ResourceType(7905): getEntry 失败,因为 entryIndex 303 超出了类型 entryCount 133
01-12 09:57:36.476: W/ResourceType(7905): 获取包 0 中 0x7f02012f (t=1 e=303) 条目失败(错误 -2147483647)
01-12 09:57:36.476: W/ResourceType(7905): getEntry 失败,因为 entryIndex 827 超出了类型 entryCount 133
01-12 09:57:36.476: W/dalvikvm(9072): 类 'Lmaps/a/du;' 的链接失败
01-12 09:57:36.476: W/dalvikvm(9072): Unable to resolve superclass of Lmaps/a/ej; (2358)
01-12 09:57:36.476: W/dalvikvm(9072): 类 'Lmaps/a/ej;' 的链接失败
01-12 09:57:36.476: W/dalvikvm(9072): Unable to resolve superclass of Lmaps/j/k; (2374)
01-12 09:57:36.476: W/dalvikvm(9072): 类 'Lmaps/j/k;' 的链接失败
01-12 09:57:36.486: E/dalvikvm(9072): 无法找到类 'maps.j.k',在 maps.y.ae.a 中引用
01-12 09:57:36.486: W/dalvikvm(9072): VFY: 无法解析新实例 3566 (Lmaps/j/k;) 在 Lmaps/y/ae; 中
01-12 09:57:36.486: D/dalvikvm(9072): VFY: 正在替换操作码 0x22,在位置 0x007d
01-12 09:57:36.496: D/dalvikvm(9072): VFY: 无用代码 0x007f-008f 在 Lmaps/y/ae;.a (Landroid/view/LayoutInflater;Lcom/google/android/gms/maps/GoogleMapOptions;Z)Lmaps/y/ae; 中
01-12 09:57:36.546: I/keystore(1270): uid: 1000 action: e -> 7 state: 3 -&


我有同样的问题:“Could not find class 'maps.j.k',referenced from method maps.y.ae.a”我正在Nexus One上运行2.3.6版本。我尝试了以下措施:
  1. 确保我的控制台已选择Android Maps Api V2
  2. 重新创建API密钥(我没有获得授权错误)
  3. 将目标更改为Google API 4.2
  4. 使用SupportMapFragment和FragmentActivity
  5. 根据提供的示例代码检查我的清单条目
  6. 检查是否已包含谷歌游戏服务库
  7. 更新设备上的谷歌地图和谷歌游戏服务
我不确定还有什么别的办法可以尝试了。
- quark
4个回答

15

使用 com.google.android.gms.maps.SupportMapFragment 代替 com.google.android.gms.maps.MapFragment,对于Activity,需要切换为FragmentActivity,如下面的评论所述。


1
此外,应使用FragmentActivity而不是Activity - CommonsWare
你能提交完整的堆栈跟踪吗? - Moh Sakkijha
请确保您的构建目标是Google API目标。 - iagreen
Google Maps Android API授权失败,您是否通过API控制台创建了授权代码? - Moh Sakkijha
@Alex,还请确认您是否已从API控制台中选择了Google Maps Android API v2服务。 - Moh Sakkijha
显示剩余3条评论

6
我使用以下代码,希望对你有用:

包和扩展

import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class UserLocation extends FragmentActivity 

代码

    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    SupportMapFragment mapFragment = (SupportMapFragment) fragmentManager
            .findFragmentById(R.id.map);
    googleMap = mapFragment.getMap();

适合我。

SupportMapFragment

http://developer.android.com/reference/com/google/android/gms/maps/SupportMapFragment.html


你好,"SupportMapFragment" 是什么?我在 Eclipse 中没有找到它。 - sai

1

对于早期的API,您需要使用SupportmapFragment。请参阅SupportMapFragment文档,基本上使用class="com.google.android.gms.maps.SupportMapFragment"代替class="com.google.android.gms.maps.MapFragment"


0

使用此代码作为参考... http://www.androidhive.info/2013/08/android-working-with-google-maps-v2/

在上面的示例中,您需要在清单文件的元数据标签中使用自己的 API 密钥。有关生成 API 密钥的说明已经给出。

现在,如果您想在 Android 2.3 中实现此代码


1)首先更改清单文件

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

然后右键单击>属性>Android>Android 2.3


2) 有两个 Google Play 服务库

   a)..\sdk\extras\google\google_play_services_froyo\libproject\google-play-services_lib

   b)..\sdk\extras\google\google_play_services\libproject\google-play-services_lib

如果你正在使用 Android 2.3,尝试将第一个作为库项目(您需要先将其导入为库项目 File>import>................)


3)然后按照这里的说明进行操作


4) 确保您的设备上的 Google Play 服务应用程序已经更新到最新版本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接