【问题标题】:Android HelloGoogleMaps tutorial exceptionAndroid HelloGoogleMaps 教程异常
【发布时间】:2011-04-17 19:11:36
【问题描述】:

我正在使用 Android 开发者资源页面 (http://developer.android.com/resources/tutorials/views/hello-mapview.html) 上的 HelloGoogleMaps 教程,当我在模拟器上运行应用程序的第 1 部分(“创建地图活动”)时,我收到消息“The应用程序 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 启动 proc com.example: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):threadid=3:线程退出未捕获异常(组=0x4001b188)
E/AndroidRuntime(344):未捕获的处理程序:线程主因未捕获的异常而退出
E/AndroidRuntime(344):java.lang.IllegalAccessError:预验证类中的类引用解析为意外实现
E/AndroidRuntime(344):在 dalvik.system.DexFile.defineClass(本机方法)
E/AndroidRuntime(344):在 dalvik.system.DexFile.loadClassBinaryName(DexFile.java:209)
E/AndroidRuntime(344):在 dalvik.system.PathClassLoader.findClass(PathClassLoader.java:203)
E/AndroidRuntime(344): 在 java.lang.ClassLoader.loadClass(ClassLoader.java:573)
E/AndroidRuntime(344): 在 java.lang.ClassLoader.loadClass(ClassLoader.java:532)
E/AndroidRuntime(344):在 android.app.Instrumentation.newActivity(Instrumentation.java:1021)
E/AndroidRuntime(344): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409)
E/AndroidRuntime(344): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
E/AndroidRuntime(344):在 android.app.ActivityThread.access$2200(ActivityThread.java:119)
E/AndroidRuntime(344): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
E/AndroidRuntime(344): 在 android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(344):在 android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(344): 在 android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime(344): 在 java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(344):在 java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(344):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(344):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(344):在 dalvik.system.NativeStart.main(本机方法)
I/Process (63):发送信号。 PID:344 SIG:3
I/dalvikvm(344):threadid=7:对信号 3 做出反应
E/dalvikvm(344):无法打开堆栈跟踪文件'/data/anr/traces.txt':权限被拒绝
W/ActivityManager(63):启动超时已过期,放弃唤醒锁!
W/ActivityManager(63):HistoryRecord{43dc9818 com.example/.HelloGoogleMaps} 的活动空闲超时
D/dalvikvm(143):GC 在 107 毫秒内释放了 2317 个对象/132032 个字节

【问题讨论】:

    标签: android google-maps


    【解决方案1】:

    您好,我不确定您是否遇到与我相同的问题,但请确保您的清单中的地图和互联网权限在活动括号内而不是清单内,即:

      </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 文档中似乎有错误,并且 标签必须是 的子标签,而不是 .
    • 非常感谢哥们 :) 浪费了 2 个小时
    【解决方案2】:

    以下内容有效(它显示地图而不仅仅是网格):

    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>
    

    重要的是在哪里你把这些使用权限的。另外,我怀疑它在添加 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"
    />
    

    通过以下两步过程获得密钥:

    第一步:

    $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
    

    【讨论】:

      【解决方案3】:

      “uses-library”应该在应用程序标签内。 “uses-permission”应该在应用程序标签之外。

      【讨论】:

        【解决方案4】:
        您还需要设置一个使用相同 Google API 部署目标的新 AVD

        你做到了吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多