fix: Added startForegroundService calls inside handler.post to avoid android.app.RemoteServiceException
Fixes Context.startForegroundService() did not then call Service.startForeground() (probably)
This commit is contained in:
parent
de92e1d9a7
commit
71f112673b
2 changed files with 9 additions and 17 deletions
|
@ -19,7 +19,9 @@ import android.app.Activity
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Handler
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
|
import android.os.Looper
|
||||||
import android.provider.DocumentsContract
|
import android.provider.DocumentsContract
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
@ -115,13 +117,10 @@ object MusicPlayerRemote : KoinComponent {
|
||||||
val realActivity = (context as Activity).parent ?: context
|
val realActivity = (context as Activity).parent ?: context
|
||||||
val contextWrapper = ContextWrapper(realActivity)
|
val contextWrapper = ContextWrapper(realActivity)
|
||||||
val intent = Intent(contextWrapper, MusicService::class.java)
|
val intent = Intent(contextWrapper, MusicService::class.java)
|
||||||
try {
|
Handler(Looper.getMainLooper()).post {
|
||||||
contextWrapper.startService(intent)
|
ContextCompat.startForegroundService(context, intent)
|
||||||
} catch (ignored: IllegalStateException) {
|
|
||||||
runCatching {
|
|
||||||
ContextCompat.startForegroundService(context, intent)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val binder = ServiceBinder(callback)
|
val binder = ServiceBinder(callback)
|
||||||
|
|
||||||
if (contextWrapper.bindService(
|
if (contextWrapper.bindService(
|
||||||
|
@ -416,7 +415,7 @@ object MusicPlayerRemote : KoinComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (songs == null || songs.isEmpty()) {
|
if (songs.isNullOrEmpty()) {
|
||||||
var songFile: File? = null
|
var songFile: File? = null
|
||||||
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
|
if (uri.authority != null && uri.authority == "com.android.externalstorage.documents") {
|
||||||
val path = uri.path?.split(":".toRegex(), 2)?.get(1)
|
val path = uri.path?.split(":".toRegex(), 2)?.get(1)
|
||||||
|
@ -436,7 +435,7 @@ object MusicPlayerRemote : KoinComponent {
|
||||||
songs = songRepository.songsByFilePath(songFile.absolutePath, true)
|
songs = songRepository.songsByFilePath(songFile.absolutePath, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (songs != null && songs.isNotEmpty()) {
|
if (!songs.isNullOrEmpty()) {
|
||||||
openQueue(songs, 0, true)
|
openQueue(songs, 0, true)
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -106,6 +106,7 @@ class MediaButtonIntentReceiver : MediaButtonReceiver() {
|
||||||
KeyEvent.KEYCODE_MEDIA_STOP -> command = ACTION_STOP
|
KeyEvent.KEYCODE_MEDIA_STOP -> command = ACTION_STOP
|
||||||
KeyEvent.KEYCODE_HEADSETHOOK, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> command =
|
KeyEvent.KEYCODE_HEADSETHOOK, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> command =
|
||||||
ACTION_TOGGLE_PAUSE
|
ACTION_TOGGLE_PAUSE
|
||||||
|
|
||||||
KeyEvent.KEYCODE_MEDIA_NEXT -> command = ACTION_SKIP
|
KeyEvent.KEYCODE_MEDIA_NEXT -> command = ACTION_SKIP
|
||||||
KeyEvent.KEYCODE_MEDIA_PREVIOUS -> command = ACTION_REWIND
|
KeyEvent.KEYCODE_MEDIA_PREVIOUS -> command = ACTION_REWIND
|
||||||
KeyEvent.KEYCODE_MEDIA_PAUSE -> command = ACTION_PAUSE
|
KeyEvent.KEYCODE_MEDIA_PAUSE -> command = ACTION_PAUSE
|
||||||
|
@ -154,15 +155,7 @@ class MediaButtonIntentReceiver : MediaButtonReceiver() {
|
||||||
private fun startService(context: Context, command: String?) {
|
private fun startService(context: Context, command: String?) {
|
||||||
val intent = Intent(context, MusicService::class.java)
|
val intent = Intent(context, MusicService::class.java)
|
||||||
intent.action = command
|
intent.action = command
|
||||||
try {
|
Handler(Looper.getMainLooper()).post {
|
||||||
// IMPORTANT NOTE: (kind of a hack)
|
|
||||||
// on Android O and above the following crashes when the app is not running
|
|
||||||
// there is no good way to check whether the app is running so we catch the exception
|
|
||||||
// we do not always want to use startForegroundService() because then one gets an ANR
|
|
||||||
// if no notification is displayed via startForeground()
|
|
||||||
// according to Play analytics this happens a lot, I suppose for example if command = PAUSE
|
|
||||||
context.startService(intent)
|
|
||||||
} catch (ignored: IllegalStateException) {
|
|
||||||
ContextCompat.startForegroundService(context, intent)
|
ContextCompat.startForegroundService(context, intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue