多媒体——音频——使用录音机录制音频

冷不防 2024-04-03 09:04 232阅读 0赞

使用录音机录制音频

bfc1fbbba7739d74087634ef8e08fdf3.png

77b220329a6b1ab1047a850fc14523e2.png

权限:

  1. <!-- 相机 -->
  2. <uses-permission android:name="android.permission.CAMERA" />
  3. <!-- 录音 -->
  4. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  5. <!-- 存储卡读写 -->
  6. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  7. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  8. <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

布局:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <Button
  6. android:id="@+id/btn_recorder"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="打开录音机"
  10. android:textColor="@color/black"
  11. android:textSize="17sp" />
  12. <TextView
  13. android:id="@+id/tv_audio"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:paddingLeft="5dp"
  17. android:textColor="@color/black"
  18. android:textSize="17sp" />
  19. <ImageView
  20. android:id="@+id/iv_audio"
  21. android:layout_width="match_parent"
  22. android:layout_height="50dp"
  23. android:scaleType="fitCenter"
  24. android:src="@drawable/play_audio"
  25. android:visibility="gone" />
  26. </LinearLayout>

91d0b66671f88e15507f5cd0d735d98c.png

  1. FileUtil
  2. package com.example.myapplication.util;
  3. import android.content.Context;
  4. import android.database.Cursor;
  5. import android.graphics.Bitmap;
  6. import android.graphics.BitmapFactory;
  7. import android.net.Uri;
  8. import android.os.Build;
  9. import android.provider.MediaStore;
  10. import android.util.Log;
  11. import androidx.core.content.FileProvider;
  12. import java.io.File;
  13. import java.io.FileInputStream;
  14. import java.io.FileOutputStream;
  15. import java.io.InputStream;
  16. import java.io.OutputStream;
  17. public class FileUtil {
  18. private final static String TAG = "FileUtil";
  19. // 把字符串保存到指定路径的文本文件
  20. public static void saveText(String path, String txt) {
  21. // 根据指定的文件路径构建文件输出流对象
  22. try (FileOutputStream fos = new FileOutputStream(path)) {
  23. fos.write(txt.getBytes()); // 把字符串写入文件输出流
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. // 从指定路径的文本文件中读取内容字符串
  29. public static String openText(String path) {
  30. String readStr = "";
  31. // 根据指定的文件路径构建文件输入流对象
  32. try (FileInputStream fis = new FileInputStream(path)) {
  33. byte[] b = new byte[fis.available()];
  34. fis.read(b); // 从文件输入流读取字节数组
  35. readStr = new String(b); // 把字节数组转换为字符串
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. return readStr; // 返回文本文件中的文本字符串
  40. }
  41. // 把位图数据保存到指定路径的图片文件
  42. public static void saveImage(String path, Bitmap bitmap) {
  43. // 根据指定的文件路径构建文件输出流对象
  44. try (FileOutputStream fos = new FileOutputStream(path)) {
  45. // 把位图数据压缩到文件输出流中
  46. bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos);
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. // 从指定路径的图片文件中读取位图数据
  52. public static Bitmap openImage(String path) {
  53. Bitmap bitmap = null; // 声明一个位图对象
  54. // 根据指定的文件路径构建文件输入流对象
  55. try (FileInputStream fis = new FileInputStream(path)) {
  56. // 从文件输入流中解码位图数据
  57. bitmap = BitmapFactory.decodeStream(fis);
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. return bitmap; // 返回图片文件中的位图数据
  62. }
  63. // 检查文件是否存在,以及文件路径是否合法
  64. public static boolean checkFileUri(Context ctx, String path) {
  65. boolean result = true;
  66. File file = new File(path);
  67. if (!file.exists() || !file.isFile() || file.length() <= 0) {
  68. result = false;
  69. }
  70. try {
  71. Uri uri = Uri.parse(path); // 根据指定路径创建一个Uri对象
  72. // 兼容Android7.0,把访问文件的Uri方式改为FileProvider
  73. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  74. // 通过FileProvider获得文件的Uri访问方式
  75. uri = FileProvider.getUriForFile(ctx,
  76. ctx.getPackageName()+".fileProvider", new File(path));
  77. }
  78. } catch (Exception e) { // 该路径可能不存在
  79. e.printStackTrace();
  80. result = false;
  81. }
  82. return result;
  83. }
  84. // 把指定uri保存为存储卡文件
  85. public static void saveFileFromUri(Context ctx, Uri src, String dest) {
  86. try (InputStream is = ctx.getContentResolver().openInputStream(src);
  87. OutputStream os = new FileOutputStream(dest);) {
  88. int byteCount = 0;
  89. byte[] bytes = new byte[8096];
  90. while ((byteCount = is.read(bytes)) != -1){
  91. os.write(bytes, 0, byteCount);
  92. }
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. }
  96. }
  97. // 从content://media/external/file/这样的Uri中获取文件路径
  98. public static String getPathFromContentUri(Context context, Uri uri) {
  99. String path = uri.toString();
  100. if (path.startsWith("content://")) {
  101. String[] proj = new String[]{ // 媒体库的字段名称数组
  102. MediaStore.Video.Media._ID, // 编号
  103. MediaStore.Video.Media.TITLE, // 标题
  104. MediaStore.Video.Media.SIZE, // 文件大小
  105. MediaStore.Video.Media.MIME_TYPE, // 文件类型
  106. MediaStore.Video.Media.DATA // 文件大小
  107. };
  108. try (Cursor cursor = context.getContentResolver().query(uri,
  109. proj, null, null, null)) {
  110. cursor.moveToFirst(); // 把游标移动到开头
  111. if (cursor.getString(4) != null) {
  112. path = cursor.getString(4);
  113. }
  114. Log.d(TAG, cursor.getLong(0) + " " + cursor.getString(1)
  115. + " " + cursor.getLong(2) + " " + cursor.getString(3)
  116. + " " + cursor.getString(4));
  117. } catch (Exception e) {
  118. e.printStackTrace();
  119. }
  120. }
  121. return path;
  122. }
  123. }
  124. MainActivity
  125. package com.example.myapplication;
  126. import androidx.appcompat.app.AppCompatActivity;
  127. import android.content.Intent;
  128. import android.net.Uri;
  129. import android.os.Bundle;
  130. import android.os.Environment;
  131. import android.provider.MediaStore;
  132. import android.view.View;
  133. import android.widget.ImageView;
  134. import android.widget.TextView;
  135. import com.example.myapplication.util.DateUtil;
  136. import com.example.myapplication.util.FileUtil;
  137. public class MainActivity extends AppCompatActivity implements View.OnClickListener
  138. {
  139. private final static String TAG = "AudioRecordActivity";
  140. private int RECORDER_CODE = 1; // 录制操作的请求码
  141. private TextView tv_audio;
  142. private ImageView iv_audio; // 该图标充当播放按钮
  143. private Uri mAudioUri; // 音频文件的uri路径
  144. @Override
  145. protected void onCreate(Bundle savedInstanceState)
  146. {
  147. super.onCreate(savedInstanceState);
  148. setContentView(R.layout.activity_main);
  149. tv_audio = findViewById(R.id.tv_audio);
  150. iv_audio = findViewById(R.id.iv_audio);
  151. findViewById(R.id.btn_recorder).setOnClickListener(this);
  152. findViewById(R.id.iv_audio).setOnClickListener(this);
  153. }
  154. @Override
  155. public void onClick(View v)
  156. {
  157. if (v.getId() == R.id.btn_recorder)
  158. {
  159. // 下面打开系统自带的录音机
  160. Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
  161. startActivityForResult(intent, RECORDER_CODE); // 跳到录音机页面
  162. }
  163. else if (v.getId() == R.id.iv_audio)
  164. {
  165. // 下面打开系统自带的收音机
  166. Intent intent = new Intent(Intent.ACTION_VIEW);
  167. intent.setDataAndType(mAudioUri, "audio/*"); // 类型为音频
  168. startActivity(intent); // 跳到收音机页面
  169. }
  170. }
  171. @Override
  172. protected void onActivityResult(int requestCode, int resultCode, Intent intent)
  173. {
  174. super.onActivityResult(requestCode, resultCode, intent);
  175. if (resultCode==RESULT_OK && requestCode==RECORDER_CODE)
  176. {
  177. mAudioUri = intent.getData(); // 获得录制好的音频uri
  178. String filePath = String.format("%s/%s.mp3", getExternalFilesDir(Environment.DIRECTORY_MUSIC), "audio_"+ DateUtil.getNowDateTime());
  179. FileUtil.saveFileFromUri(this, mAudioUri, filePath); // 保存为临时文件
  180. tv_audio.setText("录制完成的音频地址为:"+mAudioUri.toString());
  181. iv_audio.setVisibility(View.VISIBLE);
  182. }
  183. }
  184. }

6d03296914ab788abaa4d556371c4fbd.png

061be66636aa5d96dec7a21a90095e65.png

cca3a8620b3ef213c395b173d4bdbc06.png

34e79c9f4dc8b8824496b4530cfec8f6.png

d465bbfbd25300cfc75328e97655c42f.png

78ddcc154396e9976b58aba1166e71c8.png

7d3d28667beb24be1a8c08d24416b51b.png

发表评论

表情:
评论列表 (有 0 条评论,232人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android 多媒体音频

    在开发上,习惯的将音频、视频功能的使用称之为多媒体,实际上如果讲的宽泛一些的话,相机的使用,比如拍照,录制视频等,也可以划分到多媒体的范畴里面。 从本节课开始,我们就来看看A

    相关 多媒体音频

    播放放在项目中的音频,功能可以做到点击播放、点击暂停、拖动进度条决定音频的播放进度,下面先给大家介绍一下关于多媒体和它的方法: ![Center][] 效果图: !