有些android手机,机器里没有com.google.android.maps.jar这个包。
<uses-library android:name="com.google.android.maps"
try{ Class.forName("com.google.android.maps.MapActivity"); }catch(Exception e) { }
|
Android真机没有google_add-on之后
2012-05-19 Preview
本文能解决的问题:
1. INSTALL_FAILED_MISSING_SHARED_LIBRARY
2. 向没有Google APIs的手机内核注入谷歌服务
3. 在真机上调试Google Maps程序
由于有关部门与谷歌的冷战关系,不仅导致google一系列网路服务在国内举步维艰,甚至戕害得google的手机服务必须阉割。基于Android手机的一些列google add-on服务在国行手机上都不会出现。
笔者在折腾Android软件开发的时候由于用到了Google APIs Level 10里面的com.google.android.maps.jar包,学习一个小demo,在模拟器上能够运行,在华为的破手机上能运行,在魅族的手机上能运行,在小米的手机上能运行,好吧,重点来了,在Google自己的Moto手机Atrix2上不能运行。
以下是在Atrix2上debug程序时Console与Logcat出错记录
01
02
03
04
05
06
07
08
09
10
|
Console错误信息
WARNING: Application doe not specify an API level requirement!
Device API version is 10 (Android 2.3.6)
Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
Please check logcat output for more details
Lanch canceled!
Logcat错误信息
Tag: Package
Text: Package 我的包名 requires unavailable shared library com.google.android.maps;failing!
|
在百度与谷歌上和膝盖已经中过箭的前辈们惺惺相惜了一会儿才知道,Moto、三星国行基本都阉割了Google APIs,(魅族和小米却没有)。解决方法大致有两个方向:
方向一、从自己的软件代码着手,方法有两个:[1]
1)维护两条代码分支:
一条分支是针对于内置有Google Map add-on的Android真机,另一条分支是没有内置有Google Map add-on的Android真机。 但是这样做会增加维护成本,而且粗心的用户可能会在自己的机器上安装了不匹配的分支,从而降低了软件的友好度。
2)仍然只保留一条代码分支:
国外一位大牛指出:在<uses-library>标签中还包含了一个没有公布的属性"android:required",你可以将com.google.android.maps库的这个属性设置为false,即:
1
2
|
<!-- 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是否可用,举例如下:
01
02
03
04
05
06
07
08
09
10
|
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)刷机:
不带Google Add-On的国行就刷成带Google Add-On的亚太、港行、欧美版本,国内不知名的山寨机,试试MIUI吧。
2)注入:
假如你也像笔者一样有正版控,那么就用注入的方法,将手机中缺少的google add-on服务注入到内核之中。之后的所有篇幅将只介绍注入的方法,以笔者的Moto Atrix2为例。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=分=-=
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-隔-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=墙=-=
1. 先获得手机的root权限。腾讯的应用助手已经可以一键获取大多数手机的Root权限了,但是由于笔者的Atrix2最近官方更新至2.3.6,屏蔽了一般root,应用助手无法推倒,想要root摩托刀锋系列的,可以传送至此http://jween.com/root_atrix2
2. 先将附件的压缩包Add_on.zip[2]中的3个文件拷贝的手机的Sdcard上, 用RE管理器[3],将这3个文件移动到相应目录,目录和相应的文件见下:
/system/framework/com.google.android.maps.jar;
/system/etc/permissions/com.google.android.maps.xml;
/data/apps/NetworkLocation.apk
3. 修改这三个文件的权限如下图
4. 重启手机,焕然一新。
以下为注入add-on之后,成功调用了Google Maps的罪证