如何阻止Android TV中Web封装应用触发屏幕保护程序?
如何阻止Android TV Web封装应用触发屏幕保护程序
你添加的FLAG_KEEP_SCREEN_ON只能防止屏幕熄灭,但无法阻止Android TV系统的屏幕保护程序(由DreamService驱动)启动。以下是几种可行的解决方案:
1. 使用PowerManager WakeLock(推荐)
WakeLock可以让CPU和屏幕保持活跃,直接阻止系统触发屏保,无需用户额外授权。
步骤:
- 首先在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.WAKE_LOCK" /> - 在Activity中实现WakeLock的获取与释放:
private PowerManager.WakeLock mWakeLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startWebview(); Objects.requireNonNull(getSupportActionBar()).hide(); generateUniqueIdentifier(); // 初始化WakeLock PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); mWakeLock = powerManager.newWakeLock( PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyTVApp:KeepScreenAwakeTag" ); } @Override protected void onResume() { super.onResume(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 激活WakeLock if (mWakeLock != null && !mWakeLock.isHeld()) { mWakeLock.acquire(); } // WebView系统UI设置 if (mWebView != null) { mWebView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); } } @Override protected void onPause() { super.onPause(); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 释放WakeLock,避免不必要的耗电 if (mWakeLock != null && mWakeLock.isHeld()) { mWakeLock.release(); } }
2. 直接禁用系统屏保(需要用户授权)
通过修改系统设置关闭屏保,但需要申请特殊权限,且用户需手动授权。
步骤:
- 在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.WRITE_SETTINGS" /> - 在Activity中实现设置修改:
@Override protected void onResume() { super.onResume(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 尝试禁用系统屏保 if (Settings.System.canWrite(this)) { Settings.System.putInt(getContentResolver(), Settings.System.SCREENSAVER_ENABLED, 0); } else { // 引导用户授权修改系统设置 Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); } // WebView系统UI设置... }
3. 模拟WebView用户交互
如果系统因WebView长时间无交互触发屏保,可以定期模拟用户触摸事件,让系统认为应用处于活跃状态。
代码示例:
private Handler mHandler = new Handler(); private Runnable mKeepAliveRunnable = new Runnable() { @Override public void run() { if (mWebView != null) { // 模拟空的触摸事件 MotionEvent downEvent = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0, 0, 0); mWebView.dispatchTouchEvent(downEvent); downEvent.recycle(); MotionEvent upEvent = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0, 0, 0); mWebView.dispatchTouchEvent(upEvent); upEvent.recycle(); } // 每隔5分钟触发一次 mHandler.postDelayed(this, 300000); } }; @Override protected void onResume() { super.onResume(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mHandler.post(mKeepAliveRunnable); // WebView系统UI设置... } @Override protected void onPause() { super.onPause(); mHandler.removeCallbacks(mKeepAliveRunnable); }
内容的提问来源于stack exchange,提问作者Duliba Ionut
相关产品推荐
相关产品推荐

