需求
利用电话监听器,在接通电话时开启录音,挂断时保存
步骤
1.创建服务并注册监听器
2.在接通电话时初始化录音设备
3.挂断后保留到指定的文档地址中
代码实现
活动界面代码
/**
* 电话的监听功能
*/
public class MainActivity extends AppCompatActivity {
private Intent service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
service = new Intent(this, TelPhonListener.class);
//动态申请权限
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)!=
PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=
PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}else {
startService(service);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length > 0){
for (int result :grantResults){
if (result !=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"必须同意所有权限才能使用本程序",
Toast.LENGTH_LONG).show();
finish();
return;
}
}
startService(service);
}else {
Toast.makeText(this,"未知错误",
Toast.LENGTH_LONG).show();
finish();
}
break;
default:
}
}
}
服务器代码
/**
* 获取电话管理器
*/
@Override
public void onCreate() {
super.onCreate();
TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
//注册来电监听器,event是只监听接听状态事件
manager.listen(new MyPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
}
电话状态类
public void onCallStateChanged(int state, String phoneNumber) {
switch (state){
case TelephonyManager.CALL_STATE_IDLE://闲置
Log.d("PHoneState", "当前电话处于闲置状态");
if (isCall){//状态由摘机转换到闲置
recorder.stop();
recorder.release();
Log.d("PHoneListener", "录制完成");
}
isCall =false;
break;
case TelephonyManager.CALL_STATE_OFFHOOK://摘机
Log.d("PHoneState", "当前电话处于摘机状态");
//初始化录音设备
recorder = new MediaRecorder();
//进行一系列初始化设置,1.设置指定音频输入源---麦克风
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置输出格式为3pp
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//指定音频编码模式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//输出地址-以时间为文件名
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
//每次执行的时间都不相同,所有格式化的名称也不相同
String name = format.format(new Date());
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) +
File.separator+name+".3pp";
//指定输出位置
recorder.setOutputFile(path);
Log.d("PHoneListener", "path :"+path);
try {
recorder.prepare();
recorder.start();
isCall = true;
Log.d("PHoneListener", "录音设备设置完成,已启动");
} catch (IOException e) {
e.printStackTrace();
}
break;
case TelephonyManager.CALL_STATE_RINGING://响铃
Log.d("PHoneState", "当前电话处响铃状态");
break;
}
}