全局悬浮窗权限
判断是否能显示悬浮窗: Settings.canDrawOverlays(context)
跳转至悬浮窗设置的Intent: new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()))
在应用外使用全局悬浮窗展示AlertDialog
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); } else { dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } dialog.show();
将Activity设为全屏且背景透明
在清单文件中使用主题@android:style/Theme.Translucent.NoTitleBar.Fullscreen
, 也可以用代码实现, 但是我没研究了
注意: 此主题不继承自AppCompat
, 无法使用AppCompatActivity
获取屏幕真实宽高
getResources().getDisplayMetrics()
获取的宽高不包括状态栏和导航栏
可以用windowManager.getDefaultDisplay().getRealMetrics(outMetrics)
当然, 由于Android 12L后谷歌开始向大屏设备发力, 上面的接口已经被弃用了, 推荐用windowManager.getCurrentWindowMetrics()
来获取当前应用窗口大小
MediaProjection截屏
需要在清单文件中对截屏服务设置android:foregroundServiceType="mediaProjection"
, 截屏时需要调用startForeground
启动前台服务并展示通知
ImageReader.newInstance
的format
参数填PixelFormat.RGBA_8888
会有报错提示, 但是填他指定的值跑不起来, 所以不用管
应用强制关闭后无障碍服务无法运行
当一个启用了无障碍服务的应用被强制停止时无障碍服务就无法重启了, 只能到设置里关了再开, 目前不清楚是我手机的问题(HarmonyOS2.0/Android10)还是Android的问题, 等待进一步验证和解决
临时解决方案是应用停止时调用无障碍服务的disableSelf()方法把自己禁用掉, 但是这样每次打开应用都得跳转到设置页面手动打开, 好麻烦的说:(
LSPosed的桌面没有显示?
拨号键打*#*#5776733#*#* 即可进入该应用,然后按照提示创建桌面快捷方式即可。
解除Android 12进程数量限制
adb shell /system/bin/device_config put activity_manager max_phantom_processes 2147483647 adb shell /system/bin/device_config set_sync_disabled_for_tests persistent adb shell /system/bin/dumpsys activity settings | findstr max_phantom_processes
PS: 这个系列能出到第四期, Google得负首要责任 (doge