地图选择及地图偏移解决方案(三)

(转)如何在Android真机上检测是否有Google Map add-on

 

原文链接:http://www.cnblogs.com/gansc23/archive/2011/02/28/1967207.html

 

在开发应用的过程中,发现部分厂商的部分机器并没有内置Google Map服务(system/framework下缺少文件com.google.android.maps.jar)导致安装调用Google Map服务的部分机器会出现failure install_failed_missing_shared_library。从网上找到部分解答:

 

    并不是所有的Android真机中都带有Google Map add-on,要想内置Google Map add-on是需要和google商谈的。

    但是若我们开发一个使用到了Google Map add-on的Android应用程序(即使用了<uses-library android:name="com.google.android.maps" />),就会发现这个程序不能成功安装在没有内置Google Map add-on的真机中,那么我们有什么办法来解决这个问题呢?


方法有两个:

1)维护两条代码分支:
    一条分支是针对于内置有Google Map add-on的Android真机,另一条分支是没有内置有Google Map add-on的Android真机。
但是这样做会增加维护成本,而且粗心的用户可能会在自己的机器上安装了不匹配的分支,从而降低了软件的友好度。

2)仍然只保留一条代码分支:
    国外一位大牛指出:在<uses-library>标签中还包含了一个没有公布的属性"android:required",你可以将com.google.android.maps库的这个属性设置为false,即:

<!-- The "android:required" attribute was added in API level 5 (Android 2.0) -->
<uses-library android:name="com.google.android.maps" android:required="false" />


    这代表如果在目标机器上内置了Google Map add-on,则可以正常使用应用;如果目标机器没有内置Google Map add-on,也可以成功安装应用。但是开发人员需要在代码中自行判断Google Map add-on是否可用,举例如下:

try {
Class.forName( "com.google.android.maps.MapActivity" );
} catch (Exception e) {
Toast.makeText(MainActivity.this, "Oop! google地图不可用", Toast.LENGTH_SHORT).show();
return;
}

Intent intent =new Intent();
intent.setClass(MainActivity.this, MyMapActivity.class);

startActivity(intent);

 

 

参考:

[1] http://stackoverflow.com/questions/3909903/disable-mapview-if-it-is-not-supported
[2] http://androidforums.com/application-development/140147-does-all-android-devices-support-map-api.html

 

 

Android使用Google map的地图服务的开发 INSTALL_FAILED_MISSING_SHARED_LIBRARY 问题

地图服务开发中遇到此类错误大体分为以下两种情况解决:(论坛里大多都是属于第一种情况的答案,但是遇到第二种情

况论坛的解决基本无效)。


情况一:如果你用模拟器调试程序

  首先检查AndroidManifest.xml,确保已经写了<uses-library android:name=”com.google.android.maps” />
 其次确保你新建工程的时候 Build Target 选择的TargetName不是Android 而是其版本对应的Google APIs。
 最后新建模拟器,target同样选择Google APIs。
 这样此问题基本解决。你可以正常运行于模拟器上了。如果运行之后地图无法显示,而是现实灰色表格。那么说明你的

android:apiKey 不对。重新注册apiKey(具体方法看api或者去论坛,这里不再赘述)。

 

情况二:如果模拟器运行正常而真机调试时候出现类似错误。
 那是因为你的真机中system/framework下缺少文件com.google.android.maps.jar。
 解决办法:

   1、进入你设备的shell
    adb -d shell  (记着参数 -d)
   2、给system挂在读写权限
    这里不同的机器稍有不同,大家可以如下看看那中情况合适你的机器:
   mount -o rw -t yaffs2 /dev/block/mtdblock3 /system 
或者
   mount -o remount,rw /dev/root /
对于我的机器:
我的是用了cm的系统的。这么做:
mount -o remount,rw  /dev/block/mtdblock3 /system

3、从emulator的system/framework文件夹下导出com.google.android.maps.jar ,可以直接通过ddms导出、或者通过adb

命令导出:
    adb -d push com.google.android.maps.jar /system/framework/

或者

    adb push com.google.android.maps.jar /system/framework/com.google.android.maps.jar

adb push com.google.android.gtalkservice.jar /system/framework/com.google.android.gtalkservice.jar
4、给这个文件增加权限:
这里两种做法:
    (1)把真机中/etc/permissions/platform.xml文件取出来编辑:

<permissions>
</permissions>
中末尾处增加:
<library name="com.google.android.maps" file="/system/framework/com.google.android.maps.jar"/>

然后再把这个platform.xml文件push回真机的/etc/permissions文件夹中.
   (2)对于2.2以后的版本亦可这么做:你可以直接直接pull出你emulator的 

/etc/permissions/com.google.android.maps.xml 然后push进你真机的 /etc/permissions

5、重启手机,此时你就可以调试你的android服务了。如果不行再重启一次就好。


你可能感兴趣的:(解决方案)