溫馨提示×

溫馨提示×

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

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

Android中怎么實(shí)現(xiàn)電話攔截和電話錄音功能

發(fā)布時(shí)間:2021-08-12 14:11:04 來源:億速云 閱讀:179 作者:Leah 欄目:移動(dòng)開發(fā)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Android中怎么實(shí)現(xiàn)電話攔截和電話錄音功能,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

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

2.設(shè)置電話黑名單,當(dāng)來電是黑名單電話,則直接掛斷。

當(dāng)撥打電話或電話狀態(tài)發(fā)生改變時(shí),系統(tǒng)就會(huì)發(fā)出有序廣播,因此我們可以使用BordercastReceiver接受廣播,因BordercastReceiver執(zhí)行時(shí)間短不能執(zhí)行耗時(shí)任務(wù)也不能使用子線程,因此我們應(yīng)啟動(dòng)一個(gè)Service來監(jiān)聽電話并進(jìn)行處理
二、加入AIDL文件

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

Android Studio 會(huì)自動(dòng)編譯產(chǎn)生對應(yīng)的類文件
三、編寫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));//電話號(hào)碼 

  11. i.putExtra(TelephonyManager.EXTRA_STATE, 

  12. intent.getStringExtra(TelephonyManager.EXTRA_STATE));//電話狀態(tài) 

  13. context.startService(i);//啟動(dòng)服務(wù) 

  14. }

注冊廣播:

<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:當(dāng)電話呼入時(shí),響鈴時(shí) // if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ // if(number.equals("13280998858")){//攔截指定的電話號(hào)碼 // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); // Log.d("jereh","電話被攔截"); // stopCall(); // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢復(fù)鈴聲 // } // }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //接起電話 // recordCall();//開始錄音 // }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ // stopCall();//停止錄音 // } //方法2 // 設(shè)置一個(gè)監(jiān)聽器,監(jiān)聽電話狀態(tài) tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE); }  return super.onStartCommand(intent, flags, startId); }  /** * 掛斷電話 */ private void stopCall(){ try { //Android的設(shè)計(jì)將ServiceManager隱藏了,所以只能使用反射機(jī)制獲得。 Method method=Class.forName("android.os.ServiceManager").getMethod("getService", String.class); IBinder binder=(IBinder)method.invoke(null, new Object[]{"phone"});//獲得系統(tǒng)電話服務(wù) ITelephony telephoney=ITelephony.Stub.asInterface(binder); telephoney.endCall();//掛斷電話 stopSelf();//停止服務(wù) } catch (Exception e) { e.printStackTrace(); } } PhoneStateListener listener=new PhoneStateListener(){ @Override public void onCallStateChanged(int state,String incomingNumber){ switch (state){ //手機(jī)空閑了 case TelephonyManager.CALL_STATE_IDLE: stopCall();//停止錄音 break; //接起電話 case TelephonyManager.CALL_STATE_OFFHOOK: recordCall();//開始錄音 break; // 響鈴時(shí) case TelephonyManager.CALL_STATE_RINGING: Log.e("jereh", "來電號(hào)碼是:"+ incomingNumber); // 如果該號(hào)碼屬于黑名單 if (incomingNumber.equals("123456")) { // 如果是黑名單,就進(jìn)行屏蔽 stopCall(); } break; } } };  /** * 停止錄音 */ private void stopRecord(){ if(recording){ recorder.stop(); recorder.release(); recording=false; stopSelf();//停止服務(wù) } } /** * 電話錄音 */ 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);//讀麥克風(fēng)的聲音 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設(shè)置輸出格式 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"); } }  復(fù)制代碼  Service XML配置  <service android:name=".ListenPhoneService" android:enabled="true" android:exported="true" > </service>

五、***別忘了一些權(quán)限的設(shè)置

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

上述就是小編為大家分享的Android中怎么實(shí)現(xiàn)電話攔截和電話錄音功能了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI