以下是使用Kotlin编写的一个简单的录音软件,录制完成后可以在RecyclerView中显示录制的音频,并且可以点击播放。

首先,需要在AndroidManifest.xml文件中添加录音和存储权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后,在MainActivity.kt文件中添加以下代码:

import android.Manifest
import android.content.pm.PackageManager
import android.media.MediaPlayer
import android.media.MediaRecorder
import android.os.Bundle
import android.os.Environment
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File
import java.io.IOException

class MainActivity : AppCompatActivity(), AdapterView.OnItemClickListener {
    private val permissions = arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    private val REQUEST_PERMISSION_CODE = 200
    private var mediaRecorder: MediaRecorder? = null
    private var mediaPlayer: MediaPlayer? = null
    private var isRecording = false
    private var isPlaying = false
    private var outputFile: String? = null
    private val recordingsList = ArrayList<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        checkPermissions()

        recordButton.setOnClickListener {
            if (isRecording) {
                stopRecording()
                recordButton.text = "Record"
            } else {
                startRecording()
                recordButton.text = "Stop"
            }
            isRecording = !isRecording
        }

        playButton.setOnClickListener {
            if (isPlaying) {
                stopPlaying()
                playButton.text = "Play"
            } else {
                startPlaying()
                playButton.text = "Stop"
            }
            isPlaying = !isPlaying
        }

        setupRecyclerView()
    }

    private fun checkPermissions() {
        val permissionsToRequest = ArrayList<String>()
        for (permission in permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                permissionsToRequest.add(permission)
            }
        }

        if (permissionsToRequest.isNotEmpty()) {
            ActivityCompat.requestPermissions(this, permissionsToRequest.toTypedArray(), REQUEST_PERMISSION_CODE)
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_PERMISSION_CODE) {
            for (result in grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "Permissions are required to use the app", Toast.LENGTH_SHORT).show()
                    finish()
                }
            }
        }
    }

    private fun startRecording() {
        outputFile = Environment.getExternalStorageDirectory().absolutePath + "/recording_${System.currentTimeMillis()}.3gp"
        mediaRecorder = MediaRecorder().apply {
            setAudioSource(MediaRecorder.AudioSource.MIC)
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
            setOutputFile(outputFile)
            prepare()
            start()
        }
        Toast.makeText(this, "Recording started", Toast.LENGTH_SHORT).show()
    }

    private fun stopRecording() {
        mediaRecorder?.apply {
            stop()
            release()
        }
        mediaRecorder = null
        Toast.makeText(this, "Recording stopped", Toast.LENGTH_SHORT).show()

        recordingsList.add(outputFile!!)
        recyclerView.adapter?.notifyDataSetChanged()
    }

    private fun startPlaying() {
        mediaPlayer = MediaPlayer().apply {
            try {
                setDataSource(recordingsList[0])
                prepare()
                start()
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
        Toast.makeText(this, "Playing started", Toast.LENGTH_SHORT).show()
    }

    private fun stopPlaying() {
        mediaPlayer?.apply {
            stop()
            release()
        }
        mediaPlayer = null
        Toast.makeText(this, "Playing stopped", Toast.LENGTH_SHORT).show()
    }

    private fun setupRecyclerView() {
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, recordingsList)
        recyclerView.setOnItemClickListener(this)
    }

    override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        if (!isPlaying) {
            mediaPlayer = MediaPlayer().apply {
                try {
                    setDataSource(recordingsList[position])
                    prepare()
                    start()
                } catch (e: IOException) {
                    e.printStackTrace()
                }
            }
        }
    }
}

在activity_main.xml布局文件中,添加以下代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <Button
        android:id="@+id/recordButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Record" />

    <Button
        android:id="@+id/playButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Play" />

    <RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        tools:listitem="@android:layout/simple_list_item_1" />

</LinearLayout>

这样,录音软件就完成了。当点击“Record”按钮开始录音时,将会创建一个新的音频文件,并将其路径添加到RecyclerView中。点击“Stop”按钮停止录音。当点击“Play”按钮时,将会播放RecyclerView中的第一个音频文件。点击RecyclerView中的任何项也可以播放相应的音频文件

使用kotlin写一个录音软件录制完成后在RecyclerView显示刚才录制的音频点击后可以播放

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

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