❶ 怎樣通過代碼實現呼叫轉移
原理剖析:
1 這個問題以前困擾了我很久,前天在地鐵上突發奇想,猛然醒悟,回家測試,ok
2 簡訊防火牆利用簡訊廣播接收者,過濾簡訊,終止黑名單發來的簡訊廣播即可,較為簡單,不說了
3 電話防火牆比較復雜,我當初本來已經實現了,可是老想著再完美一點,搞來搞去,總是實現不了,後來才知道,原來360做得也並不是完美的。他們是用了
a 在android1.0後,google很執著的關閉了終止電話的endcall的api,但是實際上這個方法仍然在電話服務裡面存在著,所以,我們可以利用java的反射原理將其獲取出來。電話服務是另外一個進程,所以我們需要用到aidl不同進程的通信
b endcall方法獲得後,在onCallStateChanged(別跟我說你不知道這個是什麼)方法對來電狀態進行監聽,如果發現時黑名單號碼,先靜音,然後調用endcall方法終止
c 執行endcall方法後,默認是提示忙音的,如果你想要提示別的,可以通過來電轉移來實現。你可以激發其它的意圖,比如移動號程序控制撥打**67#電話號碼#等進行呼叫轉移,你故意轉移到一個停機的好,黑名單的撥打著將聽到停機的提示音,你轉移到關機的好,人家也會聽到關機的提示音,我當初就是在這里想叉了,shit,浪費了好多天,一直在糾結
d 如果你不能執行呼叫轉移,那應該是你的運營商不支持,你打客服問問怎麼執行呼叫轉移,反正我有移動和電信的手機,都是沒問題的
e 有些機器不給力,你並不一定能獲取到來電手機號,比如如果你是華為的什麼c8500或c8600,那麼我可以告訴你,太不給力了,十之八九你獲取不到來電手機(簡訊可以),我的一個三星i5700獲取是沒問題的,如果你試驗不成功,建議你先system.out一下你是否是獲取到了手機號了
公司完成的東西,不方便公開代碼,重點代碼我貼出來
反射的代碼:
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();
復制代碼呼叫轉移設置的代碼:
String str1 = "tel:";
String str2 = "**67*13810538911%23";//撥打這個手機將產生空號 移動的做法
//其實就是設置需要轉移的代碼
Intent localIntent = new Intent();
localIntent.setAction("android.intent.action.CALL");
System.out.println("start new Intent first...");
Uri localUri = Uri.parse(str1 + str2);
localIntent.setData(localUri);
startActivity(localIntent);
System.out.println("start new Intent end...");
復制代碼靜音的,記住靜音在黑名單電話響起時,恢復在掛斷電話後,記得恢復
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
audioManager.getStreamVolume(AudioManager.STREAM_RING);
}