Android:代码适用于 api 19 但不适用于 api 24

Android: code works with api 19 but not with api 24

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.media.MediaPlayer
import android.media.MediaRecorder
import android.os.Environment
import android.view.View
import android.widget.Toast
import java.io.IOException
import android.widget.ImageButton


class record : AppCompatActivity() {

    var buttonStart: ImageButton? = null
    var buttonStop: ImageButton? = null
    var buttonPlayLastRecordAudio: ImageButton? = null
    var buttonStopPlayingRecording: ImageButton? = null
    var AudioSavePathInDevice = "Blesson"
    var mediaRecorder: MediaRecorder? = null


    var mediaPlayer: MediaPlayer? = null

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

        buttonStart = findViewById(R.id.record) as ImageButton
        buttonStop = findViewById(R.id.stop) as ImageButton
        buttonPlayLastRecordAudio = findViewById(R.id.play) as ImageButton
        buttonStopPlayingRecording= findViewById(R.id.playstop) as ImageButton
        buttonStop!!.isEnabled = false
        buttonPlayLastRecordAudio!!.isEnabled = false




        buttonStart!!.setOnClickListener {


            AudioSavePathInDevice = Environment.getExternalStorageDirectory().absolutePath + "/" +"Medpro.mp3"

            MediaRecorderReady()

            try {
                mediaRecorder!!.prepare()
                mediaRecorder!!.start()
            } catch (e: IllegalStateException) {
                Toast.makeText(this, "Recording roblem started",
                        Toast.LENGTH_LONG).show()
            }



            buttonStart!!.isEnabled = false
            buttonStart!!.visibility = View.INVISIBLE
            buttonStop!!.visibility = View.VISIBLE
            buttonStop!!.isEnabled = true

            Toast.makeText(this, "Recording started",
                    Toast.LENGTH_LONG).show()

        }
            buttonStop!!.setOnClickListener {

                 mediaRecorder!!.stop()
                 buttonStop!!.isEnabled = false
                 buttonPlayLastRecordAudio!!.isEnabled = true
                // buttonStart!!.isEnabled = true
                 buttonStopPlayingRecording!!.isEnabled = false

                     Toast.makeText(this, "Recording Completed",
                            Toast.LENGTH_LONG).show()
                 buttonStop!!.visibility = View.INVISIBLE
                  buttonPlayLastRecordAudio!!.visibility = View.VISIBLE


        }

              buttonPlayLastRecordAudio!!.setOnClickListener {
                  buttonStop!!.isEnabled = false
                  buttonStart!!.isEnabled = false
                  buttonPlayLastRecordAudio!!.visibility=View.INVISIBLE
                  buttonStopPlayingRecording!!.isEnabled = true
                  buttonStopPlayingRecording!!.visibility=View.VISIBLE

                    mediaPlayer = MediaPlayer()
                     try {
                         mediaPlayer!!.setDataSource(AudioSavePathInDevice)
                         mediaPlayer!!.prepare()
                        } catch (e: IOException) {
                                Toast.makeText(this, "Recoring not found",
                                 Toast.LENGTH_LONG).show() 
                        }

                          mediaPlayer!!.start()
                          Toast.makeText(this, "Recording Playing",
                          Toast.LENGTH_LONG).show() 
              }

                 buttonStopPlayingRecording!!.setOnClickListener {

                 buttonStopPlayingRecording!!.isEnabled = false
                 buttonPlayLastRecordAudio!!.isEnabled = true

                      if (mediaPlayer != null) {
                      mediaPlayer!!.stop()
                      mediaPlayer!!.release()
                     MediaRecorderReady() 
                      }
              }



        }


        fun MediaRecorderReady() {
            mediaRecorder = MediaRecorder()
            mediaRecorder!!.setAudioSource(MediaRecorder.AudioSource.MIC)
            mediaRecorder!!.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
            mediaRecorder!!.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB)
            mediaRecorder!!.setOutputFile(AudioSavePathInDevice)
        }
    }

/* 与此代码相关的错误

致命异常:主要 进程:com.example.admin.lifeplus,PID:21679 java.lang.RuntimeException: setAudioSource 失败。 在 android.media.MediaRecorder.setAudioSource(本机方法) 在 com.example.admin.lifeplus.record.MediaRecorderReady(record.kt:138) 在 com.example.admin.lifeplus.record$onCreate$1.onClick(record.kt:45) 在 android.view.View.performClick(View.java:5623) 在 android.view.View$PerformClick.run(View.java:22433) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6247) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) */

上面给出的是我录制音频文件的代码,它适用于 api 19 台设备但不适用于 api 24。你能帮我吗?

对于 API 23 级及以上级别,您必须在运行时请求 RECORD_AUDIO 权限。

查看 this link 了解更多信息。