Android电话录音文件

本人最近开发电话软件,大概是通过pc分发指令,实现电话拨打,挂机,录音文件上传功能,说起来是和简单,实际还是遇到很多问题,现在贴出来,与猿友一起共勉。

问题一:实现自动拨打电话,有人认为只能最多实现跳转到拨号界面,这是不可能的,现在跳转到拨号界面,并自动拨号的方式,前提要动态申请权限哦

    /*** 拨打电话(直接拨打电话** @param context* @param phoneNum 电话号码*/public void callPhone(Context context, String phoneNum) {Intent intent = new Intent(Intent.ACTION_CALL);Uri data = Uri.parse("tel:" + phoneNum);intent.setData(data);context.startActivity(intent);}

问题二:自动挂断电话,这个东西由于Android系统设有安全权限,只能通过aidl拿到权限,新建aidl文件,此时要注意路径,

package com.android.internal.telephony;/*** Interface used to interact with the phone. Mostly this is used by the* TelephonyManager class. A few places are still using this directly.* Please clean them up if possible and use TelephonyManager instead.* {@hide}*/interface ITelephony {/*** End call or go to the Home screen* @return whether it hung up*/boolean endCall();}
    public void endCallnew() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, RemoteException {TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);Class clazz = Class.forName(telephonyManager.getClass().getName());Method method = clazz.getDeclaredMethod("getITelephony");method.setAccessible(true);ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager);telephonyService.endCall();}

如果你这样写可能就是没有办法适配9.0,这个9.0适配也是找了很久,有个哥们说看到谷歌说是这样解决的。完整的解决方案应该是这样的

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)private boolean cutTheCall() {TelecomManager telecomManager = (TelecomManager) getApplicationContext().getSystemService(TELECOM_SERVICE);if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED || telecomManager == null) {return false;}if (telecomManager.isInCall()) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {telecomManager.endCall();} else {try {endCallnew();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();}}}return true;}

问题四:获取录音文件,这个可是要剑走偏锋了,因为开始Android录音功能,这样只能听到我方的录音,听不到对方录音,但是用户开启自动录音功能(每个手机都有录音功能),或者手动打开录用功能,通过获取手机型号就能拿到指定路径下的录音文件,比如你录音完成时候,系统会提醒你录音文件保存的位置,找文件,上传肯定没问题了。

    public String getPath() {s.clear();Path.clear();File parent = Environment.getExternalStorageDirectory();File child;switch (getDeviceBrand().toUpperCase()) {case "HUAWEI":// child = new File(parent, "record");child = new File(parent, "Sounds/CallRecord/");break;case "XIAOMI":child = new File(parent, "MIUI/sound_recorder/call_rec");// child = new File(parent, "MIUI/sound_recorder");break;case "MEIZU":child = new File(parent, "Recorder");break;case "OPPO":child = new File(parent, "Recordings/Call Recordings");break;case "VIVO":child = new File(parent, "Record/Call");break;case "SAMSUNG":child = new File(parent, "Sounds");break;default:child = new File(parent, "");break;}return child.getPath();}

问题五:监听电话状态,比如来电,去电,常用的方式是通过server开启广播,通过继承PhoneStateListener,复写onCallStateChanged函数,根据 super.onCallStateChanged(state, phoneNumber);状态来判定电话状态

public class CallListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String phoneNumber) {super.onCallStateChanged(state, phoneNumber);switch (state) {case TelephonyManager.CALL_STATE_IDLE://通话状态空闲break;case TelephonyManager.CALL_STATE_OFFHOOK://通话状态摘机break;case TelephonyManager.CALL_STATE_RINGING://呼叫状态振铃break;}}
}

但是这种方案一般是完全没问题,如果对方是没有开启来电显示呢,onCallStateChanged这个函数中的来电号码就会报空指针异常了,鄙人采用这种方式监听来电,也不用server,节省资源,不容被系统杀死,这样绕过了获取来电导致的异常,一举两得

package com.example.phoneproject.common.phoneing;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;import com.example.phoneproject.common.EventPhone;
import com.example.phoneproject.common.GetMessagePhone;import org.greenrobot.eventbus.EventBus;/*** author : Liuyh* date : 2020/9/7 13:49* description :* ************************************************* Update author :* Update time :* Update description :*/
public class PhoneReceiver extends BroadcastReceiver {private Context mContext;public static boolean isZhujiaoTonghua = false;//主叫通话@Overridepublic void onReceive(Context context, Intent intent) {//   System.out.println("actionSSSSS" + intent.getAction());String action = intent.getAction();this.mContext = context;if (action.equalsIgnoreCase(Intent.ACTION_NEW_OUTGOING_CALL)) {//判断来电还是去电//获得相应的系统服务TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);/*** 返回电话状态** CALL_STATE_IDLE 无任何状态时* CALL_STATE_OFFHOOK 接起电话时* CALL_STATE_RINGING 电话进来时*/// tm.getCallState();if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {// Log.d("test", "call state idle...");isZhujiaoTonghua = true;} else if (tm.getCallState() == TelephonyManager.CALL_STATE_OFFHOOK) {//Log.e("start","end");isZhujiaoTonghua = true;}
//            else if (tm.getCallState() == TelephonyManager.CALL_STATE_RINGING) {//                Log.d("test", "call state ringing...");
//            }// isZhujiaoTonghua=true;} else {String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
//            if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {// 电话正在响铃
//                if (isZhujiaoTonghua) {//                    System.out.println("CallA" + intent.getAction());
//                }
//            } elseif (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {// 挂断if (isZhujiaoTonghua) {isZhujiaoTonghua = false;}}
//            else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)) {// 摘机,通话状态
//                if (isZhujiaoTonghua) {//                    System.out.println("CallB" + intent.getAction());
//                }
//            }}}
}

还要加上清单文件监听呢

        <serviceandroid:name=".CallServer"android:enabled="true"android:priority = "1000"android:exported="true" /> <!-- 挂断电话 -->

鄙人只用到去电,嗯,目前就用到这些。
问题六:实现程序长期后台驻留,嗯,,,这个是个伪命题,没有象苹果那样的方式,Android系统真是英雄为难英雄,解决方案还是有的,公司不差钱,可以做一些定制机,华为,小米都有类似服务,剩下只能安装一些做些设置喽,即便如此,也不能保证就是没有问题

1.确保本软件获取本机通话,录音等权限;
2.设置手机通话为自动录音;
3.请将手机来连接WIFI,保持WIFI信号良好;
4.允许本APP后台运行;
5.取消省电模式,进入省电模式接入充电器;
6.设置休眠状态下保持WLAN连接;

剩下的就是用到长链接与心跳机制,这里就看下一篇吧

Android录音文件相关推荐

  1. Android 录音文件有杂音,录音文件时长比实际时长长问题解决

    问题:在使用Android的AudioRecord进行录音时,录制生成的录音文件的时长比实际录制时间长,且录制的音频有一部分是有杂音或者没有声音的. 安卓出现录音问题还可以参考另一篇文章 Androi ...

  2. android 录音的格式转换,Android仿微信录音功能(录音后的raw文件转mp3文件)

    现在很多时候需要用到录音,然后如果我们的App是ios和android两端的话,就要考虑录音的文件在两端都能使用,这个时候就需要适配,两端的录音文件都要是mp3文件,这样才能保证两边都能播放. 针对这 ...

  3. android使用系统录音并寻找系统录音文件

    判断系统类 import android.annotation.SuppressLint; import android.os.Build; import android.os.Environment ...

  4. android获取文件路径-(获取通话录音文件)

    中秋宅在家,估计国庆也要宅在家了,一个人的时光其实很惬意                                                                        ...

  5. android 电话录音保存到什么位置,手机的录音文件在哪个文件夹?不同的安卓手机存放的路径你都知道吗?...

    想必大家都有过在手机上进行录音的需求,记录一些比较重要的通话内容或信息,在完成录音后,你知道手机的录音文件存放在哪个文件夹了吗?下面小编将给大家介绍不同的安卓手机存放通话录音文件的路径,帮你轻松找到所 ...

  6. html调取android手机录音并保存,华为手机怎么导出录音文件并保存至电脑?

    在日常生活中有很多需要录音的场景,比如上课时可以录下老师的讲义.开会时可以录下会议过程等等,使用手机就可以很方便进行录音.下面小编就以华为手机为例介绍一下如何录音,以及如何导出录音文件. 一.如何进行 ...

  7. android 断点续录,android 录音的断点续传

    系统没有暂停的功能  只能把每次的录音进行拼接... package com.example.zrecord; import java.io.File; import java.io.FileInpu ...

  8. android录音播放并上传

    最近研究了下录音上传,各位有需要可参考下,如有不妥欢迎指出 <pre name="code" class="html">package com.ki ...

  9. 【Android】【录音】Android录音--AudioRecord、MediaRecorder

    Android提供了两个API用于实现录音功能:android.media.AudioRecord.android.media.MediaRecorder. 网上有很多谈论这两个类的资料.现在大致总结 ...

最新文章

  1. MATLAB_edge()
  2. Linux minicom 软件退出方法
  3. Android适配器以及作用,Android RecyclerView 通用适配器的实现
  4. Activiti工作流从入门到入土:入门实例
  5. boost::icl::interval_map用法的测试程序
  6. 【LeetCode】031. Next Permutation
  7. python打印二进制内容_在python中打印出c类型的二进制表示
  8. postman delete 请求传递数组_Postman请求方法
  9. 一文快速掌握 Git 用法(Git介绍及使用流程)
  10. c语言指针动态分配数组长度,C语言安全之数组长度与指针实例解析
  11. Mcafee(麦咖啡)8.5i 使用设置图解 --服务器
  12. 微信公众账号登陆授权开发——1
  13. SaaS 公司融资的「22条军规」
  14. linux修改时区时间est->cst
  15. 云服务器的使用(一)
  16. 9张逻辑思维图,迅速提升你的工作能力
  17. 中国蚁剑连接一句话木马
  18. 光纤的损耗机理 散射损耗 吸收损耗 弯曲损耗
  19. 外行人如何通过学习软件测试转行IT
  20. Linux NTP时钟同步

热门文章

  1. SuperMap GIS基础软件天地图服务QA
  2. excelvan平板电脑_NPOI操作Excel表格
  3. 深拷贝和浅拷贝(Es6)
  4. PostgreSql Copy之表与文件之间的拷贝
  5. 【转】一棵歪脖子树——全栈工程师
  6. python人工智能开发-Python人工智能开发从入门到精通
  7. android 破碎酷炫动画,【Android效果集】学习ExplosionField之粒子破碎效果
  8. 记一次解决 Feign 提交批量添加请求收到 400 报错的经历
  9. 深入浅谈,CPU设计原理
  10. ROS——一文读懂:rosbag