1. 程式人生 > >Android呼叫ITelephony類的endCall()方法 【轉】

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

找到,這個方法適合沒有SDK原始碼檔案的開發者));
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呼叫ITelephonyendCall()方法

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操作即是將