2023年11月28日发(作者:)

android实现通话⾃动录⾳服务

本⽂实例为⼤家分享了android实现通话⾃动录⾳服务的具体代码,供⼤家参考,具体内容如下

需求:

:通话⾃动录⾳;

:⽆界⾯,只是⼀个service

:录⾳⾃动压缩上传;

:当⽤户清理后台的时候,要求service不可以被杀死;

:稳定性:1、⽆⽹络的情况下;2、上传失败;3、服务报错。

解决⽅案:

:通话⾃动录⾳

启动⼀个service,监听⽤户⼿机通话状态,当检测到⽤户处于通话状态下,⽴即开始录⾳,通话结束后,停⽌录⾳,并保存

⽂件。

此功能的前提条件:

1、录⾳权限、读写存储空间的权限、读取通话状态的权限;

2Service不可以被停⽌,否则⽆法录⾳。

3、开机启动(不可以让⽤户每次开机都主动去打开服务)

:⽆界⾯,只是⼀个service

⽅案

普通的service,监听开机⼴播,当⽤户开机的时候,启动service。但是,发现service并没有启动。想要启动⼀个service,必

须要有⼀个activity,即使你不打开这个activity

在真正做项⽬的时候,PM会提出各种你不能理解的需求,⽐如说本系统,PM要求本应⽤只是⼀个录⾳服务,不可以有任何界

⾯,也不可以在⼿机桌⾯上出现应⽤图标。因此,⽅案不可⾏。

⽅案

Android⼿机在设置⾥⾯都⼀个辅助功能(个别⼿机也叫:⽆障碍),利⽤这个我们可以实现⼀些强⼤的功能,前提是⽤户开

启我们的辅助功能,抢红包软件就是利⽤辅助功能实现的。

:录⾳⾃动压缩上传

我们只需要在上传之前对⽂件进⾏压缩处理,然后再上传即可。

:当⽤户清理后台的时候,要求service不可以被杀死

不会被杀死的服务,或许只有系统服务吧。当然类似于QQ、微信他们做的这种全家桶也可以做到。⼤公司是可以和⼚商合作

的,他们的应⽤可以不那么容易被杀死。当然也不提倡这样做,这样就是垃圾软件,破坏了Android开发的美好环境。

其实,如果可以把服务设置成系统服务,那么只要⽤户不主动在辅助功能页⾯关掉服务,后台是清理不掉改服务的。本⼈在⼩

⽶⼿机上测试过,设置成系统级别的服务后,当清理后台的时候,即使服务被杀死,也会⾮常快的重新启动。(感兴趣的同学

可以试⼀下)

:稳定性:1、⽆⽹络的情况下;2、上传失败;3、服务报错

思路:

当⽆⽹络的情况下,把录⾳⽂件的地址保存下来(保存的⽅式有很多:SqliteSharedpreferences等等),上传失败也⼀

样,失败的原因可能有很多种:⽹络断开、接⼝报错等,当⽹络恢复的时候,可以重新上传,这样就不会丢失录⾳⽂件。

代码很简单,注释很详细:

项⽬的结构:

android:name=".erService"

android:permission="_ACCESSIBILITY_SERVICE">

/**

* ⾳频录制

*/

private MediaRecorder recorder;

private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

/**

registerReceiver(networkConnectChangedReceiver, intentFilter2);

unUploadFile = getSharedPreferences("un_upload_file", 0);

().putString("description", "未上传的录⾳⽂件存放路径").commit();

dirPath = ernalStorageDirectory().getAbsolutePath() + "/ecorder/";

}

@Override

public void onDestroy() {

roy();

xt(getApplicationContext(), "进程被关闭,⽆法继续录⾳,请打开录⾳服务", _LONG).show();

if (outCallReceiver != null) {

unregisterReceiver(outCallReceiver);

}

if (networkConnectChangedReceiver != null) {

unregisterReceiver(networkConnectChangedReceiver);

}

}

class MyListener extends PhoneStateListener {

@Override

public void onCallStateChanged(int state, String incomingNumber) {

*/

private void saveUnUploadFIles(String file) {

String files = ing("unUploadFile", "");

if (("")) {

files = file;

} else {

StringBuilder sb = new StringBuilder(files);

files = (";").append(file).toString();

}

().putString("unUploadFile", files).commit();

}

File out = new File(dirPath);

if (!()) {

();

}

putFile(dirPath

+ getFileName((previousStats == _STATE_RINGING ? incomingNumber : currentCallNum))

);

ioEncoder(_NB);// 设置⾳频编码格式

try {

e();// 做好准备

} catch (Exception e) {

// TODO Auto-generated catch block

tackTrace();

}

}

/**

* 获取录⾳⽂件的名称

*

* @param incomingNumber 通话号码

* @return 获取录⾳⽂件的名称

*/

private String getFileName(String incomingNumber) {

Date date = new Date(tTimeMillis());

currentFile = incomingNumber + " " + (date) + ".mp3";

return currentFile;

}

/**

* 拨号⼴播接收器,并获取拨号号码

*/

}

} else { // not connected to the internet

Log.e(TAG, "当前没有⽹络连接,请确保你已经打开⽹络 ");

}

}

}

}

}

* @param context

* @return

*/

public static int getConnectedType(Context context) {

if (context != null) {

ConnectivityManager mConnectivityManager = (ConnectivityManager) context

.getSystemService(TIVITY_SERVICE);

NetworkInfo mNetworkInfo = iveNetworkInfo();

if (mNetworkInfo != null && lable()) {

return e();

}

}

return -1;

}

/**

* 获取当前的⽹络状态 :没有⽹络0WIFI⽹络13G⽹络22G⽹络3

*

* @param context

* @return

*/

public static int getAPNType(Context context) {

int netType = 0;

}

();

return true;

} catch (FileNotFoundException ex) {

tackTrace();

} catch (IOException ex) {

tackTrace();

}

return false;

}

}

/**

* @param srcPath 待压缩的⽂件或⽬录

* @param dstPath 压缩后的zip⽂件

* @return 只要待压缩的⽂件有⼀个压缩失败就停⽌压缩并返回(等价于windows上直接进⾏压缩)

return true;