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

在大安等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),營銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),大安網(wǎng)站建設(shè)費(fèi)用合理。
1.當(dāng)手機(jī)處于來電狀態(tài),啟動監(jiān)聽服務(wù),對來電進(jìn)行監(jiān)聽錄音。
2.設(shè)置電話黑名單,當(dāng)來電是黑名單電話,則直接掛斷。
當(dāng)撥打電話或電話狀態(tài)發(fā)生改變時,系統(tǒng)就會發(fā)出有序廣播,因此我們可以使用BordercastReceiver接受廣播,因BordercastReceiver執(zhí)行時間短不能執(zhí)行耗時任務(wù)也不能使用子線程,因此我們應(yīng)啟動一個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 會自動編譯產(chǎn)生對應(yīng)的類文件
三、編寫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);//啟動服務(wù)
- }
- }
注冊廣播:
四、編寫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)電話呼入時,響鈴時
- // 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);//恢復(fù)鈴聲
- // }
- // }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
- //接起電話
- // recordCall();//開始錄音
- // }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
- // stopCall();//停止錄音
- // }
- //方法2
- // 設(shè)置一個監(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;
- // 響鈴時
- case TelephonyManager.CALL_STATE_RINGING:
- Log.e("jereh", "來電號碼是:"+ incomingNumber);
- // 如果該號碼屬于黑名單
- 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配置
- android:name=".ListenPhoneService"
- android:enabled="true"
- android:exported="true" >
五、***別忘了一些權(quán)限的設(shè)置
網(wǎng)站題目:Android四大組件應(yīng)用系列——實(shí)現(xiàn)電話攔截和電話錄音
網(wǎng)頁URL:http://m.fisionsoft.com.cn/article/djhccci.html


咨詢
建站咨詢
