再次解决,android 2.3运行凯立德问题

简介:

我的Hero最近刷了2.3的ROM,原来在2.1下可以使用的凯立德又FC了,估计又是android的API接口改变了,又不兼容了,还好当时在有过解决在1.5时代到2.1凯立德不兼容的经验(这个当时也我第一个发布可以在2.1下使用的凯立德,http://www.hiapk.com/bbs/thread-320372-1-1.html
现在有好几个版本的凯立德,我试过都不能在2.3的hero(480*320)的分变率下运行
有个什么零售版的,这个可以支持3D路口显示,但是无奈,这个问题不要重,不容易解决,所以我还是选择了最早的哪个版本来攻破,对这个我也比较熟,搞起来方便

改好后的下载地址 http://www.hiapk.com/thread-928729-1-3.html
也说说这个版本凯立德为什么在2.3下又不能正常运行的主要原因,有兴趣的朋友也可以看一下,没兴趣你就跳过吧, 
运行的时候,FC了,通过logcat可以看到,主要原因错误提示

 

 

1  java.lang.nosuchmethoderror ILocationManager.requestLocationUpdates

查了一下资料,发现 2.3的这个函数比2.2的多了两个参数,

代码

 

所以调用一个不存在的函数,导致了基FC,解决方法就是把里面改成新版的,拿出我的小手术刀apktool,解开了凯立德的apk,找到相应的地方,改过来,就OK了,
首写凯立德是用aidl的方式直接调用 android.location.ILocationManager;接口来实现的,如果用LocationManager来实现就没有这个问题了,就是因为 ILocationManager更改了调用接口才引发了错误!

反编译后可以看到,一个android/location文件夹,这里面就是调用aidl自动生成的文件, 这里的文件全部要换成最新的,有个简单的方法,就是在android 2.3的源代码里找到,location下的几个aidl文件,下载回来,新建一个android工程,把这几个文件,添加到里面,有个地方要注意,就是使用aidl文件,一定要放在相应的包目录下,比如,这几个文件就必须放在android/location这样的目录下,

编译这个空的工程,生成apk,把这个apk 用apktool 也反编译了,可以看到里面也有个android/location文件夹,把这下面的文件全部复制替换到凯立德的下面,这样凯立德调用的也是最新的接口了,然后,找到凯立德中调用 requestLocationUpdates的地方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
.method public  openGPS()I
     .locals 9
 
     .prologue
     const / 4  v8, 0x0
 
     const / 4  v7, - 0x1
 
     .line 1278
     iget- boolean  v0, p0, Lcld/navi/mainframe/MainActivity;->mUseGpsEmu:Z
 
     if -eqz v0, :cond_1
 
     .line 1280
     invoke-virtual {p0}, Lcld/navi/mainframe/MainActivity;->resumeGpsEmu()V
 
     :cond_0
     move v0, v8
 
     .line 1309
     :goto_0
     return  v0
 
     .line 1284
     :cond_1
     iget-object v0, p0, Lcld/navi/mainframe/MainActivity;->mLocationProvider:Ljava/lang/String;
 
     if -nez v0, :cond_0
 
     .line 1286
     iget-object v0, p0, Lcld/navi/mainframe/MainActivity;->mLocationManager:Landroid/location/LocationManager;
 
     iget-object v1, p0, Lcld/navi/mainframe/MainActivity;->mCriteria:Landroid/location/Criteria;
 
     const / 4  v2, 0x1
 
     invoke-virtual {v0, v1, v2}, Landroid/location/LocationManager;->getBestProvider(Landroid/location/Criteria;Z)Ljava/lang/String;
 
     move-result-object v0
 
     iput-object v0, p0, Lcld/navi/mainframe/MainActivity;->mLocationProvider:Ljava/lang/String;
 
     .line 1288
     iget-object v0, p0, Lcld/navi/mainframe/MainActivity;->mLocationProvider:Ljava/lang/String;
 
     if -eqz v0, :cond_2
 
     .line 1292
     :try_start_0
     iget-object v0, p0, Lcld/navi/mainframe/MainActivity;->mILM:Landroid/location/ILocationManager;
 
     iget-object v1, p0, Lcld/navi/mainframe/MainActivity;->mGPSStatusListener:Lcld/navi/mainframe/MainActivity$NaviGPSStatusListener;
 
     invoke- interface  {v0, v1}, Landroid/location/ILocationManager;->addGpsStatusListener(Landroid/location/IGpsStatusListener;)Z
 
     .line 1293
     iget-object v0, p0, Lcld/navi/mainframe/MainActivity;->mILM:Landroid/location/ILocationManager;
 
     iget-object v1, p0, Lcld/navi/mainframe/MainActivity;->mLocationProvider:Ljava/lang/String;
 
     iget-wide v2, p0, Lcld/navi/mainframe/MainActivity;->mMinTime:J
 
     iget v4, p0, Lcld/navi/mainframe/MainActivity;->mMinDistance:F
 
     iget-object v5, p0, Lcld/navi/mainframe/MainActivity;->mLocationListener:Lcld/navi/mainframe/MainActivity$NaviLocationListener;
 
     invoke- interface /range {v0 .. v5}, Landroid/location/ILocationManager;->requestLocationUpdates(Ljava/lang/String;JFLandroid/location/ILocationListener;)V
#就是这里,就是因为这里调用了老的函数,所以引发了错误
     :try_end_0
     . catch  Landroid/os/RemoteException; {:try_start_0 .. :try_end_0} :catch_0
 
     move v0, v8
 
     .line 1294
     goto  :goto_0
 
     .line 1296
     :catch_0
     move-exception v0
 
     move-object v6, v0
 
     .line 1298
     .local v6, e:Landroid/os/RemoteException;
     invoke-virtual {p0}, Lcld/navi/mainframe/MainActivity;->closeGPS()I
 
     move v0, v7
 
     .line 1299
     goto  :goto_0
 
     .end local v6           #e:Landroid/os/RemoteException;
     :cond_2
     move v0, v7
 
     .line 1304
     goto  :goto_0
.end method

把它改成以下,添加了几个参数,把参数改成最新的,哪两个新加的参数,一个为null,一个为false,就可以了

代码

 

硕美科G927 7.1声道 游戏耳机 5.1头戴式 USB电脑耳麦 CF专用正品








    本文转自无心之柳.NET博客园博客,原文链接:http://www.cnblogs.com/9527/archive/2011/02/08/1950000.html,如需转载请自行联系原作者






相关文章
|
1月前
|
移动开发 监控 安全
mPaaS常见问题之Android集成dexPatch热修复运行时候无法正常进行热更新如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
34 0
|
3月前
|
Linux Android开发
Android 正常运行所需的一系列 Linux 内核接口
Android 正常运行所需的一系列 Linux 内核接口
53 0
|
4月前
|
Java 关系型数据库 数据库
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
36 0
|
7月前
|
Java 数据库 Android开发
性能提示-流畅运行的Android应用
性能提示-流畅运行的Android应用
45 0
|
6月前
|
存储 传感器 定位技术
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
74 0
|
2月前
|
编译器 开发工具 Android开发
|
4月前
|
网络协议 Android开发 虚拟化
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
61 0
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
|
6月前
|
Android开发
Android推送运行报错的问题
Android推送运行报错的问题
42 2
|
8月前
|
XML Java Android开发
#4,Android Studio Android程序结构 工程目录介绍 文件作用 运行配置文件AndroidManifest.xml
#4,Android Studio Android程序结构 工程目录介绍 文件作用 运行配置文件AndroidManifest.xml
|
8月前
|
Android开发
Android项目中运行main方法,进行测试,配置方法
Android项目中运行main方法,进行测试,配置方法
131 0