Browse Source

avoid IOException for ChatController#initMediaPlayer

Exception java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:558)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936)
Caused by java.lang.reflect.InvocationTargetException:
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
Caused by java.io.IOException: Prepare failed.: status=0x1
  at android.media.MediaPlayer._prepare
  at android.media.MediaPlayer.prepare (MediaPlayer.java:1309)
  at com.nextcloud.talk.controllers.ChatController.initMediaPlayer (ChatController.kt:1023)
  at com.nextcloud.talk.controllers.ChatController.startPlayback (ChatController.kt:981)
  at com.nextcloud.talk.controllers.ChatController.access$startPlayback (ChatController.kt:219)
  at com.nextcloud.talk.controllers.ChatController$downloadFileToCache$1.invoke (ChatController.kt:1111)
  at com.nextcloud.talk.controllers.ChatController$downloadFileToCache$1.invoke (ChatController.kt:1109)
  at com.nextcloud.talk.controllers.ChatController.downloadFileToCache$lambda$18 (ChatController.kt:1109)
  at com.nextcloud.talk.controllers.ChatController.$r8$lambda$6crsUAwqqfwhlukFd40yEwEwluI
  at com.nextcloud.talk.controllers.ChatController$$ExternalSyntheticLambda9.onChanged
  at androidx.lifecycle.LiveData.considerNotify (LiveData.java:133)
  at androidx.lifecycle.LiveData.dispatchingValue (LiveData.java:151)
  at androidx.lifecycle.LiveData.setValue (LiveData.java:309)
  at androidx.lifecycle.MutableLiveData.setValue (MutableLiveData.java:50)
  at androidx.lifecycle.LiveData$1.run (LiveData.java:93)
  at android.os.Handler.handleCallback (Handler.java:942)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loopOnce (Looper.java:201)
  at android.os.Looper.loop (Looper.java:288)
  at android.app.ActivityThread.main (ActivityThread.java:7872)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Marcel Hibbe 2 years ago
parent
commit
332b856cfe
1 changed files with 16 additions and 8 deletions
  1. 16 8
      app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

+ 16 - 8
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -1004,6 +1004,7 @@ class ChatController(args: Bundle) :
         adapter?.update(message)
         adapter?.update(message)
     }
     }
 
 
+    @Suppress("Detekt.TooGenericExceptionCaught")
     private fun initMediaPlayer(message: ChatMessage) {
     private fun initMediaPlayer(message: ChatMessage) {
         if (message != currentlyPlayedVoiceMessage) {
         if (message != currentlyPlayedVoiceMessage) {
             currentlyPlayedVoiceMessage?.let { stopMediaPlayer(it) }
             currentlyPlayedVoiceMessage?.let { stopMediaPlayer(it) }
@@ -1012,15 +1013,22 @@ class ChatController(args: Bundle) :
         if (mediaPlayer == null) {
         if (mediaPlayer == null) {
             val fileName = message.selectedIndividualHashMap!!["name"]
             val fileName = message.selectedIndividualHashMap!!["name"]
             val absolutePath = context.cacheDir.absolutePath + "/" + fileName
             val absolutePath = context.cacheDir.absolutePath + "/" + fileName
-            mediaPlayer = MediaPlayer().apply {
-                setDataSource(absolutePath)
-                prepare()
-            }
-            currentlyPlayedVoiceMessage = message
-            message.voiceMessageDuration = mediaPlayer!!.duration / VOICE_MESSAGE_SEEKBAR_BASE
 
 
-            mediaPlayer!!.setOnCompletionListener {
-                stopMediaPlayer(message)
+            try {
+                mediaPlayer = MediaPlayer().apply {
+                    setDataSource(absolutePath)
+                    prepare()
+                }
+
+                currentlyPlayedVoiceMessage = message
+                message.voiceMessageDuration = mediaPlayer!!.duration / VOICE_MESSAGE_SEEKBAR_BASE
+
+                mediaPlayer!!.setOnCompletionListener {
+                    stopMediaPlayer(message)
+                }
+            } catch (e: Exception) {
+                Log.e(TAG, "failed to initialize mediaPlayer", e)
+                Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
             }
             }
         } else {
         } else {
             Log.e(TAG, "mediaPlayer was not null. This should not happen!")
             Log.e(TAG, "mediaPlayer was not null. This should not happen!")