http://dev.10086.cn/cmdn/bbs/thread-17136-1-1.html
最近看論壇上有人問如何掛斷電話,實際上1.1版本后.Google已經(jīng)把該API隱藏掉
今天看資料,發(fā)現(xiàn)可以通過AIDL(Android遠(yuǎn)程方法)及反射,調(diào)用hide API,廢話不多說了.附上過程
一:在你的項目中新建包com.android.internal.telephony,因為要使用AIDL,該包與ITelephony.aidl一致
在該包下新建文件ITelephony.aidl
首先
package com.android.internal.telephony; /* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * [url=http://www.apache.org/licenses/LICENSE-2.0]http://www.apache.org/licenses/LICENSE-2.0[/url] * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Interface used to interact with the phone. Mostly this is used by the * TelephonyManager class. A few places are still using this directly. * Please clean them up if possible and use TelephonyManager insteadl. * * {@hide} */ interface ITelephony { /** * End call or go to the Home screen * * @return whether it hung up */ boolean endCall(); /** * Answer the currently-ringing call. * * If there's already a current active call, that call will be * automatically put on hold. If both lines are currently in use, the * current active call will be ended. * * TODO: provide a flag to let the caller specify what policy to use * if both lines are in use. (The current behavior is hardwired to * "answer incoming, end ongoing", which is how the CALL button * is specced to behave.) * * TODO: this should be a oneway call (especially since it's called * directly from the key queue thread). */ void answerRingingCall(); }
之后會在gen下面自動生成ITelephony.java
二.通過反射生成ITelephony實例
TelephonyManager telMgr = (TelephonyManager)getSystemService( TELEPHONY_SERVICE); //初始化iTelephony Class <TelephonyManager> c = TelephonyManager.class; Method getITelephonyMethod = null; try { getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[])null); getITelephonyMethod.setAccessible(true); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[])null); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); }這樣可以調(diào)用iTelephony的endCall()方法
三.在AndroidManifest.xml中增加權(quán)限
<uses-permission android:name="android.permission.CALL_PHONE"/>