我的问题
在借鉴了网上各路大佬的成果后,发现在Android 10以上大家对自启权限和白名单权限的资料甚少。以至于不能直接通过Copy来解决问题,在华为P20、P30和OPPO Reno Ace等手机上,不能通过各路大佬的代码来引导用户进入相关权限的设置页面。
解决方案
经过一番度娘后,发现有两种方式可以获取栈顶页面的包名和类名,分别是adb和AccessibilityService,由于我没有真机不好进行adb连接,只有通过自己实现一个AccessibilityService应用,以悬浮窗的方式来显示栈顶页面的包名和类名。
实践过程
- 申请阿里云EMAS移动测试权限;
2. 实现AccessibilityService查看包名类名应用;
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<service
android:name=".TrackerService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config"/>
</service>
public class TrackerService extends AccessibilityService {
public static final String TAG = "TrackerService";
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onInterrupt() {
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
CharSequence packageName = event.getPackageName();
CharSequence className = event.getClassName();
if (!TextUtils.isEmpty(packageName) && !TextUtils.isEmpty(className)) {
Log.d(TAG, "Do something");
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
}
3.在EMAS平台上选择相应的机型,上传应用,打开到设置自启动的页面,通过悬浮窗即可看到当前页面的包名和类名;
我的成果
华为P20、P30
-----------------------------------------------------------------------
自启权限:
com.huawei.systemmanager
com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity
OPPO Reno Ace权限相关设置:
-----------------------------------------------------------------------
关闭闲置应用:
com.coloros.safecnter
.appfrozen.activity.AppFrozenSettingActivity
自定义耗电保护:
com.coloros.oppoguardelf
com.coloros.powermaneger.fuelgaue.PowerUsageModelActivity
自启权限:
com.coloros.safecenter
.startupapp.StartupAppListActivity
关联启动:
com.coloros.safecenter
.startupapp.AssociateStartActivity
普通权限设置页面:
com.coloros.securitypermission
.permission.PermissionGroupsActivity
中兴-ZTE V1000-9:
-----------------------------------------------------------------------
电池优化:
com.zte.powersavemode
.appspowersave.AppManagerActivityMFV
使用:
var intent = Intent()
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
var componentName: ComponentName? = null
if (Build.BRAND.equals("Huawei")) {
componentName = ComponentName(
"com.huawei.systemmanager",
"com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"
)
}
intent.component = componentName
context.startActivity(intent)
感谢各路大佬无私的奉献,下一个解决问题是,实时监听悬浮窗权限是否打开?没有打开时在后台启动设置页面,可以实现无论用户是否打开权限都可以限制用户正常使用手机。