亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android實現接通和掛斷電話

發布時間:2020-08-21 01:52:02 來源:腳本之家 閱讀:837 作者:WillenWu 欄目:移動開發

本文實例為大家分享了android實現接通和掛斷電話的具體代碼,供大家參考,具體內容如下

關鍵代碼:【PhoneUtils類】

package com.ebupt.phonerecorddemo.server; 
 
import java.lang.reflect.Method; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.view.KeyEvent; 
 
import com.android.internal.telephony.ITelephony; 
 
public class PhoneUtils { 
 static String TAG = "PhoneUtils"; 
 /** 
  * 從TelephonyManager中實例化ITelephony,并返回 
  */ 
 static public ITelephony getITelephony(TelephonyManager telMgr) 
   throws Exception { 
  Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod( 
    "getITelephony"); 
  getITelephonyMethod.setAccessible(true);// 私有化函數也能使用 
  return (ITelephony) getITelephonyMethod.invoke(telMgr); 
 } 
  
 //自動接聽 
 public static void autoAnswerPhone(Context c,TelephonyManager tm) { 
  try { 
   Log.i(TAG, "autoAnswerPhone"); 
   ITelephony itelephony = getITelephony(tm); 
   // itelephony.silenceRinger(); 
   itelephony.answerRingingCall(); 
  } catch (Exception e) { 
   e.printStackTrace(); 
   try { 
    Log.e(TAG, "用于Android2.3及2.3以上的版本上"); 
    Intent intent = new Intent("android.intent.action.MEDIA_BUTTON"); 
    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, 
      KeyEvent.KEYCODE_HEADSETHOOK); 
    intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent); 
    c.sendOrderedBroadcast(intent, 
      "android.permission.CALL_PRIVILEGED"); 
    intent = new Intent("android.intent.action.MEDIA_BUTTON"); 
    keyEvent = new KeyEvent(KeyEvent.ACTION_UP, 
      KeyEvent.KEYCODE_HEADSETHOOK); 
    intent.putExtra("android.intent.extra.KEY_EVENT", keyEvent); 
    c.sendOrderedBroadcast(intent, 
      "android.permission.CALL_PRIVILEGED"); 
    Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG); 
    localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
    localIntent1.putExtra("state", 1); 
    localIntent1.putExtra("microphone", 1); 
    localIntent1.putExtra("name", "Headset"); 
    c.sendOrderedBroadcast(localIntent1, 
      "android.permission.CALL_PRIVILEGED"); 
    Intent localIntent2 = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    KeyEvent localKeyEvent1 = new KeyEvent(KeyEvent.ACTION_DOWN, 
      KeyEvent.KEYCODE_HEADSETHOOK); 
    localIntent2.putExtra("android.intent.extra.KEY_EVENT", 
      localKeyEvent1); 
    c.sendOrderedBroadcast(localIntent2, 
      "android.permission.CALL_PRIVILEGED"); 
    Intent localIntent3 = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    KeyEvent localKeyEvent2 = new KeyEvent(KeyEvent.ACTION_UP, 
      KeyEvent.KEYCODE_HEADSETHOOK); 
    localIntent3.putExtra("android.intent.extra.KEY_EVENT", 
      localKeyEvent2); 
    c.sendOrderedBroadcast(localIntent3, 
      "android.permission.CALL_PRIVILEGED"); 
    Intent localIntent4 = new Intent(Intent.ACTION_HEADSET_PLUG); 
    localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
    localIntent4.putExtra("state", 0); 
    localIntent4.putExtra("microphone", 1); 
    localIntent4.putExtra("name", "Headset"); 
    c.sendOrderedBroadcast(localIntent4, 
      "android.permission.CALL_PRIVILEGED"); 
   } catch (Exception e2) { 
    e2.printStackTrace(); 
    Intent meidaButtonIntent = new Intent( 
      Intent.ACTION_MEDIA_BUTTON); 
    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, 
      KeyEvent.KEYCODE_HEADSETHOOK); 
    meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); 
    c.sendOrderedBroadcast(meidaButtonIntent, null); 
   } 
  } 
 } 
  
 //自動掛斷 
 public static void endPhone(Context c,TelephonyManager tm) { 
  try { 
   Log.i(TAG, "endPhone"); 
   ITelephony iTelephony; 
   Method getITelephonyMethod = TelephonyManager.class 
     .getDeclaredMethod("getITelephony", (Class[]) null); 
   getITelephonyMethod.setAccessible(true); 
   iTelephony = (ITelephony) getITelephonyMethod.invoke(tm, 
     (Object[]) null); 
   // 掛斷電話 
   iTelephony.endCall(); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
 } 
 
} 

需要用到的ITelephony.aidl:

package com.android.internal.telephony; 
 /** 
 * 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 instead. 
 * {@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(); 
  
 /** 
  * Silence the ringer if an incoming call is currently ringing. 
  * (If vibrating, stop the vibrator also.) 
  * 
  * It's safe to call this if the ringer has already been silenced, or 
  * even if there's no incoming call. (If so, this method will do nothing.) 
  * 
  * TODO: this should be a oneway call too (see above). 
  *  (Actually *all* the methods here that return void can 
  *  probably be oneway.) 
  */ 
 void silenceRinger(); 
  
 /** 
  * Allow mobile data connections. 
  */ 
 boolean enableDataConnectivity(); 
 
 /** 
  * Disallow mobile data connections. 
  */ 
 boolean disableDataConnectivity(); 
 
 /** 
  * Report whether data connectivity is possible. 
  */ 
 boolean isDataConnectivityPossible(); 
} 

監聽通話廣播【PhoneReceiver.java】:

package com.ebupt.phonerecorddemo.server; 
 
import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
 
public class PhoneReceiver extends BroadcastReceiver { 
 String TAG = "PhoneReceiver"; 
 @Override 
 public void onReceive(Context context, Intent intent) { 
  TelephonyManager tm = (TelephonyManager) context 
    .getSystemService(Service.TELEPHONY_SERVICE); 
  switch (tm.getCallState()) { 
  case TelephonyManager.CALL_STATE_OFFHOOK:// 電話打進來接通狀態;電話打出時首先監聽到的狀態。 
   Log.i("onCallStateChanged", "CALL_STATE_OFFHOOK"); 
   break; 
  case TelephonyManager.CALL_STATE_RINGING:// 電話打進來狀態 
   Log.i("onCallStateChanged", "CALL_STATE_RINGING"); 
   PhoneUtils.autoAnswerPhone(context,tm); 
   break; 
  case TelephonyManager.CALL_STATE_IDLE:// 不管是電話打出去還是電話打進來都會監聽到的狀態。 
   Log.i("onCallStateChanged", "CALL_STATE_IDLE"); 
   break; 
  } 
 } 
 
  
} 

在上面類適當的地方加上掛斷或接通電話的代碼即可。

最后別忘記在AndroidManifest.xml里聲明和注冊權限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" > 
</uses-permission> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" > 
</uses-permission> 
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<receiver android:name="com.ebupt.phonerecorddemo.server.PhoneReceiver" > 
 <intent-filter android:priority="2147483647" > 
 <action android:name="android.intent.action.PHONE_STATE" > 
 </action> 
 </intent-filter> 
</receiver> 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榆社县| 长春市| 射阳县| 原阳县| 绩溪县| 尉犁县| 阿城市| 武冈市| 德庆县| 新和县| 平乡县| 友谊县| 慈溪市| 莱阳市| 铜陵市| 龙井市| 咸宁市| 沈丘县| 茶陵县| 杨浦区| 阿拉善盟| 和龙市| 襄汾县| 宣化县| 营山县| 雷州市| 本溪市| 大渡口区| 乐安县| 林西县| 韶关市| 深州市| 武汉市| 息烽县| 左权县| 淮北市| 焦作市| 灵山县| 腾冲县| 永登县| 迭部县|