I am using the Kotlin in this timer app trying to pause the timer I get this error. It's not running the first if statement that is true.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.proITAssets.myapplication, PID: 12792
java.lang.IllegalStateException
at android.media.MediaRecorder.pause(Native Method)
at com.proITAssets.myapplication.MainActivity.pauseRecording(MainActivity.kt:143)
at com.proITAssets.myapplication.MainActivity.access$pauseRecording(MainActivity.kt:23)
at com.proITAssets.myapplication.MainActivity$onCreate$3.onClick(MainActivity.kt:87)
at android.view.View.performClick(View.java:7125)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
This is a code snippet for the pause function.
@SuppressLint("RestrictedApi", "SetTextI18n")
@TargetApi(Build.VERSION_CODES.N)
private fun pauseRecording() {
if(state) {
pauseTimer()
Toast.makeText(this,"This is working", Toast.LENGTH_SHORT).show()
if(!recordingStopped){
Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
mediaRecorder?.pause()
recordingStopped == true
button_pause_recording.text = "Resume"
}else{
resumeRecording()
resumeTimer()
}
}else{
Toast.makeText(this,"this is not working", Toast.LENGTH_SHORT).show()
}
}
This is all the code that the program used to run please let me know where the problem may be.
class MainActivity : AppCompatActivity() {
private var output: String? = null
private var mediaRecorder: MediaRecorder? = null
private var state: Boolean = false
private var recordingStopped: Boolean = false
private var mp= MediaPlayer()
private var recordingfile = ""
private var chronometerPausedTime: Long = 0
private val thename by lazy {findViewById<TextView>(R.id.ed_name)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val name = "$thename".trim()
mediaRecorder = MediaRecorder()
output = Environment.getExternalStorageDirectory().toString() + name
button_stop_recording.isEnabled = false
button_pause_recording.isEnabled = false
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
val permissions = arrayOf(
android.Manifest.permission.RECORD_AUDIO,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
)
ActivityCompat.requestPermissions(this, permissions, 0)
}
button_start_recording.setOnClickListener {
if (!thename.text.toString().isNotEmpty()){
Toast.makeText(this, "User need to enter the file name", Toast.LENGTH_SHORT).show()
}else{
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, permissions,0)
} else {
savefilename()
startRecording()
button_stop_recording.isEnabled = true
button_start_recording.isEnabled = false
button_pause_recording.isEnabled = true
}
savefilename()
}
}
mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
mediaRecorder?.setOutputFile(output)
button_stop_recording.setOnClickListener{
stopRecording()
button_start_recording.isEnabled = true
button_stop_recording.isEnabled = false
}
button_pause_recording.setOnClickListener {
pauseRecording()
button_start_recording.isEnabled = true
}
btn_play.setOnClickListener {
playRecording()
}
}
private fun startRecording() {
startFromZero()
state = true
if (!state){
Toast.makeText(this, "This is false", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(this, "this is true", Toast.LENGTH_SHORT).show()
}
var name = File(getExternalFilesDir("/"),recordingfile)
//val name = Activity()?.getExternalFilesDir("/")?.absolutePath
val timestamp = SimpleDateFormat(
"MM/dd/yyyy_HH:mm:ss:a",
Locale.US,
).format(System.currentTimeMillis())
val date = Date()
recordingfile = "${ed_name.text}" + timestamp.format(date) + ".mp3"
try {
if (name != null) {
Toast.makeText(this, "This is your file name $recordingfile", Toast.LENGTH_SHORT).show()
}
mediaRecorder?.setOutputFile("/" + name + recordingfile)
mediaRecorder?.prepare()
mediaRecorder?.start()
Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show()
} catch (e: IllegalStateException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}
@SuppressLint("RestrictedApi", "SetTextI18n")
@TargetApi(Build.VERSION_CODES.N)
private fun pauseRecording() {
if(state) {
pauseTimer()
Toast.makeText(this,"This is working", Toast.LENGTH_SHORT).show()
if(!recordingStopped){
Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
mediaRecorder?.pause()
recordingStopped == true
button_pause_recording.text = "Resume"
}else{
resumeRecording()
resumeTimer()
}
}else{
Toast.makeText(this,"this is not working", Toast.LENGTH_SHORT).show()
}
}
@SuppressLint("RestrictedApi", "SetTextI18n")
@TargetApi(Build.VERSION_CODES.N)
private fun resumeRecording() {
Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show()
mediaRecorder?.resume()
button_pause_recording.text = "Pause"
recordingStopped == false
}
private fun stopRecording(){
stopTimer()
if(state){
mediaRecorder?.stop()
mediaRecorder?.release()
state = false
simpleChronometer.stop()
}else{
Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show()
}
}
private fun playRecording(){
mp.setDataSource(output)
mp.prepare()
mp.start()
}
private fun savefilename(){
val name = "rec_$thename.mp3"
val timestamp = SimpleDateFormat("MMddyyyy_HHmmss",
Locale.getDefault()).format(System.currentTimeMillis())
try {
val rec = File("$output/Recording/")
mediaRecorder = MediaRecorder()
output = Environment.getExternalStorageDirectory().toString() + "/$thename.mp3"
val file = File(name)
val fw = FileWriter(file.absoluteFile)
val bw = BufferedWriter(fw)
bw.write(name)
bw.close()
Toast.makeText(this, name +"is name of the file \n" + rec, Toast.LENGTH_LONG).show()
}catch (e: Exception){
Toast.makeText(this, e.message, Toast.LENGTH_SHORT )
}
}
private fun startFromZero() {
simpleChronometer.base = SystemClock.elapsedRealtime()
simpleChronometer.start()
}
private fun pauseTimer() {
chronometerPausedTime = SystemClock.elapsedRealtime() - this.simpleChronometer.base
simpleChronometer.stop()
}
private fun resumeTimer() {
simpleChronometer.base = SystemClock.elapsedRealtime() - chronometerPausedTime
chronometerPausedTime = 0
simpleChronometer.start()
}
private fun stopTimer(){
simpleChronometer.base = SystemClock.elapsedRealtime()
simpleChronometer.stop()
}
}
Thank you for the help.
Aucun commentaire:
Enregistrer un commentaire