最近公司调研一个项目,目的需要在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中没有开放此接口。
找了很多资料,终于在eclipse里可以访问此接口了通过Phone localPhone = PhoneFactory.getDefaultPhone();可以得到此接口实例,但问题来了,看看getDefaultPhone()的源代码
     public static Phone getDefaultPhone() {
        if (sLooper != Looper.myLooper()) {
           throw new RuntimeException(
                "PhoneFactory.getDefaultPhone must be called from Looper thread");
         }       if (!sMadeDefaults) {             throw new IllegalStateException("Default phones haven't been made yet!");
       }
       return sProxyPhone;
     }这样在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.   

    Android同样有RIL层,如果对这层有了解的话直接看RIL的java文件就可以了。
      

  2.   

    lz分析的都对,RIL掌管AT command的收发,服务rild就是那个中间层。
    一定是权限问题
      

  3.   

    可以试试用JNI 直接调用其c函数
      

  4.   


    Phone RIl层的代码,只提供给系统Framework层的Phone架包调用的自己开放的应用程序没有获取权限,是无法访问接口的通过ADIL机制,在ServiceManager里注册个服务,提供应用接口,然后在Framework的Phone目录下,实现该接口功能,也即自己写个系统接口,试试
      

  5.   

    LZ ,我们也遇到这个问题,也是需要发送 AT 命令到 PCUI 口,但是 PCUI 口被 rild 占用了,除非 kill 掉 rild ,要不然我们做的工具也废了。我们是通过调用 so 库实现的。
      

  6.   

    Android的RIL是由Phone封装的,没有标准接口可以用,只能扩展Phone或rild。