从 Service 中启动 Activity 以及手机截屏
关于 android 截屏, 在 Service 中实现后台截屏
记得上一次写 android 代码可能在十年前了,那时用的是eclipse开发,现在全忘记了。
这次用 android studio 捣鼓快一周时间,才做完一个小玩意。
android 5.1
因为电脑配置比较低,无法运行模拟器,我是在一台旧的手机上(meizu note 2)进行usb调试,测试截屏时弹出一次权限提示对话框,可以选择不再提示, 并且不需要【悬浮窗】权限, 也不需要将 Service 设置为前台 Service, 就可以正常截屏。
android 11
代码写好后,放到 android 11 上运行闪退,经过两天不懈的努力,终于把截屏的事情搞清楚了。
1. 在准备截屏前, Service 要设置为 前台Service
Intent notificationIntent = new Intent(this, MainActivity.class); Notification notification = notificationBuilder.build(); //通知 ... startForeground(1, notification); //必须使用此方法显示通知
同时再加两个权限配置:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
给 Service 也要加上特有的权限:
<service android:name=".ScreenService" android:enabled="true" android:exported="true" android:foregroundServiceType="mediaProjection" ></service>
2. 每一次的截屏都会弹出权限对话框, 不像 android 5.1 那样可以选择不再提示
3. 在应用的权限管理中,要给应用加上悬浮窗权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
在 service 中启动一个 Activity, 经常遇到无法激活的情况。
startActivity(intent);
折腾一天,才找到原因:原来在service中激活这个Activity需要开启悬浮窗权限
真没想到,会是这个原因。
看来 android 每一个版本变化真的很大,安全限制越来越严格。