以下是使用 Kotlin 编写的一个简单的录音软件,录制完成后可以在 RecyclerView 中显示录制的音频,并且可以点击播放。\n\n首先,需要在 AndroidManifest.xml 文件中添加录音和存储权限:\n\nxml\n<uses-permission android:name="android.permission.RECORD_AUDIO" />\n<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />\n\n\n然后,在 MainActivity.kt 文件中添加以下代码:\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.AdapterView\nimport android.widget.ArrayAdapter\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 androidx.recyclerview.widget.RecyclerView\nimport kotlinx.android.synthetic.main.activity_main.*\nimport java.io.File\nimport java.io.IOException\n\nclass MainActivity : AppCompatActivity(), AdapterView.OnItemClickListener {\n private val permissions = arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE)\n private val REQUEST_PERMISSION_CODE = 200\n private var mediaRecorder: MediaRecorder? = null\n private var mediaPlayer: MediaPlayer? = null\n private var isRecording = false\n private var isPlaying = false\n private var outputFile: String? = null\n private val recordingsList = ArrayList<String>()\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n\n checkPermissions()\n\n recordButton.setOnClickListener {\n if (isRecording) {\n stopRecording()\n recordButton.text = "Record"\n } else {\n startRecording()\n recordButton.text = "Stop"\n }\n isRecording = !isRecording\n }\n\n playButton.setOnClickListener {\n if (isPlaying) {\n stopPlaying()\n playButton.text = "Play"\n } else {\n startPlaying()\n playButton.text = "Stop"\n }\n isPlaying = !isPlaying\n }\n\n setupRecyclerView()\n }\n\n private fun checkPermissions() {\n val permissionsToRequest = ArrayList<String>()\n for (permission in permissions) {\n if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {\n permissionsToRequest.add(permission)\n }\n }\n\n if (permissionsToRequest.isNotEmpty()) {\n ActivityCompat.requestPermissions(this, permissionsToRequest.toTypedArray(), REQUEST_PERMISSION_CODE)\n }\n }\n\n override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {\n super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n if (requestCode == REQUEST_PERMISSION_CODE) {\n for (result in grantResults) {\n if (result != PackageManager.PERMISSION_GRANTED) {\n Toast.makeText(this, "Permissions are required to use the app", Toast.LENGTH_SHORT).show()\n finish()\n }\n }\n }\n }\n\n private fun startRecording() {\n outputFile = Environment.getExternalStorageDirectory().absolutePath + "/recording_${System.currentTimeMillis()}.3gp"\n mediaRecorder = MediaRecorder().apply {\n setAudioSource(MediaRecorder.AudioSource.MIC)\n setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)\n setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)\n setOutputFile(outputFile)\n prepare()\n start()\n }\n Toast.makeText(this, "Recording started", Toast.LENGTH_SHORT).show()\n }\n\n private fun stopRecording() {\n mediaRecorder?.apply {\n stop()\n release()\n }\n mediaRecorder = null\n Toast.makeText(this, "Recording stopped", Toast.LENGTH_SHORT).show()\n\n recordingsList.add(outputFile!!)\n recyclerView.adapter?.notifyDataSetChanged()\n }\n\n private fun startPlaying() {\n mediaPlayer = MediaPlayer().apply {\n try {\n setDataSource(recordingsList[0])\n prepare()\n start()\n } catch (e: IOException) {\n e.printStackTrace()\n }\n }\n Toast.makeText(this, "Playing started", Toast.LENGTH_SHORT).show()\n }\n\n private fun stopPlaying() {\n mediaPlayer?.apply {\n stop()\n release()\n }\n mediaPlayer = null\n Toast.makeText(this, "Playing stopped", Toast.LENGTH_SHORT).show()\n }\n\n private fun setupRecyclerView() {\n recyclerView.layoutManager = LinearLayoutManager(this)\n recyclerView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, recordingsList)\n recyclerView.setOnItemClickListener(this)\n }\n\n override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {\n if (!isPlaying) {\n mediaPlayer = MediaPlayer().apply {\n try {\n setDataSource(recordingsList[position])\n prepare()\n start()\n } catch (e: IOException) {\n e.printStackTrace()\n }\n }\n }\n }\n}\n\n\n在 activity_main.xml 布局文件中,添加以下代码:\n\nxml\n<?xml version="1.0" encoding="utf-8"?>\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 <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</LinearLayout>\n\n\n这样,录音软件就完成了。当点击“Record”按钮开始录音时,将会创建一个新的音频文件,并将其路径添加到 RecyclerView 中。点击“Stop”按钮停止录音。当点击“Play”按钮时,将会播放 RecyclerView 中的第一个音频文件。点击 RecyclerView 中的任何项也可以播放相应的音频文件。\n

Android 录音软件开发:Kotlin 实现录音和播放功能

原文地址: https://www.cveoy.top/t/topic/qaBw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录