成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android四大組件應用系列——實現電話攔截和電話錄音

移動開發 Android
當撥打電話或電話狀態發生改變時,系統就會發出有序廣播,因此我們可以使用BordercastReceiver接受廣播,因BordercastReceiver執行時間短不能執行耗時任務也不能使用子線程,因此我們應啟動一個Service來監聽電話并進行處理

[[152918]]

使用BordercastReceiver和Service組件實現下述功能:

1.當手機處于來電狀態,啟動監聽服務,對來電進行監聽錄音。

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

當撥打電話或電話狀態發生改變時,系統就會發出有序廣播,因此我們可以使用BordercastReceiver接受廣播,因BordercastReceiver執行時間短不能執行耗時任務也不能使用子線程,因此我們應啟動一個Service來監聽電話并進行處理
二、加入AIDL文件

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

 

Android Studio 會自動編譯產生對應的類文件
三、編寫TelReceiver組件
 

 

  1. public class TelReceiver extends BroadcastReceiver { 
  2. public TelReceiver() { 
  3.  
  4. @Override 
  5. public void onReceive(Context context, Intent intent) { 
  6. Intent i=new Intent(context,ListenPhoneService.class); 
  7. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  8. i.setAction(intent.getAction()); 
  9. i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, 
  10. intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));//電話號碼 
  11. i.putExtra(TelephonyManager.EXTRA_STATE, 
  12. intent.getStringExtra(TelephonyManager.EXTRA_STATE));//電話狀態 
  13. context.startService(i);//啟動服務 
  14. }

注冊廣播:

 

  1. <receiver android:name=".TelReceiver" > 
  2. <intent-filter android:priority="1000" > 
  3. <action android:name="android.intent.action.PHONE_STATE" /> 
  4. <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
  5. </intent-filter> 
  6. </receiver> 
四、編寫ListenPhoneService組件

 

  1. public class ListenPhoneService extends Service { 
  2. private AudioManager mAudioManager; 
  3. private TelephonyManager tm; 
  4. public ListenPhoneService() { 
  5.  
  6. @Override 
  7. public void onCreate() { 
  8. super.onCreate(); 
  9. mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 
  10. tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE); 
  11. @Override 
  12. public int onStartCommand(Intent intent, int flags, int startId) { 
  13. if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//去電廣播,android沒有來電話廣播 
  14. }else{//去掉撥打電話就是來電狀態了 
  15. //方法1 
  16. //獲得來電電話 
  17. // String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
  18. //獲得電話狀態 
  19. // String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
  20. // Log.d("jereh", "incoming phone:" + number); 
  21. // Log.d("jereh","call state:"+state); 
  22. // TelephonyManager.EXTRA_STATE_IDLE: 沒有來電 或者 掛斷 
  23. // TelephonyManagerEXTRA_STATE_OFFHOOK: 接起電話 
  24. // TelephonyManager.EXTRA_STATE_RINGING:當電話呼入時,響鈴時 
  25. // if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
  26. // if(number.equals("13280998858")){//攔截指定的電話號碼 
  27. // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
  28. // Log.d("jereh","電話被攔截"); 
  29. // stopCall(); 
  30. // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢復鈴聲 
  31. // } 
  32. // }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
  33. //接起電話 
  34. // recordCall();//開始錄音 
  35. // }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 
  36. // stopCall();//停止錄音 
  37. // } 
  38. //方法2 
  39. // 設置一個監聽器,監聽電話狀態 
  40. tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE); 
  41.  
  42. return super.onStartCommand(intent, flags, startId); 
  43.  
  44. /** 
  45. * 掛斷電話 
  46. */ 
  47. private void stopCall(){ 
  48. try { 
  49. //Android的設計將ServiceManager隱藏了,所以只能使用反射機制獲得。 
  50. Method method=Class.forName("android.os.ServiceManager").getMethod("getService", String.class); 
  51. IBinder binder=(IBinder)method.invoke(nullnew Object[]{"phone"});//獲得系統電話服務 
  52. ITelephony telephoney=ITelephony.Stub.asInterface(binder); 
  53. telephoney.endCall();//掛斷電話 
  54. stopSelf();//停止服務 
  55. catch (Exception e) { 
  56. e.printStackTrace(); 
  57. PhoneStateListener listener=new PhoneStateListener(){ 
  58. @Override 
  59. public void onCallStateChanged(int state,String incomingNumber){ 
  60. switch (state){ 
  61. //手機空閑了 
  62. case TelephonyManager.CALL_STATE_IDLE: 
  63. stopCall();//停止錄音 
  64. break
  65. //接起電話 
  66. case TelephonyManager.CALL_STATE_OFFHOOK: 
  67. recordCall();//開始錄音 
  68. break
  69. // 響鈴時 
  70. case TelephonyManager.CALL_STATE_RINGING: 
  71. Log.e("jereh""來電號碼是:"+ incomingNumber); 
  72. // 如果該號碼屬于黑名單 
  73. if (incomingNumber.equals("123456")) { 
  74. // 如果是黑名單,就進行屏蔽 
  75. stopCall(); 
  76. break
  77. }; 
  78.  
  79. /** 
  80. * 停止錄音 
  81. */ 
  82. private void stopRecord(){ 
  83. if(recording){ 
  84. recorder.stop(); 
  85. recorder.release(); 
  86. recording=false
  87. stopSelf();//停止服務 
  88. /** 
  89. * 電話錄音 
  90. */ 
  91. private MediaRecorder recorder; 
  92. private boolean recording ; 
  93. private void recordCall(){ 
  94. Log.d("jereh""record calling"
  95. if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 
  96. recorder=new MediaRecorder(); 
  97. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//讀麥克風的聲音 
  98. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設置輸出格式 
  99. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 編碼方式 
  100. File file=new File(Environment.getDownloadCacheDirectory().getAbsolutePath(),"recorder"); 
  101. if(!file.exists()){ 
  102. file.mkdir(); 
  103. recorder.setOutputFile(file.getAbsolutePath() + "/" 
  104. + System.currentTimeMillis() + "3gp");// 存放的位置是放在sd卡recorder目錄下 
  105. try { 
  106. recorder.prepare(); 
  107. recorder.start(); 
  108. recording=true
  109.  
  110. catch (IOException e) { 
  111. e.printStackTrace(); 
  112. @Override 
  113. public IBinder onBind(Intent intent) { 
  114. throw new UnsupportedOperationException("Not yet implemented"); 
  115.  
  116. 復制代碼 
  117.  
  118. Service XML配置 
  119.  
  120. <service 
  121. android:name=".ListenPhoneService" 
  122. android:enabled="true" 
  123. android:exported="true" > 
  124. </service> 

 

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

  1. <!-- 添加訪問手機電話狀態的權限 --> 
  2. <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
  3. <!-- 撥打電話權限 --> 
  4. <uses-permission android:name="android.permission.CALL_PHONE" /> 
  5. <!-- 監聽手機去電的權限 --> 
  6. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
  7. <!-- 在SDCard中創建與刪除文件權限 --> 
  8. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
  9. <!-- 往SDCard寫入數據權限 --> 
  10. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

 

責任編輯:chenqingxiang 來源: 博客園
相關推薦

2016-12-09 09:23:50

android組件Service

2014-03-27 15:34:55

Android組件Activity

2013-01-10 14:21:24

Android開發組件Activities

2009-03-26 08:28:17

AndroidGoogle移動OS

2014-07-31 10:57:15

Android組件Service

2014-03-27 15:57:45

Android組件Activity

2024-12-30 11:24:56

APMZipkinPinpoint

2010-08-05 10:22:46

Flex效果

2021-04-12 16:00:18

工業物聯網物聯網

2016-03-30 11:51:55

2010-08-26 13:17:13

margin負值

2019-03-14 09:47:50

Facebook宕機網絡攻擊

2015-07-17 09:50:16

Carthage優劣比較

2011-11-02 09:41:15

2010-11-22 15:25:08

2023-03-14 12:44:37

ChatGPT數字化轉型

2010-11-03 11:10:04

AndroidiPhone

2010-01-14 09:57:42

火狐Chrome

2017-03-17 19:48:01

人臉識別

2013-03-25 17:08:12

應用使用率
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品成人一区二区三区夜夜夜 | 久久成人一区 | 欧美精品免费观看二区 | 美女视频h | 久久另类视频 | 中文字幕久久精品 | 日韩欧美精品在线 | 午夜激情免费视频 | 久久夜视频 | av一区二区三区四区 | 亚洲国产精品久久久久久 | 超级黄色一级片 | 国产成人亚洲精品自产在线 | av成人在线观看 | 亚洲一区亚洲二区 | 中文字幕乱码一区二区三区 | 国产美女一区 | 夜夜艹 | 国产精品视频二区三区 | 精品免费国产一区二区三区四区 | 国产91在线 | 亚洲 | 91社区在线观看高清 | 久久久久国产一区二区 | 99r在线 | 欧美一级在线观看 | 一区视频 | 一级毛片免费完整视频 | 91福利在线导航 | 日本不卡一区二区三区 | 久久精品久久久久久 | 国产亚洲精品精品国产亚洲综合 | 亚洲不卡一 | 一区二区三区高清 | 久久精品99 | 免费在线观看黄色av | 综合一区二区三区 | 成人亚洲视频 | 亚洲一区视频在线 | 亚洲 欧美 日韩 在线 | 一级欧美| 天天色天天射天天干 |