Почему я не могу создать файловый объект в Kotlin?

#java #android #file #kotlin #mediarecorder

#java #Android #файл #kotlin #mediarecorder

Вопрос:

Новичок в Kotlin. Пытаюсь сохранить аудиозапись в хранилище. В настоящее время я застрял при попытке использовать MediaRecord.setOutputFile (имя файла). Однако из-за этой ошибки происходит ошибка:

java.io.FileNotFoundException: /storage/emulated/0/Recording1.mp3: ошибка открытия: EPERM (операция не разрешена)

Итак, теперь я хотел бы создать File перед вызовом setOutputFile, чтобы попытаться решить эту проблему. Но по какой-то причине Android Studio продолжает подчеркивать строку ниже, в которой говорится «Ожидается объявление верхнего уровня».

 File fileval = File.createNewFile("blah.mp3"); //This is the line
  

Полный код:

 package com.example.testapp.data

import android.content.Intent;
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import android.media.MediaRecorder;
import android.os.Environment
import android.os.PersistableBundle
import com.example.testapp.R
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.media.MediaPlayer
import android.os.Build
import android.os.Environment.getDataDirectory
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.appcompat.widget.AppCompatButton
import java.io.File
import java.io.IOException

private const val LOG_TAG = "AudioRecordTest"
private const val REQUEST_RECORD_AUDIO_PERMISSION = 200

File fileval = File.createNewFile("blah.mp3"); //This is the line

public class RecordActivity : AppCompatActivity() {

    private var mr: MediaRecorder? = null
    private var recordbtn: Button? = null
    private var filename: String? = null
    private var state: Boolean = false

    private var recordingStopped: Boolean = false
    private var player: MediaPlayer? = null
    private var playbtn: Button? = null

    // Requesting permission to RECORD_AUDIO
    private var permissionToRecordAccepted = false
    private var permissions: Array<String> = arrayOf(Manifest.permission.RECORD_AUDIO)

    @RequiresApi(Build.VERSION_CODES.M)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_record)

        requestPermissions(permissions, REQUEST_RECORD_AUDIO_PERMISSION)

        recordbtn = RecordButton(this)
        playbtn = PlayButton(this)

        filename = Environment.getExternalStorageDirectory().getAbsolutePath()
        filename  = "/Recording1.mp3"

        mr = MediaRecorder()
        mr?.setAudioSource(MediaRecorder.AudioSource.MIC)
        mr?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
        mr?.setOutputFile(filename)
        mr?.setAudioEncoder(3) //AAC; need to review what the best choice here is.
        mr?.prepare()

    }

//more code...


}
  

Комментарии:

1. вы не используете kotlin там.

Ответ №1:

Вы используете синтаксис Java, а не синтаксис Kotlin. Это

 val fileval: File = File.createNewFile("blah.mp3")
  

Комментарии:

1. Подождите, там написано «неразрешенная ссылка» для createNewFile

2. @whatwhat что этот метод не существует . Есть метод экземпляра: createNewFile() . Это то, что вы ищете? Если это так, вам нужно сначала создать экземпляр File объекта, а затем вызвать метод для этого экземпляра.

3. @Slaw Мне просто нужно сохранить аудиофайл на диск, но я новичок в Kotlin, поэтому я чертовски смущен.

4. @что это может помочь вам в просмотре kotlinlang.org/docs/reference

Ответ №2:

Используйте приведенный ниже код в AppCompatActivity()

 fileName = "${externalCacheDir!!.absolutePath}/Recording1.3gp"

 mr = MediaRecorder().apply {
            setAudioSource(MediaRecorder.AudioSource.MIC)
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            setOutputFile(fileName)
            setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)

            try {
                prepare()
            } catch (e: IOException) {
                Log.e(LOG_TAG, "prepare() failed")
            }

            start()
        }