现在的位置: 首页 > 综合 > 正文

使用Google Map API可能会遇到的问题汇总

2013年07月27日 ⁄ 综合 ⁄ 共 13186字 ⁄ 字号 评论关闭

今天在将 http://www.curious-creature.org/2011/02/22/source-code-for-android-3-0-animation-demo/
这个Demo想在手机上测试的时候,

遇到了几个问题,参考下面的blog中问题解决,保留一下,后面万一再用到。

-----------------------------------------------------------------------------------------------------------------------------------------

http://blog.csdn.net/harry_helei/article/details/7282848

       闲来没事,一直在鼓捣公司的开发板,突然有一天想把google地图给整进来,于是开始行动。整个过程归纳为以下几个步骤:

1、基于Google API新建一个名为GoogleMap的工程

       几个重要工程文件的内容如下:

       1)、布局文件main.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <com.google.android.maps.MapView  
  8.         android:id="@+id/map_view"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:clickable="true"  
  12.         android:apiKey="0vcWNfFdVG-uJZSMXPL0BnGQGlBYAxTs3frQpfQ"  
  13.         />  
  14.   
  15. </LinearLayout>  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

   	<com.google.android.maps.MapView
   	    android:id="@+id/map_view"
   	    android:layout_width="fill_parent"
   	    android:layout_height="fill_parent"
   	    android:clickable="true"
   	    android:apiKey="0vcWNfFdVG-uJZSMXPL0BnGQGlBYAxTs3frQpfQ"
   	    />

</LinearLayout>

这里有两个地方需要说明:

i、MapView:跟Android SDK中的其它View是一样的,不同的是SDK中没有包含这个View,位于Google另外提供的jar包中,这个jar包全名叫com.google.android.maps.jar。

ii、android.apiKey:这个需要到网上进行申请,后面有说明

     2)、AndroidManifest.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.raycommtech.googlemap"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="10" />  
  8.     <uses-permission android:name="android.permission.INTERNET"/>  
  9.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
  10.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
  11.   
  12.     <application  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@android:style/Theme.NoTitleBar.Fullscreen">  
  16.         <uses-library android:name="com.google.android.maps"/>  
  17.         <activity  
  18.             android:label="@string/app_name"  
  19.             android:name=".GoogleMapActivity" >  
  20.             <intent-filter >  
  21.                 <action android:name="android.intent.action.MAIN" />  
  22.   
  23.                 <category android:name="android.intent.category.LAUNCHER" />  
  24.             </intent-filter>  
  25.         </activity>  
  26.     </application>  
  27.   
  28. </manifest>  
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.raycommtech.googlemap"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
        <uses-library android:name="com.google.android.maps"/>
        <activity
            android:label="@string/app_name"
            android:name=".GoogleMapActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

有三个地方需要说明

i、android:minSdkVersion默认是14,我板子上的系统是2.3.7,API的Level是10,因此要改成目标板系统的API Level,否则运行时报以下错误:

  1. [2012-02-22 13:05:56 - GoogleMap] ERROR: Application requires API version 14. Device API version is 10 (Android 2.3.7).  
  2. [2012-02-22 13:05:56 - GoogleMap] Launch canceled!  
[2012-02-22 13:05:56 - GoogleMap] ERROR: Application requires API version 14. Device API version is 10 (Android 2.3.7).
[2012-02-22 13:05:56 - GoogleMap] Launch canceled!

ii、需要添加三个uses-permission:INTERNET, ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION

iii、指示使用外部库:使用uses-library指示使用包含MapView的com.google.android.maps.jar库

      3)、GoogleMapActivity.java文件

  1. package com.raycommtech.googlemap;  
  2.   
  3. import com.google.android.maps.MapActivity;  
  4. import com.google.android.maps.MapView;  
  5.   
  6. import android.os.Bundle;  
  7.   
  8. public class GoogleMapActivity extends MapActivity {  
  9.     private MapView mMapView = null;  
  10.       
  11.     /** Called when the activity is first created. */  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.           
  16.         setContentView(R.layout.main);  
  17.                   
  18.         mMapView = (MapView)findViewById(R.id.map_view);  
  19.         mMapView.setSatellite(false);  
  20.         mMapView.setTraffic(true);  
  21.         mMapView.setBuiltInZoomControls(true);  
  22.     }  
  23.   
  24.     @Override  
  25.     protected boolean isRouteDisplayed() {  
  26.   
  27.         return false;  
  28.     }     
  29. }  
package com.raycommtech.googlemap;

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

import android.os.Bundle;

public class GoogleMapActivity extends MapActivity {
	private MapView mMapView = null;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.main);
                
        mMapView = (MapView)findViewById(R.id.map_view);
        mMapView.setSatellite(false);
        mMapView.setTraffic(true);
        mMapView.setBuiltInZoomControls(true);
    }

	@Override
	protected boolean isRouteDisplayed() {

		return false;
	}	
}

2、apiKey的申请

       在ubuntu上执行以下命令:

  1. $cd ~  
  2. $keytool -list -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android  
$cd ~
$keytool -list -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android

终端上输出产生以下结果:

     androiddebugkey, Mar 3, 2011, PrivateKeyEntry,
     Certificate fingerprint (MD5): E0:D1:06:6F:BE:4D:33:1C:3F:E6:C2:9C:49:E8:2F:1A

将生成的MD5指纹输入连接里生成所需的apiKey添到MapView的android:apiKey中即可

3、程序在开发板上的部署及问题的解决

       直接运行程序,Eclipse的console直接报错如下:

  1. [2012-02-22 13:06:32 - GoogleMap] Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY  
  2. [2012-02-22 13:06:32 - GoogleMap] Please check logcat output for more details.  
  3. [2012-02-22 13:06:32 - GoogleMap] Launch canceled!  
[2012-02-22 13:06:32 - GoogleMap] Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
[2012-02-22 13:06:32 - GoogleMap] Please check logcat output for more details.
[2012-02-22 13:06:32 - GoogleMap] Launch canceled!

通过adb logcat看详细错误如下;

  1. D/PackageParser( 1068): Scanning package: /data/app/vmdl583239231.tmp  
  2. D/PackageManager( 1068): Scanning package com.raycommtech.googlemap  
  3. E/PackageManager( 1068): Package com.raycommtech.googlemap requires unavailable shared library com.google.android.maps; failing!  
  4. W/PackageManager( 1068): Package couldn't be installed in /data/app/com.raycommtech.googlemap-1.apk  
D/PackageParser( 1068): Scanning package: /data/app/vmdl583239231.tmp
D/PackageManager( 1068): Scanning package com.raycommtech.googlemap
E/PackageManager( 1068): Package com.raycommtech.googlemap requires unavailable shared library com.google.android.maps; failing!
W/PackageManager( 1068): Package couldn't be installed in /data/app/com.raycommtech.googlemap-1.apk

错误提示很明显,板子上的系统中没有com.google.android.maps.jar这个共享库。到Android的SDK的add-onsq/addon-google_apis-google_inc_-14/libs/目录下找到maps.jar,并将其重新命令为com.google.android.maps.jar,通过以下命令push到系统中:

  1. $adb remount  
  2. $adb push com.google.android.maps.jar /system/framework/  
$adb remount
$adb push com.google.android.maps.jar /system/framework/

重新启动系统,并执行程序,还是报上面的错误,明显添加的库没起作用,google上查了下,发现需要写一个com.google.android.maps.xml的permissions文件,内容如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <permissions>  
  3.     <library name="com.google.android.maps"  
  4.              file="/system/framework/com.google.android.maps.jar" />  
  5. </permissions>  
<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <library name="com.google.android.maps"
             file="/system/framework/com.google.android.maps.jar" />
</permissions>

执行以下命令,将com.google.android.maps.xml文件push到系统中:

  1. $adb remount  
  2. $adb push com.google.android.maps.jar /system/etc/permissions/  
$adb remount
$adb push com.google.android.maps.jar /system/etc/permissions/

重新启动系统,并执行程序,报以下错误:

  1. E/AndroidRuntime( 1340): FATAL EXCEPTION: main  
  2. E/AndroidRuntime( 1340): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.raycommtech.googlemap/com.raycommtech.googlemap.GoogleMapActivity}: java.lang.ClassNotFoundException: com.raycommtech.googlemap.GoogleMapActivity in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.raycommtech.googlemap-2.apk]  
  3. E/AndroidRuntime( 1340):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)  
  4. E/AndroidRuntime( 1340):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)  
  5. E/AndroidRuntime( 1340):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)  
  6. E/AndroidRuntime( 1340):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)  
  7. E/AndroidRuntime( 1340):    at android.os.Handler.dispatchMessage(Handler.java:99)  
  8. E/AndroidRuntime( 1340):    at android.os.Looper.loop(Looper.java:130)  
  9. E/AndroidRuntime( 1340):    at android.app.ActivityThread.main(ActivityThread.java:3683)  
  10. E/AndroidRuntime( 1340):    at java.lang.reflect.Method.invokeNative(Native Method)  
  11. E/AndroidRuntime( 1340):    at java.lang.reflect.Method.invoke(Method.java:507)  
  12. E/AndroidRuntime( 1340):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)  
  13. E/AndroidRuntime( 1340):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)  
  14. E/AndroidRuntime( 1340):    at dalvik.system.NativeStart.main(Native Method)  
  15. E/AndroidRuntime( 1340): Caused by: java.lang.ClassNotFoundException: com.raycommtech.googlemap.GoogleMapActivity in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.raycommtech.googlemap-2.apk]  
  16. E/AndroidRuntime( 1340):    at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)  
  17. E/AndroidRuntime( 1340):    at java.lang.ClassLoader.loadClass(ClassLoader.java:551)  
  18. E/AndroidRuntime( 1340):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)  
  19. E/AndroidRuntime( 1340):    at android.app.Instrumentation.newActivity(Instrumentation.java:1021)  
  20. E/AndroidRuntime( 1340):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)  
  21. E/AndroidRuntime( 1340):    ... 11 more  
  22. W/ActivityManager( 1065):   Force finishing activity com.raycommtech.googlemap/.GoogleMapActivity  
E/AndroidRuntime( 1340): FATAL EXCEPTION: main
E/AndroidRuntime( 1340): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.raycommtech.googlemap/com.raycommtech.googlemap.GoogleMapActivity}: java.lang.ClassNotFoundException: com.raycommtech.googlemap.GoogleMapActivity in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.raycommtech.googlemap-2.apk]
E/AndroidRuntime( 1340): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)
E/AndroidRuntime( 1340): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
E/AndroidRuntime( 1340): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
E/AndroidRuntime( 1340): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
E/AndroidRuntime( 1340): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1340): 	at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime( 1340): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime( 1340): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1340): 	at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 1340): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime( 1340): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime( 1340): 	at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1340): Caused by: java.lang.ClassNotFoundException: com.raycommtech.googlemap.GoogleMapActivity in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.raycommtech.googlemap-2.apk]
E/AndroidRuntime( 1340): 	at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
E/AndroidRuntime( 1340): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
E/AndroidRuntime( 1340): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime( 1340): 	at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
E/AndroidRuntime( 1340): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
E/AndroidRuntime( 1340): 	... 11 more
W/ActivityManager( 1065):   Force finishing activity com.raycommtech.googlemap/.GoogleMapActivity

很明显,Android SDK中的maps不给力啊,木有所需要的MapActivity。于是只能到网上去搜索,还真下到所需要的文件,下载文件,并按照上面的步骤将com.google.android.maps.jar和com.google.android.maps.xml分别push到系统中,再次重启开发板,执行程序就OK啦,显示效果如下:

抱歉!评论已关闭.