Skip to content

Commit

Permalink
尝试采用通用方法判断歌曲暂停,音乐软件退出(仅澎湃OS Android14上测试,测试软件:Q音,米音,网易云,酷狗/我,椒盐,RPlayer)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaowine committed Feb 11, 2024
1 parent c1198c5 commit 7c32bfc
Showing 1 changed file with 72 additions and 42 deletions.
114 changes: 72 additions & 42 deletions app/src/main/java/cn/lyric/getter/hook/app/SystemUi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package cn.lyric.getter.hook.app


import android.media.MediaMetadata
import android.media.session.MediaController
import android.media.session.PlaybackState
import android.os.Build
import cn.lyric.getter.BuildConfig
import cn.lyric.getter.R
import cn.lyric.getter.api.data.LyricData
Expand All @@ -16,6 +16,7 @@ import cn.lyric.getter.tool.HookTools.getApplication
import cn.xiaowine.xkt.LogTool.log
import cn.xiaowine.xkt.Tool.isNotNull
import cn.xiaowine.xkt.Tool.observableChange
import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass
import com.github.kyuubiran.ezxhelper.ClassUtils.loadClassOrNull
import com.github.kyuubiran.ezxhelper.EzXHelper.moduleRes
import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook
Expand Down Expand Up @@ -45,47 +46,47 @@ object SystemUi : BaseHook() {

override fun init() {
super.init()
if (Build.VERSION.SDK_INT <= 33) {
// Android13及其以下适用这个方法
loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager").isNotNull {
it.methodFinder().filterByName("clearCurrentMediaNotification").first().createHook {
after {
if (!useOwnMusicController) {
eventTools.cleanLyric()
}
}
}
}
} else {
// Android14 clearCurrentMediaNotification消失了,使用removePlayer代替
loadClassOrNull("com.android.systemui.media.controls.ui.MediaCarouselController").isNotNull {
it.methodFinder().filterByName("removePlayer\$default").first().createHook {
after {
if (!useOwnMusicController) {
eventTools.cleanLyric()
}
}
}
}
}
for (i in 0..10) {
val clazz = loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager$$i")
if (clazz.isNotNull()) {
if (clazz!!.hasMethod("onPlaybackStateChanged")) {
clazz.methodFinder().filterByName("onPlaybackStateChanged").first().createHook {
after { hookParam ->
if (!useOwnMusicController) {
val playbackState = hookParam.args[0] as PlaybackState
if (playbackState.state == 2) {
eventTools.cleanLyric()
}
}
}
}
break
}
}
}
// if (Build.VERSION.SDK_INT <= 33) {
//// Android13及其以下适用这个方法
// loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager").isNotNull {
// it.methodFinder().filterByName("clearCurrentMediaNotification").first().createHook {
// after {
// if (!useOwnMusicController) {
// eventTools.cleanLyric()
// }
// }
// }
// }
// } else {
//// Android14 clearCurrentMediaNotification消失了,使用removePlayer代替
// loadClassOrNull("com.android.systemui.media.controls.ui.MediaCarouselController").isNotNull {
// it.methodFinder().filterByName("removePlayer\$default").first().createHook {
// after {
// if (!useOwnMusicController) {
// eventTools.cleanLyric()
// }
// }
// }
// }
// }
// for (i in 0..10) {
// val clazz = loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager$$i")
// if (clazz.isNotNull()) {
// if (clazz!!.hasMethod("onPlaybackStateChanged")) {
// clazz.methodFinder().filterByName("onPlaybackStateChanged").first().createHook {
// after { hookParam ->
// if (!useOwnMusicController) {
// val playbackState = hookParam.args[0] as PlaybackState
// if (playbackState.state == 2) {
// eventTools.cleanLyric()
// }
// }
// }
// }
// break
// }
// }
// }
if (config.enhancedHiddenLyrics) {
moduleRes.getString(R.string.enhanced_hidden_lyrics).log()
for (i in 0..10) {
Expand All @@ -104,6 +105,35 @@ object SystemUi : BaseHook() {
}
}
}


loadClass("android.media.session.MediaController").methodFinder().filterByParamCount(1).filterByName("unregisterCallback").first().createHook {
after {
if (it.args[0]::class.java.name.contains("statusbar")) {
if (!useOwnMusicController) {
eventTools.cleanLyric()
}
}
}
}
loadClass("android.media.session.MediaController").methodFinder().filterByParamCount(1).filterByName("registerCallback").first().createHook {
after {
if (it.args[0]::class.java.name.contains("statusbar")) {
(it.thisObject as MediaController).registerCallback(object : MediaController.Callback() {
override fun onPlaybackStateChanged(state: PlaybackState?) {
super.onPlaybackStateChanged(state)
if (!useOwnMusicController && state != null) {
if (state.state == PlaybackState.STATE_PAUSED) {
eventTools.cleanLyric()
}

}
}
})
}
}
}

getApplication { application ->
receiver = LyricReceiver(object : LyricListener() {
override fun onUpdate(lyricData: LyricData) {
Expand Down

0 comments on commit 7c32bfc

Please sign in to comment.