首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

手机通话统制

2013-10-08 
手机通话控制看到网络上的牛人对手机通话的控制,有感而发,希望搞个能在手机接到电话时可以给对方播放一段

手机通话控制

看到网络上的牛人对手机通话的控制,有感而发,希望搞个能在手机接到电话时可以给对方播放一段音频。看了下源码,发现如果仅仅通过ITelephony.aidl的一些API似乎没有这个功能,难道要把这块的代码给扣出来进行修改吗,就是RIL.java那块。系统似乎没有给出这方面的功能API啊。
? ? RIL.java
public void
? ? acceptCall (Message result) {
? ?? ???RILRequest rr
? ?? ?? ?? ?? ? = RILRequest.obtain(RIL_REQUEST_ANSWER, result);
? ?? ???if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
? ?? ???send(rr);
? ? }

处理电话事件:
public void
? ?? ???handleMessage(Message msg) {
? ?? ?? ?? ?RILRequest rr = (RILRequest)(msg.obj);
? ?? ?? ?? ?RILRequest req = null;
? ?? ?? ?? ?switch (msg.what) {
? ?? ?? ?? ?? ? case EVENT_SEND:
? ?? ?? ?? ?? ?? ???/**
? ?? ?? ?? ?? ?? ?? ?* mRequestMessagePending++ already happened for every
? ?? ?? ?? ?? ?? ?? ?* EVENT_SEND, thus we must make sure
? ?? ?? ?? ?? ?? ?? ?* mRequestMessagePending-- happens once and only once
? ?? ?? ?? ?? ?? ?? ?*/
? ?? ?? ?? ?? ?? ???boolean alreadySubtracted = false;
? ?? ?? ?? ?? ?? ???try {
? ?? ?? ?? ?? ?? ?? ?? ?LocalSocket s;
? ?? ?? ?? ?? ?? ?? ?? ?s = mSocket;
? ?? ?? ?? ?? ?? ?? ?? ?if (s == null) {
? ?? ?? ?? ?? ?? ?? ?? ?? ? rr.onError(RADIO_NOT_AVAILABLE, null);
? ?? ?? ?? ?? ?? ?? ?? ?? ? rr.release();
? ?? ?? ?? ?? ?? ?? ?? ?? ? mRequestMessagesPending--;
? ?? ?? ?? ?? ?? ?? ?? ?? ? alreadySubtracted = true;
? ?? ?? ?? ?? ?? ?? ?? ?? ? return;
? ?? ?? ?? ?? ?? ?? ?? ?}
? ?? ?? ?? ?? ?? ?? ?? ?synchronized (mRequestsList) {
? ?? ?? ?? ?? ?? ?? ?? ?? ? mRequestsList.add(rr);
? ?? ?? ?? ?? ?? ?? ?? ?}
? ?? ?? ?? ?? ?? ?? ?? ?mRequestMessagesPending--;
? ?? ?? ?? ?? ?? ?? ?? ?alreadySubtracted = true;
? ?? ?? ?? ?? ?? ?? ?? ?byte[] data;
? ?? ?? ?? ?? ?? ?? ?? ?data = rr.mp.marshall();
? ?? ?? ?? ?? ?? ?? ?? ?rr.mp.recycle();
? ?? ?? ?? ?? ?? ?? ?? ?rr.mp = null;
? ?? ?? ?? ?? ?? ?? ?? ?if (data.length > RIL_MAX_COMMAND_BYTES) {
? ?? ?? ?? ?? ?? ?? ?? ?? ? throw new RuntimeException(
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?"Parcel larger than max bytes allowed! "
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? + data.length);
? ?? ?? ?? ?? ?? ?? ?? ?}
? ?? ?? ?? ?? ?? ?? ?? ?// parcel length in big endian
? ?? ?? ?? ?? ?? ?? ?? ?dataLength[0] = dataLength[1] = 0;
? ?? ?? ?? ?? ?? ?? ?? ?dataLength[2] = (byte)((data.length >> 8) & 0xff);
? ?? ?? ?? ?? ?? ?? ?? ?dataLength[3] = (byte)((data.length) & 0xff);
? ?? ?? ?? ?? ?? ?? ?? ?//Log.v(LOG_TAG, "writing packet: " + data.length + " bytes");
? ?? ?? ?? ?? ?? ?? ?? ?s.getOutputStream().write(dataLength);
? ?? ?? ?? ?? ?? ?? ?? ?s.getOutputStream().write(data);
? ?? ?? ?? ?? ?? ???} catch (IOException ex) {
? ?? ?? ?? ?? ?? ?? ?? ?Log.e(LOG_TAG, "IOException", ex);
? ?? ?? ?? ?? ?? ?? ?? ?req = findAndRemoveRequestFromList(rr.mSerial);
? ?? ?? ?? ?? ?? ?? ?? ?// make sure this request has not already been handled,
? ?? ?? ?? ?? ?? ?? ?? ?// eg, if RILReceiver cleared the list.
? ?? ?? ?? ?? ?? ?? ?? ?if (req != null || !alreadySubtracted) {
? ?? ?? ?? ?? ?? ?? ?? ?? ? rr.onError(RADIO_NOT_AVAILABLE, null);
? ?? ?? ?? ?? ?? ?? ?? ?? ? rr.release();
? ?? ?? ?? ?? ?? ?? ?? ?}
? ?? ?? ?? ?? ?? ???} catch (RuntimeException exc) {
? ?? ?? ?? ?? ?? ?? ?? ?Log.e(LOG_TAG, "Uncaught exception ", exc);
? ?? ?? ?? ?? ?? ?? ?? ?req = findAndRemoveRequestFromList(rr.mSerial);
? ?? ?? ?? ?? ?? ?? ?? ?// make sure this request has not already been handled,
? ?? ?? ?? ?? ?? ?? ?? ?// eg, if RILReceiver cleared the list.
? ?? ?? ?? ?? ?? ?? ?? ?if (req != null || !alreadySubtracted) {
? ?? ?? ?? ?? ?? ?? ?? ?? ? rr.onError(GENERIC_FAILURE, null);
? ?? ?? ?? ?? ?? ?? ?? ?? ? rr.release();
? ?? ?? ?? ?? ?? ?? ?? ?}
? ?? ?? ?? ?? ?? ???}
? ?? ?? ?? ?? ?? ???if (!alreadySubtracted) {
? ?? ?? ?? ?? ?? ?? ?? ?mRequestMessagesPending--;
? ?? ?? ?? ?? ?? ???}
? ?? ?? ?? ?? ?? ???break;
? ?? ?? ?? ?? ? case EVENT_WAKE_LOCK_TIMEOUT:
? ?? ?? ?? ?? ?? ???// Haven't heard back from the last request.??Assume we're
? ?? ?? ?? ?? ?? ???// not getting a response and??release the wake lock.
? ?? ?? ?? ?? ?? ???// TODO should we clean up mRequestList and mRequestPending
? ?? ?? ?? ?? ?? ???synchronized (mWakeLock) {
? ?? ?? ?? ?? ?? ?? ?? ?if (mWakeLock.isHeld()) {
? ?? ?? ?? ?? ?? ?? ?? ?? ? if (RILJ_LOGD) {
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???synchronized (mRequestsList) {
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?int count = mRequestsList.size();
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Log.d(LOG_TAG, "WAKE_LOCK_TIMEOUT " +
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? " mReqPending=" + mRequestMessagesPending +
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? " mRequestList=" + count);
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?for (int i = 0; i < count; i++) {
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? rr = mRequestsList.get(i);
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? Log.d(LOG_TAG, i + ": [" + rr.mSerial + "] " +
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???requestToString(rr.mRequest));
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?}
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
? ?? ?? ?? ?? ?? ?? ?? ?? ? }
? ?? ?? ?? ?? ?? ?? ?? ?? ? mWakeLock.release();
? ?? ?? ?? ?? ?? ?? ?? ?}
? ?? ?? ?? ?? ?? ???}
? ?? ?? ?? ?? ?? ???break;
? ?? ?? ?? ?}
? ?? ???}
? ? }
手机通话统制
特附一个简单的demo,根据感应加速度可以接电话的代码,甩下就可以接电话,环境2.0.
有没搞过这块的,交流下。

热点排行