編輯:關於Android編程
本文實例講述了Android編程之利用服務實現電話監聽的方法。分享給大家供大家參考,具體如下:
1. 啟動模擬器,部署應用
2. 利用模擬器控制器發送短信啟動服務(查看日志輸出判斷是否成功)
3. 向模擬器撥打電話,並接聽,掛斷電話後,利用文件管理查看對應的cache目錄或者sdcard中生成了3gp文件,並將其復制到pc中播放以驗證。
清單設置(一個receiver,一個service,若干權限)
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/> … <application …> <receiver android:name="BootBroadcastReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> <service android:name="PhoneListenerService" />
電話監聽器服務類:PhoneListenerService
package cn.class3g.phonelistener; ... public class PhoneListenerService extends Service { public IBinder onBind(Intent arg0) { return null; } public void onCreate() { super.onCreate(); Log.i("TAG", "服務啟動了"); // 對電話的來電狀態進行監聽 TelephonyManager telManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); // 注冊一個監聽器對電話狀態進行監聽 telManager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE); } private class MyPhoneStateListener extends PhoneStateListener { MediaRecorder recorder; File audioFile; String phoneNumber; public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE: /* 無任何狀態時 */ if (recorder != null) { recorder.stop();// 停止刻錄 recorder.reset();// 重設 recorder.release();// 刻錄完成一定要釋放資源 } break; case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起電話時 */ try { recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 設置音頻采集原 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 內容輸出格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 音頻編碼方式 // recorder.setOutputFile("/sdcard/myvoice.amr"); audioFile = new File( Environment.getExternalStorageDirectory(), phoneNumber + "_" + System.currentTimeMillis() + ".3gp"); recorder.setOutputFile(audioFile.getAbsolutePath()); Log.i("TAG", audioFile.getAbsolutePath()); recorder.prepare(); // 預期准備 recorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break; case TelephonyManager.CALL_STATE_RINGING: /* 電話進來時 */ phoneNumber = incomingNumber; break; default: break; } super.onCallStateChanged(state, incomingNumber); } } }
利用開機啟動廣播啟動服務(實驗環境中為了方便起見可以先改用短消息廣播)
開機啟動完成廣播action
復制代碼 代碼如下:<action android:name="android.intent.action.BOOT_COMPLETED"/>
package cn.class3g.phonelistener; ... public class BootBroadcastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.i("TAG", "廣播被接收了"); Intent serviceIntent = new Intent(context, PhoneListenerService.class); context.startService(serviceIntent); } }
希望本文所述對大家Android程序設計有所幫助。
機型適配的作用在於使Android應用程序適用於不同的國家語言、型號、尺寸和SDK版本等手機環境中,其主要功能和界面風格保持不變。手機適配主要包括三個方面:語言適配、屏幕
前文簡單介紹了Android中SurfaceView的基本使用,本文就來介紹一下SurfaceView與多線程的混搭。SurfaceView與多線程混搭,是為了防止動畫閃
這是“Android學習之路”系列文章的開篇,可能會讓大家有些失望——這篇文章中我們不介紹簡易版微信的實現(不過不是標題黨哦,我會在後續文章中一步步實現這個應用程序的)。
先看看效果圖:問題: 1、下拉列表(因為還沒看到這裡...) 2、標題欄顯示問題 3、按鈕的 Enable 設置 ....