当前位置:   article > 正文

Android开发--WebView简单录音功能的实现_webview 录音返回文件

webview 录音返回文件

由于项目需要在一个使用了WebView控件的网页上实现本地录音的功能,以下为部分步骤:

1.在MainActivity类中添加如下成员变量:

  1. private MediaRecorder recorder; // 录音类
  2. private String fileName; // 录音生成的文件存储路径

2.添加权限

①在AndroidManifest.xml文件中添加如下权限:

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.RECORD_AUDIO" />
②在onCreate函数中检查这些权限(该操作仅针对安卓6.0及以上的用户,低版本用户可能不需要这一步)

onCreate函数中请求权限

  1. requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
  2. requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
  3. requestPermission(Manifest.permission.RECORD_AUDIO);
requestPermission函数如下:

  1. private void requestPermission(String permission){
  2. if(ContextCompat.checkSelfPermission(this, permission)!= PackageManager.PERMISSION_GRANTED){
  3. ActivityCompat.requestPermissions(this, new String[]{permission}, 0);
  4. }
  5. }

3.onCreate函数中初始化录音文件存储路径

fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audiorecordertest.amr";
4.开始录音函数,创建录音对象并进行设置

  1. public boolean startRecord() {
  2. recorder = new MediaRecorder();
  3. try {
  4. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  5. }catch (IllegalStateException e){
  6. Log.i(LOG_TAG, "设置录音源失败");
  7. e.printStackTrace();
  8. }
  9. recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
  10. recorder.setOutputFile(fileName);
  11. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  12. try {
  13. recorder.prepare();
  14. }catch (IOException e){
  15. Log.e(LOG_TAG, "准备失败");
  16. e.printStackTrace();
  17. }
  18. recorder.start();
  19. Log.i(LOG_TAG, "开始录音...");
  20. return true;
  21. }
5.停止录音函数

  1. public void stopRecord() {
  2. recorder.stop();
  3. recorder.reset();
  4. recorder.release();
  5. recorder = null;
  6. Log.i(LOG_TAG, "停止录音");
  7. }

6.以上安卓的本地Java代码,在网页端需要调用这些方法来实现本地录音功能

7.当完成录音后,录音内容会存储在fileName变量对应的本地文件中,此时需要将该文件取出到前端web页面中,然后完成文件上传

首先需要在web页面中嵌入一个隐藏的表单来获取文件:

  1. <form id="submit-file" style="display: hidden;" action="upload_file.php" method="post" enctype="multipart/form-data">
  2. <input id="ttt" type="file" name="file" accept="audio/amr" />
  3. </form>

然后模拟一次文件选择和表单提交操作,将文件获取到前台来,并上传文件内容。

引入相关js文件:

  1. <script src="jquery-3.2.1.js"></script>
  2. <script src="jquery-form.js"></script>

模拟选择文件并上传:

  1. // 获取录音文件并上传
  2. $("#ttt").trigger("click");
  3. window.setTimeout(function(){
  4. $("#submit-file").ajaxSubmit(function(message) {
  5. $("body").append("<p>"+message+"</p>");
  6. });
  7. }, 3000);
其中延时三秒是为了确保文件已经由后台传输至前台页面,同时ajax提交会只提交表单而不会发生跳转。其中模拟点击事件会触发webview本地的onFileChooser函数,具体如下:

  1. webView.setWebChromeClient(new WebChromeClient() {
  2. @Override
  3. public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
  4. result.confirm(JSBridge.callJsPrompt(MainActivity.this, webView, message));
  5. return true;
  6. }
  7. @Override
  8. public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
  9. File f = new File(fileName);
  10. if(f.exists()){
  11. Uri u = Uri.fromFile(f);
  12. filePathCallback.onReceiveValue(new Uri[]{u});
  13. }
  14. return true;
  15. }
  16. });
8.服务器端需要对上传的文件接收并进行转码,由于录音生成到的是amr文件,通过ffmpeg可以转码成mp3文件。服务器端php代码如下:

  1. <?php
  2. if ($_FILES ["file"] ["error"] > 0) {
  3. echo "Return Code: " . $_FILES ["file"] ["error"] . "<br />";
  4. } else {
  5. if (file_exists ( "upload/" . $_FILES ["file"] ["name"] )) {
  6. echo $_FILES ["file"] ["name"] . " already exists. ";
  7. } else {
  8. move_uploaded_file ( $_FILES ["file"] ["tmp_name"], "upload/" . $_FILES ["file"] ["name"] );
  9. // TODO 文件转码,此处需要重新设计生成的文件的名称
  10. exec("upload\\ffmpeg.exe -i upload\\audiorecordertest.amr "."upload\\1.mp3");
  11. // 直接返回文件存储的路径,并将其构建成一个audio元素
  12. echo "<audio src='http://192.168.250.191/android_test/assets/upload/1.mp3' controls='controls'>";
  13. }
  14. }
  15. ?>









声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/175222
推荐阅读
相关标签
  

闽ICP备14008679号