Android呼叫ITelephony類的endCall()方法 【轉】
1. 在src下新建一個包:com.android.internal.telephony(和ITelephony.aidl 中 package 宣告的包名一樣);
2. 然後從系統原始碼中把ITelephony.aidl檔案拷貝到 com.android.internal.telephony包下。(也可以先新建一個ITelephony.aidl, 然後再把內容拷貝進去(ITelephony.aidl檔案內容可以在http://www.netmite.com/android/mydroid/1.5/frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl
3. 在src下新建一個包:android.telephony, 然後新建一個NeighboringCellInfo.aidl,其內容為:
package android.telephony;
parcelable NeighboringCellInfo;
4.從私有方法中獲取ITelephony: 程式碼如下。
tManager = (TelephonyManager)
this.getSystemService(Context.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(tManager, (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();
}
PhoneCallActivity .java
package com.geolo.pcp.android;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Log;
public class PhoneCallActivity extends Activity{
private PhoneCallListener mPhoneCallListener;
private TelephonyManager mTelephonyManager;
//private PhoneStateListener mPhoneStateListener;
private AudioManager mAudioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPhoneCallListener = new PhoneCallListener();
mTelephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mTelephonyManager.listen(mPhoneCallListener, PhoneCallListener.LISTEN_CALL_STATE);
//mTelephonyManager.listen(mPhoneCallListener, PhoneCallListener.LISTEN_SERVICE_STATE);
//mTelephonyManager.listen(mPhoneCallListener, PhoneCallListener.LISTEN_DATA_CONNECTION_STATE);
}
/**
* 利用JAVA反射機制呼叫ITelephony的endCall()結束通話。
*/
private void endCall() {
// 初始化iTelephony
Class<TelephonyManager> c = TelephonyManager.class;
Method getITelephonyMethod = null;
try {
// 獲取所有public/private/protected/預設
// 方法的函式,如果只需要獲取public方法,則可以呼叫getMethod.
getITelephonyMethod = c.getDeclaredMethod("getITelephony",(Class[]) null);
// 將要執行的方法物件設定是否進行訪問檢查,也就是說對於public/private/protected/預設
// 我們是否能夠訪問。值為 true 則指示反射的物件在使用時應該取消 Java 語言訪問檢查。值為 false
// 則指示反射的物件應該實施 Java 語言訪問檢查。
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null);
iTelephony.endCall();
Log.v(this.getClass().getName(), "endCall......");
} catch (Exception e) {
Log.e(this.getClass().getName(), "endCallError", e);
}
}
public class PhoneCallListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Log.v(this.getClass().getName(), "onCallStateChanged-state: " + state);
Log.v(this.getClass().getName(), "onCallStateChanged-incomingNumber: " + incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//CALL_STATE_OFFHOOK;
break;
case TelephonyManager.CALL_STATE_RINGING:
if ("123456".equals(incomingNumber)){
//mTelephonyService.endCall();
endCall();
}else{
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
break;
default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
@Override
public void onDataConnectionStateChanged(int state) {
Log.v(this.getClass().getName(), "onDataConnectionStateChanged-state: " + state);
super.onDataConnectionStateChanged(state);
}
@Override
public void onDataConnectionStateChanged(int state, int networkType) {
Log.v(this.getClass().getName(), "onDataConnectionStateChanged-state: " + state);
Log.v(this.getClass().getName(), "onDataConnectionStateChanged-networkType: " + networkType);
super.onDataConnectionStateChanged(state, networkType);
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
Log.v(this.getClass().getName(), "onServiceStateChanged-ServiceState: " + serviceState);
super.onServiceStateChanged(serviceState);
}
@Override
public void onSignalStrengthChanged(int asu) {
Log.v(this.getClass().getName(), "onSignalStrengthChanged-asu: " + asu);
super.onSignalStrengthChanged(asu);
}
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
Log.v(this.getClass().getName(), "onSignalStrengthsChanged-signalStrength: " + signalStrength);
super.onSignalStrengthsChanged(signalStrength);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geolo.pcp.android" android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".PhoneCallActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
</manifest>
相關推薦
Android呼叫ITelephony類的endCall()方法 【轉】
1. 在src下新建一個包:com.android.internal.telephony(和ITelephony.aidl 中 package 宣告的包名一樣); 2. 然後從系統原始碼中把ITelephony.aidl檔案拷貝到 com.android.intern
android 呼叫一個類的方法
基礎忘記了,罪過,,,想呼叫一個類裡的方法,怎麼也不提示那個方法名,才知道沒加static不加static,就要new 出來這個類的例項,要麼加static1.通過new一個物件,然後用物件來呼叫另一個類中的方法。 2.如果是靜態類,那麼可以直接用類名.方法()的方式呼叫記
Delphi 導出數據至Excel的7種方法【轉】
dbase cas excel classes date pbo item 方式 down 轉自:http://blog.csdn.net/zang141588761/article/details/52275948 一; delphi 快速導出excel u
dpkg: error processing package bluez (--configure) 解決方法【轉】
operation proc addition too opera report add message ace 轉自:http://blog.csdn.net/heray1990/article/details/47803541 在 Ubuntu 執行 sudo apt
C++中三種創建對象的方法【轉】
內存 stream self 一般來說 ron ref 支持 內存碎片 搜索 我們都知道C++中有三種創建對象的方法,如下: #include <iostream> using namespace std; class A { private: in
軟件項目中的成本構成及估算方法【轉】
一個 發生 折舊費 art 載體 計算機 需求 復雜度 content 隨著知識經濟、信息時代的來臨,計算機軟件業迅猛發展。商品化、資本化、資產化的計算機軟件的價值 評估的社會需求也日益增多,而且有越來越多的趨勢。由於系統軟件通常是一些規模大、復雜程度高的人一 機系統,因此
軟件開發成本估算方法【轉】
ec2 結果 div 列表 持續時間 整理 str 似的 cti 轉自:http://hi.baidu.com/wangziming/blog/item/d8ee34010b18cf0e7bec2c4b.html 我的學習感悟:對於這個並不懂,尤其是什麽靜態單變
各瀏覽器禁用某網站JS腳本的方法 【轉】
per gin width aaa all firefox nal opera 腳本 某些網站,經常會加載一些非常討厭的JS腳本,如果我們想禁止這個網站的JS腳本,可以使用下面的方法: 一、IE瀏覽器 1、在Internet選項中,選擇安全選項卡,然後點擊受限制的站點,
分區工具parted的詳解及常用分區使用方法【轉】
ima nbsp 磁盤 很好 main adding ext3 當前 padding 來源:http://blog.51cto.com/zhangmingqian/1068779 分區工具parted的詳解及常用分區使用方法 一、 parted的用途
學習的方法【轉】
時間 中大 思想 高級 一個 平時 能夠 data body 我主張,在具備基礎之後,學習任何新東西,都要抓住主線,突出重點。對於關鍵理論的學習,要集中精力,速戰速決。而旁枝末節和非本質性的知識內容,完全可以留給實踐去零敲碎打。原因是這樣的,任何一個高級的知識內容,其中都只
Mysql處理海量數據時的一些優化查詢速度方法【轉】
有意義 最好 普通 drop git .com war 解決方案 臨時 最近一段時間由於工作需要,開始關註針對Mysql數據庫的select查詢語句的相關優化方法。由於在參與的實際項目中發現當mysql表的數據量達到百萬級時,普通SQL查詢效率呈直線下降,而且如果where
vscode中檢測代碼中的空白行並去除的方法【轉】
圖片 nts ctrl+h 空白行 正則匹配 term .net 替換 fcm 按下ctrl+h鍵進行正則匹配:^\s*(?=\r?$)\n 然後直接替換,再看代碼發現空行已經不見了。vscode中檢測代碼中的空白行並去除的方法【轉】
python的pymysql使用方法【轉】
提交 gda bubuko pymysql swd 數據庫 delet 參數 for 前言 pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同。但目前pymysql支持python3.x而後者不支持3.x版本。 本文測試python版本
多執行緒記憶體問題分析之mprotect方法【轉】
轉自:https://blog.csdn.net/agwtpcbox/article/details/53230664 http://www.yebangyu.org/blog/2016/02/01/detectmemoryghostinmultithread/ 多執行緒中的記憶體問題,一直被認為是噩夢般
Android微信智慧心跳方案【轉】
轉自https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb8123f1b5ab58810ac8bc5994 前言:在13年11月中旬時,因為基礎元件組人手緊張
hive中文字符亂碼 解決方法【轉】
為我 如果 mysql blog res mys shake 如何 color 一.個人初始開發環境的基本情況以及Hive元數據庫說明 ①hive的元數據庫改成了mysql(安裝完mysql之後也沒有進行其它別的設置) ②hive-site.xml中設置元數據庫對應的配
pt-table-checksum 使用方法【轉】
27. pt-table-checksum27.1 pt-table-checksum 作用 主要用來檢查主從資料是否一致,原理即在主庫執行把表每行的列通過concat函式進行拼接,然後對拼接的值進行hash,並把該動作通過binlog傳遞到從庫,從而在從庫上也執行相關操作(pt-table-ch
WinCE程式除錯方法【轉】
剛剛接觸WinCE程式設計,感覺大部分跟WinForm一樣。剛開始的時候,不知道怎麼進行斷點除錯,後來同事告訴我,可以直接連線進行斷點除錯,一試之下,果然好用,所以拿出來分享一下。必備工具:Microsoft ActiveSync,該工具主要用於WinCE裝置和Windows Mobile系統的手機跟PC進行
Git衝突與解決方法【轉】 Git衝突與解決方法
本文轉載自:https://www.cnblogs.com/gavincoder/p/9071959.html Git衝突與解決方法 1、git衝突的場景 情景一:多個分支程式碼合併到一個分支時; 情景二:多個分支向同一個遠端分支推送程式碼時; 實際上,push操作即是將