|
| 1 | +package com.programminghoch10.DisableSounds |
| 2 | + |
| 3 | +import android.content.res.XResources |
| 4 | +import android.media.MediaActionSound |
| 5 | +import android.os.Build |
| 6 | +import android.util.Log |
| 7 | +import de.robv.android.xposed.IXposedHookLoadPackage |
| 8 | +import de.robv.android.xposed.IXposedHookZygoteInit |
| 9 | +import de.robv.android.xposed.XC_MethodReplacement |
| 10 | +import de.robv.android.xposed.XposedHelpers |
| 11 | +import de.robv.android.xposed.callbacks.XC_LoadPackage |
| 12 | + |
| 13 | +class DisableForcedCameraSoundHook : IXposedHookLoadPackage, IXposedHookZygoteInit { |
| 14 | + override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { |
| 15 | + Log.d(TAG, "handleLoadPackage: loaded ${this::class.java.simpleName} with package ${lpparam.packageName}") |
| 16 | + if (lpparam.packageName == "android") { |
| 17 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 18 | + val AudioServiceClass = XposedHelpers.findClass("com.android.server.audio.AudioService", lpparam.classLoader) |
| 19 | + XposedHelpers.findAndHookMethod(AudioServiceClass, "isCameraSoundForced", XC_MethodReplacement.returnConstant(false)) |
| 20 | + XposedHelpers.findAndHookMethod(AudioServiceClass, "readCameraSoundForced", XC_MethodReplacement.returnConstant(false)) |
| 21 | + } |
| 22 | + } |
| 23 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { |
| 24 | + XposedHelpers.findAndHookMethod(MediaActionSound::class.java, "mustPlayShutterSound", XC_MethodReplacement.returnConstant(false)) |
| 25 | + } |
| 26 | + } |
| 27 | + |
| 28 | + override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam) { |
| 29 | + XResources.setSystemWideReplacement("android", "bool", "config_camera_sound_forced", false) |
| 30 | + } |
| 31 | +} |
0 commit comments