Android 录音功能实现:录音列表,播放功能
{
"title": "Android 录音功能实现:录音列表,播放功能",
"description": "本文介绍了使用 Kotlin 实现 Android 录音功能的示例代码。包括录音、保存、播放录音文件以及在 RecyclerView 中显示录音列表的功能。",
"keywords": "Android, 录音, 录音列表, 播放, RecyclerView, Kotlin, MediaRecorder, MediaPlayer",
"content": ""\n<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n android:layout_width="match_parent"\n android:layout_height="match_parent"\n android:orientation="vertical"\n android:padding="16dp">\n\n <Button\n android:id="@+id/recordButton"\n android:layout_width="match_parent"\n android:layout_height="wrap_content"\n android:text="Record" />\n\n <Button\n android:id="@+id/playButton"\n android:layout_width="match_parent"\n android:layout_height="wrap_content"\n android:text="Play" />\n\n <androidx.recyclerview.widget.RecyclerView\n android:id="@+id/recyclerView"\n android:layout_width="match_parent"\n android:layout_height="0dp"\n android:layout_weight="1"\n tools:listitem="@android:layout/simple_list_item_1" />\n\n\n根据以上布局的xml代码,使用kotlin写一个录音功能,录音后文件保存在本地并在androidx.recyclerview.widget.RecyclerView中显示录音名称,单机后可播放音频,如果已有录制的音频文件,那么打开软件的时候androidx.recyclerview.widget.RecyclerView中默认显示内容:录音列表,并且可以播放已有的音频文件。以下是一个示例的Kotlin代码:\n\nkotlin\nimport android.Manifest\nimport android.content.pm.PackageManager\nimport android.media.MediaPlayer\nimport android.media.MediaRecorder\nimport android.os.Bundle\nimport android.os.Environment\nimport android.view.View\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport kotlinx.android.synthetic.main.activity_main.*\nimport java.io.File\nimport java.io.IOException\n\nclass MainActivity : AppCompatActivity() {\n private lateinit var mediaRecorder: MediaRecorder\n private lateinit var mediaPlayer: MediaPlayer\n private lateinit var recordingList: ArrayList<String>\n private lateinit var adapter: RecordingAdapter\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n\n recordingList = ArrayList()\n adapter = RecordingAdapter(recordingList)\n\n recyclerView.layoutManager = LinearLayoutManager(this)\n recyclerView.adapter = adapter\n\n recordButton.setOnClickListener {\n if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {\n ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), RECORD_AUDIO_PERMISSION)\n } else {\n startRecording()\n }\n }\n\n playButton.setOnClickListener {\n val position = recyclerView.getChildAdapterPosition(it)\n if (position != RecyclerView.NO_POSITION) {\n val filePath = recordingList[position]\n playRecording(filePath)\n }\n }\n\n loadRecordings()\n }\n\n private fun startRecording() {\n mediaRecorder = MediaRecorder()\n val fileName = "${System.currentTimeMillis()}.3gp"\n val filePath = "${Environment.getExternalStorageDirectory().absolutePath}/Recordings/$fileName"\n\n val directory = File("${Environment.getExternalStorageDirectory().absolutePath}/Recordings")\n if (!directory.exists()) {\n directory.mkdirs()\n }\n\n mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)\n mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)\n mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)\n mediaRecorder.setOutputFile(filePath)\n\n try {\n mediaRecorder.prepare()\n mediaRecorder.start()\n Toast.makeText(this, "Recording started", Toast.LENGTH_SHORT).show()\n } catch (e: IOException) {\n e.printStackTrace()\n }\n }\n\n private fun stopRecording() {\n try {\n mediaRecorder.stop()\n mediaRecorder.release()\n Toast.makeText(this, "Recording stopped", Toast.LENGTH_SHORT).show()\n } catch (e: RuntimeException) {\n e.printStackTrace()\n }\n }\n\n private fun playRecording(filePath: String) {\n mediaPlayer = MediaPlayer()\n try {\n mediaPlayer.setDataSource(filePath)\n mediaPlayer.prepare()\n mediaPlayer.start()\n } catch (e: IOException) {\n e.printStackTrace()\n }\n }\n\n private fun loadRecordings() {\n val directory = File("${Environment.getExternalStorageDirectory().absolutePath}/Recordings")\n if (directory.exists()) {\n val files = directory.listFiles()\n if (files != null) {\n for (file in files) {\n if (file.isFile && file.extension == "3gp") {\n recordingList.add(file.absolutePath)\n }\n }\n adapter.notifyDataSetChanged()\n }\n }\n }\n\n override fun onDestroy() {\n super.onDestroy()\n if (this::mediaRecorder.isInitialized) {\n mediaRecorder.release()\n }\n if (this::mediaPlayer.isInitialized) {\n mediaPlayer.release()\n }\n }\n\n override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {\n super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n if (requestCode == RECORD_AUDIO_PERMISSION) {\n if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n startRecording()\n } else {\n Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show()\n }\n }\n }\n\n companion object {\n private const val RECORD_AUDIO_PERMISSION = 123\n }\n}\n\n\n此示例代码中使用了一个RecordingAdapter来显示录音列表,并通过AndroidManifest.xml文件中添加录音和读写SD卡的权限:\n\nxml\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n\n\n请注意,此示例假设你已经在设备上正确设置了录音和读写SD卡权限。你还需要在AndroidManifest.xml文件中添加相应的权限声明。
原文地址: https://www.cveoy.top/t/topic/qaDr 著作权归作者所有。请勿转载和采集!