Я использую устройство с пирогом Android и хочу программно изменить оверскан из моего приложения.Поэтому я сделал следующее:
- предоставил мое приложение
WRITE_SECURE_SETTINGS
через adb
Проблема
Код здесь позвольте мне поверить, что внутри IWindowManager$Stub
должен быть метод setOverscan
, но его нет.Я делаю что-то не так или просто невозможно сделать то, что я хочу сделать так, как я пытаюсь это сделать?
Мой код показывает, что hasNavigationBar
работает, но метод setOverscanMode
не работаетt и происходит сбой с java.lang.NoSuchMethodException: android.view.IWindowManager$Stub$Proxy.setOverscan [int, int, int, int, int]
код
object WindowTool {
// WindowManager source code: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/IWindowManager.aidl
fun getWindowManagerService(): Any {
val serviceManager = Class.forName("android.os.ServiceManager")
val serviceBinder = serviceManager.getMethod("getService", String::class.java).invoke(serviceManager, Context.WINDOW_SERVICE) as IBinder
val stub = Class.forName("android.view.IWindowManager\$Stub")
return stub.getMethod("asInterface", IBinder::class.java).invoke(stub, serviceBinder)
}
fun setOverscanMode(v1: Int, v2: Int, v3: Int, v4: Int): Boolean {
try {
val windowManagerService = getWindowManagerService()
for (m in windowManagerService.javaClass.methods) {
L.d { "Method: $m" }
}
val setOverscan = windowManagerService.javaClass.getMethod("setOverscan", Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE)
setOverscan.invoke(windowManagerService, 0, v1, v2, v3, v4)
return true
} catch (e: Exception) {
L.e(e)
return false
}
}
fun hasNavigationBar(): Boolean? {
try {
val windowManagerService = getWindowManagerService()
val hasNavigationBar = windowManagerService.javaClass.getMethod("hasNavigationBar")
val res = hasNavigationBar.invoke(windowManagerService) as Boolean
L.d { "hasNavigationBar: $res" }
return res
} catch (e: Exception) {
L.e(e)
return null
}
}
}