[转载]调用Android隐藏类(系统aidl文件)

来源:互联网 发布:表格文字识别软件 编辑:程序博客网 时间:2024/04/29 17:06
Android没有对外公开结束通话的API,如果需要结束通话,必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,方法如下:
       1> 从Android的源代码中拷贝以下文件到项目中:
       com.android.internal.telephony包下的ITelephony.aidl  (对应 Android 版本源码目录下 basetelephonyjavacomandroidinternaltelephony目录下)
       android.telephony包下的NeighboringCellInfo.aidl
       注意:需要在项目中建立对应的包名存放上述两个aidl文件,
 
       2> 调用ITelephony.endCall()结束通话:
              Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
              IBinder binder = (IBinder)method.invoke(null, new Object[]{TELEPHONY_SERVICE});
              ITelephony telephony = ITelephony.Stub.asInterface(binder);
              telephony.endCall();
        3> 以上只是ITelephony 的用法之一。可应用于实现电话的黑名单功能 -- 监听电话来电状态,判断其若是黑名单号码,即用上面所示当时挂断电话。
             另外还有其它很多实用的方法,例如,其 call 方法可以直接拨打出电话,获取电话呼叫状态等方法,本人并没有深入研究。
       在清单文件AndroidManifest.xml中添加权限:
       <uses-permission android:name="android.permission.CALL_PHONE" />

      4>使用android系统开发:
      private INotificationManager im = null;
ServiceConnection sc = new ServiceConnection(){
public void onServiceConnected(ComponentName cn, IBinder ib) {
  im = INotificationManager.Stub.asInterface(ServiceManager.getService("notification"));  //此方法在android  sdk开发不可                                                                                                                                                                                  //用,在系统开发下可行。
}
public void onServiceDisconnected(ComponentName cn) { }
};