監聽來電且錄音


功能:監聽來電:當在通話狀態時開啟錄音器
錄取通話聲音需要權限:<uses-permission android:name="android.permission.RECORD_AUDIO"/>
執行音頻捕獲的步驟:Audio Capture(從文檔中直接翻譯過來的)
1.android.media.MediaRecorder的創建一個新的實例。
2.使用MediaRecorder.setAudioSource設置音頻源()。你可能會想useMediaRecorder.AudioSource.MIC。(設置音頻源為麥克風)
3.設置輸出文件格式使用MediaRecorder.setOutputFormat()。
4.設置輸出文件名稱使用MediaRecorder.setOutputFile()。
5.設置音頻編碼器使用MediaRecorder.setAudioEncoder()。
6.MediaRecorder實例上調用MediaRecorder.prepare()。
7.開始音頻捕捉,叫MediaRecorder.start()。
8.停止音頻捕捉,叫MediaRecorder.stop()。
9.當你完成了MediaRecorder實例,調用MediaRecorder.release()。
CallingMediaRecorder.release()總是建議立即免費資源。

服務類:

public class PhoneListenService extends Service {
    private TelephonyManager tm;//電話管理者
    private MyListener listener;//監聽器
    private MediaRecorder mr;//錄音機
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //得到電話管理器
        tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        listener = new MyListener();//設置監聽器
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//監聽電話的狀態
        System.out.println("開啟了服務");
    }
    
    class MyListener extends PhoneStateListener{

        @Override//當電話的呼叫狀態發生改變時回調的方法
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            //start:為0代表空閑,1代表來電,2代表在通話
            System.out.println("電話狀態發生變化:"+state+"  打進來的號碼:"+incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE://=0
                if(mr!=null){
                    //第八步:停止錄音
                    mr.stop();
                    //第九步:釋放資源
                    mr.release();
                }
                break;
            case TelephonyManager.CALL_STATE_RINGING://=1
                    System.out.println("來電話了");        
                            break;
            case TelephonyManager.CALL_STATE_OFFHOOK://=2
                try {
                    mr = new MediaRecorder();
                    //第二步:設置音頻源  如果是麥克風 音頻源為:.MIC
                    mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
                    //第三步:設置錄制的文件格式
                    mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                    //第四步:設置輸出文件名稱使用MediaRecorder.setOutputFile()。
                    File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");
                    mr.setOutputFile(file.getAbsolutePath());
                    //第五步:設置音頻編碼器使用MediaRecorder.setAudioEncoder()。
                    mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                    //第六步:准備錄制
                    mr.prepare();
                    //第七步:開始音頻捕捉
                    mr.start();
                }catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            default:
                break;
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        tm.listen(listener, PhoneStateListener.LISTEN_NONE);//取消監聽
        listener=null;
        System.out.println("關閉了服務");
    }
}

MainActivity:

//監聽電話的狀態需要讀取電話狀態的權限 
//<uses-permission android:name="android.permission.READ_PHONE_STATE" />
public class MainActivity extends Activity implements OnClickListener {
    private Button start;
    private Button stop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop);
        start.setOnClickListener(this);
        stop.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        Intent intent=new Intent(this, PhoneListenService.class);
        switch (v.getId()) {
            case R.id.start://開啟服務
                startService(intent);
                break;
            case R.id.stop://關閉服務
                stopService(intent);
                break;
            default:
                break;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM