Android8.0電話監(jiān)聽(tīng)服務(wù)

1創(chuàng)建Service

package com.shiliu.callrecording;

import android.annotation.SuppressLint;

import android.annotation.TargetApi;

import android.app.Notification;

import android.app.NotificationChannel;

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.graphics.Color;

import android.media.FaceDetector;

import android.media.MediaPlayer;

import android.media.MediaRecorder;

import android.os.Binder;

import android.os.Build;

import android.os.Environment;

import android.os.IBinder;

import android.support.annotation.RequiresApi;

import android.support.v4.app.NotificationCompat;

import android.support.v4.app.TaskStackBuilder;

import android.telephony.PhoneStateListener;

import android.telephony.TelephonyManager;

import android.util.Log;

import android.widget.Toast;

import com.vondear.rxtool.view.RxToast;

import java.io.File;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import static android.support.v4.app.NotificationCompat.PRIORITY_MAX;

/**

* Created by Easzz on 2015/12/6.

*/

public class RecorderServiceextends Service {

private MediaRecorderrecorder;//錄音的一個(gè)實(shí)例

? ? //通過(guò)binder實(shí)現(xiàn)調(diào)用者client與Service之間的通信

? ? private NotificationCompat.Builderbuilder;

private NotificationManagernotificationManager;

private boolean isFirst =true;

public RecorderService() {

}

@Override

? ? public void onCreate() {

super.onCreate();

//如果API在26以上即版本為O則調(diào)用startForefround()方法啟動(dòng)服務(wù)

//? ? ? ? if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

? ? ? ? setForegroundService();

//? ? ? ? }else {

//

//? ? ? ? }

? ? }

/**

? ? * 通過(guò)通知啟動(dòng)服務(wù)

? ? */

? ? public void setForegroundService() {

//設(shè)定的通知渠道名稱(chēng)

? ? ? ? String channelName = getString(R.string.channel_name);

final String CHANNEL_ID ="com.appname.notification.channel";

//設(shè)置通知的重要程度

? ? ? ? int importance = NotificationManager.IMPORTANCE_LOW;

Intent mIntent =new Intent(this, MainActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(this,0, mIntent,0);

//在創(chuàng)建的通知渠道上發(fā)送通知

? ? ? ? builder =new NotificationCompat.Builder(this, CHANNEL_ID);

builder.setSmallIcon(R.mipmap.ic_launcher)//設(shè)置通知圖標(biāo)

? ? ? ? ? ? ? ? .setContentTitle("電話監(jiān)聽(tīng)")//設(shè)置通知標(biāo)題

? ? ? ? ? ? ? ? .setContentText("警告您的電話正在接受監(jiān)聽(tīng)")//設(shè)置通知內(nèi)容

? ? ? ? ? ? ? ? .setAutoCancel(true)//用戶觸摸時(shí),自動(dòng)關(guān)閉

? ? ? ? ? ? ? ? .setContentIntent(pendingIntent)

.setOngoing(true);//設(shè)置處于運(yùn)行狀態(tài)

? ? ? ? //向系統(tǒng)注冊(cè)通知渠道潮峦,注冊(cè)后不能改變重要性以及其他通知行為

? ? ? ? notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

//構(gòu)建通知渠道

? ? ? ? NotificationChannel channel =null;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

channel =new NotificationChannel(CHANNEL_ID, channelName, importance);

channel.setDescription("錄音");

notificationManager.createNotificationChannel(channel);

}

//將服務(wù)置于啟動(dòng)狀態(tài) NOTIFICATION_ID指的是創(chuàng)建的通知的ID

? ? ? ? startForeground(11,builder.build());

}

@Override

? ? public int onStartCommand(Intent intent,int flags,int startId) {

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

////? ? ? ? ? ? ? ? ? ? ? ? //啟動(dòng)監(jiān)聽(tīng).傳入一個(gè)listener和監(jiān)聽(tīng)的事件,

? ? ? ? tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);

return START_STICKY;

}

@Override

? ? public void onDestroy() {

super.onDestroy();

Log.e("TAG","service onDestroy");

notificationManager.cancel(11);

}

@Override

? ? public IBinder onBind(Intent intent) {

return null;

}

class MyListenerextends PhoneStateListener {

//在電話狀態(tài)改變的時(shí)候調(diào)用

? ? ? ? @Override

? ? ? ? public void onCallStateChanged(int state, String incomingNumber) {

super.onCallStateChanged(state, incomingNumber);

switch (state) {

case TelephonyManager.CALL_STATE_IDLE:

//空閑狀態(tài)

//? ? ? ? ? ? ? ? ? ? RxToast.showToast("通話中");

? ? ? ? ? ? ? ? ? ? if (isFirst) {

Toast.makeText(RecorderService.this,"開(kāi)始錄音", Toast.LENGTH_SHORT).show();

isFirst =false;

}else {

Toast.makeText(RecorderService.this,"掛斷電話", Toast.LENGTH_SHORT).show();

}

if (recorder !=null) {

recorder.stop();//停止錄音

? ? ? ? ? ? ? ? ? ? ? ? recorder.release();//釋放資源

? ? ? ? ? ? ? ? ? ? ? ? recorder =null;

}

break;

case TelephonyManager.CALL_STATE_RINGING:

Log.e("TAG","撥入電話,鈴聲響起");

Toast.makeText(RecorderService.this,"撥入電話,鈴聲響起", Toast.LENGTH_SHORT).show();

//? ? ? ? ? ? ? ? ? ? //響鈴狀態(tài)? 需要在響鈴狀態(tài)的時(shí)候初始化錄音服務(wù)

? ? ? ? ? ? ? ? ? ? if (recorder ==null) {

recorder =new MediaRecorder();//初始化錄音對(duì)象

? ? ? ? ? ? ? ? ? ? ? ? recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//設(shè)置錄音的輸入源(麥克)

? ? ? ? ? ? ? ? ? ? ? ? recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設(shè)置音頻格式(3gp)

? ? ? ? ? ? ? ? ? ? ? ? createRecorderFile();//創(chuàng)建保存錄音的文件夾

? ? ? ? ? ? ? ? ? ? ? ? recorder.setOutputFile("sdcard/recorder" +"/" + getCurrentTime() +".3gp");//設(shè)置錄音保存的文件

? ? ? ? ? ? ? ? ? ? ? ? recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//設(shè)置音頻編碼

? ? ? ? ? ? ? ? ? ? ? ? try {

recorder.prepare();//準(zhǔn)備錄音

? ? ? ? ? ? ? ? ? ? ? ? }catch (IOException e) {

e.printStackTrace();

}

}

break;

case TelephonyManager.CALL_STATE_OFFHOOK:

Toast.makeText(RecorderService.this,"啟動(dòng)錄音", Toast.LENGTH_SHORT).show();

//摘機(jī)狀態(tài)(接聽(tīng))

? ? ? ? ? ? ? ? ? ? if (recorder !=null) {

recorder.start();//接聽(tīng)的時(shí)候開(kāi)始錄音

? ? ? ? ? ? ? ? ? ? ? ? Log.e("TAG","開(kāi)始錄音");

}else {

recorder =new MediaRecorder();//初始化錄音對(duì)象

? ? ? ? ? ? ? ? ? ? ? ? recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//設(shè)置錄音的輸入源(麥克)

? ? ? ? ? ? ? ? ? ? ? ? recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設(shè)置音頻格式(3gp)

? ? ? ? ? ? ? ? ? ? ? ? recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

createRecorderFile();//創(chuàng)建保存錄音的文件夾

? ? ? ? ? ? ? ? ? ? ? ? recorder.setOutputFile("sdcard/recorder" +"/" + getCurrentTime() +".3gp");//設(shè)置錄音保存的文件

? ? ? ? ? ? ? ? ? ? ? ? try {

recorder.prepare();//準(zhǔn)備錄音

? ? ? ? ? ? ? ? ? ? ? ? }catch (IOException e) {

e.printStackTrace();

}

recorder.start();//接聽(tīng)的時(shí)候開(kāi)始錄音

? ? ? ? ? ? ? ? ? ? ? ? Log.e("TAG","錄音失敗");

}

break;

}

}

//創(chuàng)建保存錄音的目錄

? ? ? ? private void createRecorderFile() {

String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();

String filePath = absolutePath +"/recorder";

File file =new File(filePath);

if (!file.exists()) {

file.mkdir();

}

}

//獲取當(dāng)前時(shí)間,以其為名來(lái)保存錄音

? ? ? ? private String getCurrentTime() {

SimpleDateFormat format =new SimpleDateFormat("yyyyMMddHHmmss");

Date date =new Date();

String str = format.format(date);

return str;

}

}

}


//在需要的地方啟動(dòng)服務(wù)

public void btn(View view) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

startForegroundService(intent);

}else {

startService(intent);

}

}

下章是錄音文件的讀取和播放

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眉枕,一起剝皮案震驚了整個(gè)濱河市械哟,隨后出現(xiàn)的幾起案子疏之,更是在濱河造成了極大的恐慌,老刑警劉巖暇咆,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋爪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爸业,警方通過(guò)查閱死者的電腦和手機(jī)其骄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扯旷,“玉大人拯爽,你說(shuō)我怎么就攤上這事【觯” “怎么了毯炮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耸黑。 經(jīng)常有香客問(wèn)我否副,道長(zhǎng),這世上最難降的妖魔是什么崎坊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任备禀,我火速辦了婚禮,結(jié)果婚禮上奈揍,老公的妹妹穿的比我還像新娘曲尸。我一直安慰自己,他們只是感情好男翰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布另患。 她就那樣靜靜地躺著,像睡著了一般蛾绎。 火紅的嫁衣襯著肌膚如雪昆箕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天租冠,我揣著相機(jī)與錄音鹏倘,去河邊找鬼。 笑死顽爹,一個(gè)胖子當(dāng)著我的面吹牛纤泵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镜粤,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捏题,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼玻褪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起公荧,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤带射,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后循狰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窟社,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年晤揣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朱灿。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昧识,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盗扒,到底是詐尸還是另有隱情跪楞,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布侣灶,位于F島的核電站甸祭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏褥影。R本人自食惡果不足惜池户,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凡怎。 院中可真熱鬧校焦,春花似錦、人聲如沸统倒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)房匆。三九已至耸成,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浴鸿,已是汗流浹背井氢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岳链,地道東北人毙沾。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宠页,于是被迫代替她去往敵國(guó)和親左胞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寇仓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容