最近公司调研一个项目,目的需要在Android平台上发送AT指令到Modem获取相关信息或者进行设置。

没有做过Android项目, 但根据经验,Android应该跟windows mobile一样应该有一个RIL中间层,搜索了相关资料,果真如此。

接下来查看sdk,但没发现有访问RIL层的接口。

查看源代码android-2.2-froyo/com/android/internal/telephony/Phone.java

voidinvokeOemRilRequestRaw(byte[] data, Message response);

voidinvokeOemRilRequestStrings(String[] strings, Message response);

这两个接口就是我所需要的

但SDK中没有开放此接口。

找了很多资料,通过https://devmaze.wordpress.com/category/android-2/上的方法,终于在eclipse里可以访问此接口了

通过Phone localPhone = PhoneFactory.getDefaultPhone();可以得到此接口实例,但问题来了,看看getDefaultPhone()的源代码

153 publicstaticPhone getDefaultPhone() {
154 if(sLooper != Looper.myLooper()) {
155 thrownewRuntimeException(
156 "PhoneFactory.getDefaultPhone must be called from Looper thread");
157 }
158
159 if(!sMadeDefaults) {
160 thrownewIllegalStateException("Default phones haven't been made yet!");
161 }
162 returnsProxyPhone;
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"需要在源代码编译时才能加进去,不知是否真实,寻求下一个解决方案中。。。。

更多相关文章

  1. ubuntu下载android源代码
  2. Android动态加载技术初探
  3. Android(安卓)框架层为IMountService 增加新接口
  4. Android应用程序启动过程源代码分析
  5. Android(安卓)StagefrightPlayer
  6. 最简单的基于FFmpeg的移动端例子附件:SDL Android(安卓)HelloWorl
  7. 最简单的基于FFmpeg的移动端例子:Android(安卓)HelloWorld
  8. aidl
  9. 活用Android的Message Queue(2)

随机推荐

  1. N 个 Android(安卓)项目源码
  2. Android TextView 设置背景半透明,文字不
  3. Android(安卓)运行时给动态加载的图标按
  4. Android 使用 Application
  5. Android(六)通知、样式、主题、HTML
  6. 四大组件之服务(Service)
  7. DB Usage Complete / ADB 用法大全(转自g
  8. Android调用平台功能具体技巧分享
  9. [Android1.6]动态添加View的问题
  10. Android Studio 1.3 正式发布