设为首页 加入收藏

TOP

Android ITelephony endCall 挂断电话(一)
2014-11-24 13:04:48 来源: 作者: 【 】 浏览:1
Tags:Android ITelephony endCall 挂断 电话

由于系统API并没有给我们提供Itelephony这个电话管理服务类的接口使用,所以我们就得通过非正常手段来得到这个服务接口.(通过源码中的Itelephony.aidl来帮助我们生成电话管理服务接口,从而使我们能够使用到系统操作电话的功能).


例如>>结束通话:


1> 拷贝连同包结构将用到的Itelephony.aidl文件到你的项目中




要想挂断电话必须具有权限



下面来看看它是怎样的一个机制来操作电话管理功能的.


首先我们要知道所有的服务类都是在与服务管理器交互.服务管理器把所有的服务都纳入到它的管理范畴.而那些系统框架中的各个服务工具类底层都是与这个服务管理器大管家交互.


我是通过 ServiceManager这个系统框架提供服务管理器来得到Itelephony这个服务的Binder对象的


ServiceManager è系统框架上的所有服务都在后来运行着.要想得这些服务 就得通过 这个方法getService来获得


public static IBinder getService(String name) {//取得服务的Ibinder对象


try {


IBinder service = sCache.get(name);//先从缓存上找到这个服务的IBinder


if (service != null) {


return service;


} else { //如果为空就通过服务管理器接口实现类的getService方法来得到你想要的服务


return getIServiceManager().getService(name);


}


} catch(RemoteException e) {


Log.e(TAG, "error in getService", e);


}


return null;


}


public static void addService(Stringname, IBinder service){//往服务管理器中追加一个服务


public static IBinder checkService(String name)…..//检索已经存在的Service


public static String[] listServices() throwsRemoteException//列出当前以有的服务



下面来看看class ContextImplextends Context类


@Override


public Object getSystemService(String name) {


if (WINDOW_SERVICE.equals(name)) {


returnWindowManagerImpl.getDefault();


} else if (ACTIVITY_SERVICE.equals(name)) {


returngetActivityManager();


}else if (TELEPHONY_SERVICE.equals(name)) {


return getTelephonyManager();


…..以下略




private TelephonyManager getTelephonyManager() {


synchronized (mSync) {


if (mTelephonyManager == null) {


mTelephonyManager = new TelephonyManager(getOuterContext());


}


}


return mTelephonyManager;


}


以下是TelephonyManager类的构造方法


/** @hide */


public TelephonyManager(Context context) {


mContext = context;


mRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(


"telephony.registry"));


}


privateIPhoneSubInfo getSubscriberInfo() {


// get it each time because that process crashes a lot


returnIPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo"));


}


private ITelephony getITelephony() {


return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));


}


public void listen(PhoneStateListener listener, int events) {


String pkgForDebug = mContext != null mContext.getPackageName() : "";


try {


Boolean notifyNow =(getITelephony() != null);


mRegistry.listen(pkgForDebug, listener.callback, events,notifyNow);


} catch(RemoteException ex) {


// system process dead


} catch(NullPointerException ex) {


// system process dead


}


}



在TelephonyManager类中只是通过服务管理器来得到不同的具体服务者进而提供电话的一些基本信息和注册对电话状态监听的回调, 并没有提供给可以挂断电话的功能


那系统是怎样挂断电话呢…


最后没有找到有挂断电话的功能方法,但是在ITelephony.aidl文件中找到了


/**


* End call or go to the Home screen


*


* @return whether it hung up


*/


booleanendCall();


我们知道AIDL文件是Android接口描述语言。Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.这种以跨进程访问的服务称为AIDL(Android Interface Definition Lan

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android getResources的作用和需.. 下一篇Android之世面上程序锁的实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Announcing October (2025-12-24 15:18:16)
·MySQL有什么推荐的学 (2025-12-24 15:18:13)
·到底应该用MySQL还是 (2025-12-24 15:18:11)
·进入Linux世界大门的 (2025-12-24 14:51:47)
·Download Linux | Li (2025-12-24 14:51:44)