欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)四大組件之實現(xiàn)電話攔截和電話錄音

 更新時間:2015年10月22日 09:07:51   作者:杰瑞教育  
這篇文章給大家介紹Android開發(fā)四大組件之實現(xiàn)電話攔截和電話錄音,涉及到android四大基本組件在程序中的應用,對android四大基本組件感興趣的朋友可以參考下本篇文章

一、問題描述

  使用BordercastReceiver和Service組件實現(xiàn)下述功能:

1.當手機處于來電狀態(tài),啟動監(jiān)聽服務,對來電進行監(jiān)聽錄音。

2.設置電話黑名單,當來電是黑名單電話,則直接掛斷。

  當撥打電話或電話狀態(tài)發(fā)生改變時,系統(tǒng)就會發(fā)出有序廣播,因此我們可以使用BordercastReceiver接受廣播,因BordercastReceiver執(zhí)行時間短不能執(zhí)行耗時任務也不能使用子線程,因此我們應啟動一個Service來監(jiān)聽電話并進行處理

二、加入AIDL文件

  Android沒有對外公開結束通話的API,要結束通話就必須使用AIDL與電話管理服務進行通信,并調用服務中的API實現(xiàn)結束通話,這樣需要android 源碼文件NeighboringCellInfo.aidl和ITelephony.aidl添加到項目中,如圖所示:

Android Studio 會自動編譯產生對應的類文件

三、編寫TelReceiver組件

public class TelReceiver extends BroadcastReceiver {
 public TelReceiver() {
 }

 @Override
 public void onReceive(Context context, Intent intent) {
 Intent i=new Intent(context,ListenPhoneService.class);
 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 i.setAction(intent.getAction());
 i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER,
  intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));//電話號碼
 i.putExtra(TelephonyManager.EXTRA_STATE,
  intent.getStringExtra(TelephonyManager.EXTRA_STATE));//電話狀態(tài)
 context.startService(i);//啟動服務
 }
}

  注冊廣播:

<receiver android:name=".TelReceiver" >
 <intent-filter android:priority="1000" >
 <action android:name="android.intent.action.PHONE_STATE" />
 <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
 </intent-filter>
</receiver>

四、編寫ListenPhoneService組件

public class ListenPhoneService extends Service {
 private AudioManager mAudioManager;
 private TelephonyManager tm;
 public ListenPhoneService() {
 }
 @Override
 public void onCreate() {
 super.onCreate();
 mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
 tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE);
 }
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
 if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去電廣播,android沒有來電話廣播
 }else{//去掉撥打電話就是來電狀態(tài)了
 //方法1
//獲得來電電話
// String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
//獲得電話狀態(tài)
// String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
//  Log.d("jereh", "incoming phone:" + number);
//  Log.d("jereh","call state:"+state);
//  TelephonyManager.EXTRA_STATE_IDLE: 沒有來電 或者 掛斷
//  TelephonyManagerEXTRA_STATE_OFFHOOK: 接起電話
//  TelephonyManager.EXTRA_STATE_RINGING:當電話呼入時,響鈴時
//  if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
//  if(number.equals("13280998858")){//攔截指定的電話號碼
//  mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
//  Log.d("jereh","電話被攔截");
//  stopCall();
//   mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢復鈴聲
//  }
//  }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
 //接起電話
//  recordCall();//開始錄音
//  }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
//  stopCall();//停止錄音
//  }
 //方法2
  // 設置一個監(jiān)聽器,監(jiān)聽電話狀態(tài)
  tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
 }
 return super.onStartCommand(intent, flags, startId);
 }
 /**
 * 掛斷電話
 */
 private void stopCall(){
 try {
  //Android的設計將ServiceManager隱藏了,所以只能使用反射機制獲得。
  Method method=Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
  IBinder binder=(IBinder)method.invoke(null, new Object[]{"phone"});//獲得系統(tǒng)電話服務
  ITelephony telephoney=ITelephony.Stub.asInterface(binder);
  telephoney.endCall();//掛斷電話
  stopSelf();//停止服務
 } catch (Exception e) {
  e.printStackTrace();
 }
 }
 PhoneStateListener listener=new PhoneStateListener(){
 @Override
 public void onCallStateChanged(int state,String incomingNumber){
  switch (state){
  //手機空閑了
  case TelephonyManager.CALL_STATE_IDLE:
   stopCall();//停止錄音
   break;
  //接起電話
  case TelephonyManager.CALL_STATE_OFFHOOK:
   recordCall();//開始錄音
   break;
  // 響鈴時
  case TelephonyManager.CALL_STATE_RINGING:
   Log.e("jereh", "來電號碼是:"+ incomingNumber);
   // 如果該號碼屬于黑名單
   if (incomingNumber.equals("123456")) {
   // 如果是黑名單,就進行屏蔽
   stopCall();
   }
   break;
  }
 }
 };
 /**
 * 停止錄音
 */
 private void stopRecord(){
 if(recording){
  recorder.stop();
  recorder.release();
  recording=false;
  stopSelf();//停止服務
 }
 }
 /**
 * 電話錄音
 */
 private MediaRecorder recorder;
 private boolean recording ;
 private void recordCall(){
 Log.d("jereh", "record calling")
 if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
 recorder=new MediaRecorder();
 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//讀麥克風的聲音
 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設置輸出格式
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 編碼方式
 File file=new File(Environment.getDownloadCacheDirectory().getAbsolutePath(),"recorder");
 if(!file.exists()){
  file.mkdir();
 }
 recorder.setOutputFile(file.getAbsolutePath() + "/"
 + System.currentTimeMillis() + "3gp");// 存放的位置是放在sd卡recorder目錄下
 try {
  recorder.prepare();
  recorder.start();
  recording=true;
 } catch (IOException e) {
  e.printStackTrace();
 }
 }
 }
 @Override
 public IBinder onBind(Intent intent) {
  throw new UnsupportedOperationException("Not yet implemented");
 }
}

Service XML配置

<service
 android:name=".ListenPhoneService"
 android:enabled="true"
 android:exported="true" >
</service>

五、最后別忘了一些權限的設置

<!-- 添加訪問手機電話狀態(tài)的權限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 撥打電話權限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 監(jiān)聽手機去電的權限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<!-- 在SDCard中創(chuàng)建與刪除文件權限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard寫入數(shù)據權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

好了,以上就是本文的全部所述,希望對大家學習android四大基本組件有所幫助,謝謝。

相關文章

  • adb無法連接雷電模擬器問題的解決方式

    adb無法連接雷電模擬器問題的解決方式

    雷電模擬器優(yōu)點是可設置的選項要比天天模擬器多,下面這篇文章主要給大家介紹了關于adb無法連接雷電模擬器問題的解決方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Android webview實現(xiàn)拍照的方法

    Android webview實現(xiàn)拍照的方法

    這篇文章主要介紹了Android webview實現(xiàn)拍照的方法的相關資料,希望通過本文能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • 淺析Android Service中實現(xiàn)彈出對話框的坑

    淺析Android Service中實現(xiàn)彈出對話框的坑

    這篇文章主要介紹了Android Service中實現(xiàn)彈出對話框的坑,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Android實現(xiàn)定時自動靜音小助手

    Android實現(xiàn)定時自動靜音小助手

    這篇文章主要為大家詳細介紹了Android實現(xiàn)定時自動靜音小助手,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android開發(fā)中LayoutInflater用法詳解

    Android開發(fā)中LayoutInflater用法詳解

    這篇文章主要介紹了Android開發(fā)中LayoutInflater用法,結合實例形式分析了LayoutInflater類的功能、作用、使用方法及相關注意事項,需要的朋友可以參考下
    2016-08-08
  • Android仿QQ聊天撒花特效 很真實

    Android仿QQ聊天撒花特效 很真實

    本文寫的這個特效,是關于聊天的,你肯定遇到過,就是你跟人家聊天的時候,比如發(fā)送應(么么噠),然后屏幕上全部就是表情了,今天我們就是做這個,撒花的特效,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 一分鐘實現(xiàn)Android遮罩引導視圖

    一分鐘實現(xiàn)Android遮罩引導視圖

    本文通過一分鐘的時間教大家實現(xiàn)Android遮罩引導視圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Android 操作excel功能實例代碼

    Android 操作excel功能實例代碼

    這篇文章主要介紹了Android 操作excel功能實例代碼 ,需要的朋友可以參考下
    2017-01-01
  • Android自定義雙向進度條的實現(xiàn)代碼

    Android自定義雙向進度條的實現(xiàn)代碼

    本篇文章主要介紹了Android自定義雙向進度條的實現(xiàn)代碼,非常具有實用的價值,有興趣的同學一起來了解一下
    2017-09-09
  • Android中imageview.ScaleType使用方法詳細介紹

    Android中imageview.ScaleType使用方法詳細介紹

    這篇文章主要介紹了Android中imageview.ScaleType使用方法詳細介紹的相關資料,需要的朋友可以參考下
    2017-06-06

最新評論