访问Android内部RIL接口(一)
最近公司调研一个项目,目的需要在Android平台上发送AT指令到Modem获取相关信息或者进行设置。
没有做过Android项目, 但根据经验,Android应该跟windows mobile一样应该有一个RIL中间层,搜索了相关资料,果真如此。
接下来查看sdk,但没发现有访问RIL层的接口。
查看源代码android-2.2-froyo/com/android/internal/telephony/Phone.java
void
invokeOemRilRequestRaw(
byte
[] data, Message response);
void
invokeOemRilRequestStrings(String[] strings, Message response);
这两个接口就是我所需要的
但SDK中没有开放此接口。
找了很多资料,通过https://devmaze.wordpress.com/category/android-2/ 上的方法,终于在eclipse里可以访问此接口了
通过Phone localPhone = PhoneFactory.getDefaultPhone();可以得到此接口实例,但问题来了,看看getDefaultPhone()的源代码
153 | public static Phone getDefaultPhone() { |
154 | if (sLooper != Looper.myLooper()) { |
155 | throw new RuntimeException( |
156 | "PhoneFactory.getDefaultPhone must be called from Looper thread" ); |
157 | } |
158 |
159 | if (!sMadeDefaults) { |
160 | throw new IllegalStateException( "Default phones haven't been made yet!" ); |
161 | } |
162 | return sProxyPhone; |
163 | } |
这样在Activity里尝试拿Phone接口会抛出"PhoneFactory.getDefaultPhone must be called from Looper thread“
在android手机里,我的是三星i5700,有一个工程模式*#*#197328640#*#*,进去后可以获得一些信号的信息,这些信息,就是通过特定的AT指令拿到的。
adb里pull serviceModeApp.akp出来,解开看看源代码,也是通过 PhoneFactory.getDefaultPhone()来取得Phone接口的,为什么我的就不行?
再看看它的 Manifest,看到android:process="com.android.phone",还有android:sharedUserId="android.uid.system"
相关资料说android:sharedUserId="android.uid.system" 需要在源代码编译时才能加进去,不知是否真实,寻求下一个解决方案中。。。。