2023年11月28日发(作者:)
android实现通话⾃动录⾳服务
本⽂实例为⼤家分享了android实现通话⾃动录⾳服务的具体代码,供⼤家参考,具体内容如下
需求:
①:通话⾃动录⾳;
②:⽆界⾯,只是⼀个service;
③:录⾳⾃动压缩上传;
④:当⽤户清理后台的时候,要求service不可以被杀死;
⑤:稳定性:1、⽆⽹络的情况下;2、上传失败;3、服务报错。
解决⽅案:
①:通话⾃动录⾳
启动⼀个service,监听⽤户⼿机通话状态,当检测到⽤户处于通话状态下,⽴即开始录⾳,通话结束后,停⽌录⾳,并保存
⽂件。
此功能的前提条件:
1、录⾳权限、读写存储空间的权限、读取通话状态的权限;
2、Service不可以被停⽌,否则⽆法录⾳。
3、开机启动(不可以让⽤户每次开机都主动去打开服务)
②:⽆界⾯,只是⼀个service
⽅案①
普通的service,监听开机⼴播,当⽤户开机的时候,启动service。但是,发现service并没有启动。想要启动⼀个service,必
须要有⼀个activity,即使你不打开这个activity。
在真正做项⽬的时候,PM会提出各种你不能理解的需求,⽐如说本系统,PM要求本应⽤只是⼀个录⾳服务,不可以有任何界
⾯,也不可以在⼿机桌⾯上出现应⽤图标。因此,⽅案①不可⾏。
⽅案②
Android⼿机在设置⾥⾯都⼀个辅助功能(个别⼿机也叫:⽆障碍),利⽤这个我们可以实现⼀些强⼤的功能,前提是⽤户开
启我们的辅助功能,抢红包软件就是利⽤辅助功能实现的。
③:录⾳⾃动压缩上传
我们只需要在上传之前对⽂件进⾏压缩处理,然后再上传即可。
④:当⽤户清理后台的时候,要求service不可以被杀死
不会被杀死的服务,或许只有系统服务吧。当然类似于QQ、微信他们做的这种全家桶也可以做到。⼤公司是可以和⼚商合作
的,他们的应⽤可以不那么容易被杀死。当然也不提倡这样做,这样就是垃圾软件,破坏了Android开发的美好环境。
其实,如果可以把服务设置成系统服务,那么只要⽤户不主动在辅助功能页⾯关掉服务,后台是清理不掉改服务的。本⼈在⼩
⽶⼿机上测试过,设置成系统级别的服务后,当清理后台的时候,即使服务被杀死,也会⾮常快的重新启动。(感兴趣的同学
可以试⼀下)
⑤:稳定性:1、⽆⽹络的情况下;2、上传失败;3、服务报错
思路:
当⽆⽹络的情况下,把录⾳⽂件的地址保存下来(保存的⽅式有很多:Sqlite、Sharedpreferences等等),上传失败也⼀
样,失败的原因可能有很多种:⽹络断开、接⼝报错等,当⽹络恢复的时候,可以重新上传,这样就不会丢失录⾳⽂件。
代码很简单,注释很详细:
项⽬的结构:
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; } /** * 获取当前的⽹络状态 :没有⽹络0:WIFI⽹络1:3G⽹络2:2G⽹络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;
发布评论