安卓HelloGoogleMaps教程异常

3
我正在使用Android开发者资源页面上的HelloGoogleMaps教程(http://developer.android.com/resources/tutorials/views/hello-mapview.html),当我在模拟器上运行应用程序的第一部分("创建地图活动")时,我收到消息“应用程序HelloGoogleMaps(进程com.example)意外停止。请再试一次。”我相信我已经正确地按照所有说明操作,但我不确定是否正确设置了模拟器环境。有人能帮我弄清楚发生了什么吗?谢谢。
以下是logcat的输出:
I/ActivityManager( 63): 启动活动: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example/.HelloGoogleMaps } I/ActivityManager( 63): 为 com.example/.HelloGoogleMaps 启动进程: pid=344 uid=10026 gids={3003, 1015} D/ddm-heap( 344): 收到特性列表请求 W/dalvikvm( 344): 类被意外的 DEX 解析: Lcom/example/HelloGoogleMaps;(0x43d02e18):0x11fbb0 ref [Lcom/google/android/maps/MapActivity;] Lcom/google/android/maps/MapActivity;(0x43d02e18):0x11f510 W/dalvikvm( 344): (Lcom/example/HelloGoogleMaps; 在预验证期间使用了不同的 Lcom/google/android/maps/MapActivity;) W/dalvikvm( 344): 无法解析 Lcom/example/HelloGoogleMaps 的父类; (41) W/dalvikvm( 344): 'Lcom/example/HelloGoogleMaps;' 类的链接失败 D/AndroidRuntime( 344): 关闭虚拟机 W/dalvikvm( 344): 线程 ID = 3: 线程退出并因未捕获异常而终止 (group=0x4001b188) E/AndroidRuntime( 344): 未捕获的处理程序: 主线程即将退出,因为未捕获的异常 E/AndroidRuntime( 344): java.lang.IllegalAccessError: 在预验证类中的类引用解析为意外的实现 E/AndroidRuntime( 344): at dalvik.system.DexFile.defineClass(Native Method) E/AndroidRuntime( 344): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:209) E/AndroidRuntime( 344): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:203) E/AndroidRuntime( 344): at java.lang.ClassLoader.loadClass(ClassLoader.java:573) E/AndroidRuntime( 344): at java.lang.ClassLoader.loadClass(ClassLoader.java:532) E/AndroidRuntime( 344): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) E/AndroidRuntime( 344): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409) E/AndroidRuntime( 344): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) E/AndroidRuntime( 344): at android.app.ActivityThread.access$2200(ActivityThread.java:119) E/AndroidRuntime( 344): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) E/AndroidRuntime( 344): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 344): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime( 344): at android.app.ActivityThread.main(ActivityThread.java:4363) E/AndroidRuntime( 344): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 344): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime( 344): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) E/AndroidRuntime( 344): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) E/AndroidRuntime( 344): at dalvik.system.NativeStart.main(Native Method) I/Process ( 63): 发送信号。PID: 344 SIG: 3 I/dalvikvm( 344): 线程 ID = 7: 响应信号 3 E/dalvikvm( 344): 无法打开堆栈跟踪文件 '/data/anr/traces.txt':拒绝权限 W/ActivityManager( 63): 启动超时,放弃唤醒锁! W/ActivityManager( 63): HistoryRecord{43dc9818 com.example/.HelloGoogleMaps} 的活动空闲超时 D/dal
4个回答

2

你好,我不确定你是否遇到了和我一样的问题,但请确保在Activity标签中设置你的地图和网络权限,而不是在Manifest中设置,例如:

  </activity>
    <uses-library android:name="com.google.android.maps" />
   <uses-permission android:name="android.permission.INTERNET" />

<activity android:name=".champ" android:label="@string/app_name"

android:theme="@android:style/Theme.NoTitleBar">


谢谢,这就是问题所在...看起来Google文档中有一个错误,<uses-permission>标签需要成为<application>的子元素,而不是<manifest>的子元素。 - jay
非常感谢你,伙计 :) 为此浪费了2个小时。 - nithinreddy

1

以下代码可以正常运行(它会显示地图而不仅仅是网格):

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="ru.studiomobile.example"
  android:versionCode="1"
  android:versionName="1.0">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />
<application android:label="@string/app_name" android:icon="@drawable/icon">
    <activity android:name="HelloMapsActivity"
              android:label="@string/app_name"
              android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <uses-library android:name="com.google.android.maps" />
</application>
</manifest>

放置这些 uses-permission 的位置很重要。我怀疑在添加 ACCESS_COARSE_LOCATION 后它开始工作了。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:apiKey="9AaAaaaA7AAA_9AaAAARottenAAAAkMJD8h084Q"
/>

密钥是通过以下两步骤获得的:
步骤1:
$keytool -list -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android
androiddebugkey, May 5, 2011, PrivateKeyEntry, 
Certificate fingerprint (MD5): 99:99:99:99:99:99:99:99:99:99:99:99:99:99:99:99

步骤2:将99:99...提供给http://code.google.com/android/maps-api-signup.html的谷歌,并获得密钥。

没有这个密钥,MapView只显示网格而无法工作。

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

public class HelloMapsActivity extends MapActivity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MapView mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
    }

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

但是...在它能够工作之前,我不得不尝试使用发布密钥和调试密钥。我不知道我改变了什么。也许诀窍是使用不同的证书安装它。
我必须补充说。
E/MapActivity Couldn't get connection factory client

并不代表出现了错误。该地图可以正常运行,并在日志中打印。

一个工作应用程序的日志如下所示:

I/ActivityManager(  110): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=xx.yy.example/.HelloMapsActivity } from pid 211
I/ActivityManager(  110): Start proc xx.yy.example for activity xx.yy.example/.HelloMapsActivity: pid=21102 uid=10064 gids={3003, 1015}
V/RenderScript_jni(  211): surfaceDestroyed
D/dalvikvm(21102): GC_CONCURRENT freed 1163K, 54% free 3149K/6727K, external 1625K/2137K, paused 3ms+2ms
D/dalvikvm(21102): GC_CONCURRENT freed 532K, 51% free 3308K/6727K, external 1625K/2137K, paused 1ms+3ms
I/MapActivity(21102): Handling network change notification:CONNECTED
E/MapActivity(21102): Couldn't get connection factory client
D/dalvikvm(21102): GC_EXTERNAL_ALLOC freed 880K, 55% free 3034K/6727K, external 1993K/2137K, paused 23ms
I/ActivityManager(  110): Displayed xx.yy.example/.HelloMapsActivity: +584ms

1

"uses-library" 应该在 application 标签内。 "uses-permission" 应该在 application 标签外。


0
你还需要设置一个新的AVD,使用相同的Google APIs部署目标。

你做过了吗?


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