解决OPPO Reno Ace(Android 10)、华为P20、P30进入自启权限设置页面问题,通过AccessibilityService获取栈顶Activity和相应的包名以及类名

我的问题


       在借鉴了网上各路大佬的成果后,发现在Android 10以上大家对自启权限和白名单权限的资料甚少。以至于不能直接通过Copy来解决问题,在华为P20、P30和OPPO Reno Ace等手机上,不能通过各路大佬的代码来引导用户进入相关权限的设置页面。

解决方案


       经过一番度娘后,发现有两种方式可以获取栈顶页面的包名和类名,分别是adb和AccessibilityService,由于我没有真机不好进行adb连接,只有通过自己实现一个AccessibilityService应用,以悬浮窗的方式来显示栈顶页面的包名和类名。

实践过程


  1. 申请阿里云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)

       感谢各路大佬无私的奉献,下一个解决问题是,实时监听悬浮窗权限是否打开?没有打开时在后台启动设置页面,可以实现无论用户是否打开权限都可以限制用户正常使用手机。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,可以使用 Element-Plus 中的表格和卡片组件来展示这些手机数据。以下是一个简单的代码示例: ```vue <template> <div> <el-table :data="phones" style="width: 100%"> <el-table-column prop="brand" label="品牌"></el-table-column> <el-table-column prop="type" label="型号"></el-table-column> <el-table-column prop="price" label="价格"></el-table-column> <el-table-column label="操作"> <template #default="{ row }"> <el-button type="primary" size="mini" @click="showPhone(row)">查看</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="dialogVisible" width="30%" title="手机详情"> <el-card> <div slot="header" class="clearfix"> <span>{{ currentPhone.brand }} {{ currentPhone.type }}</span> <el-button style="float: right; padding: 3px 0" type="text" @click="dialogVisible = false">关闭</el-button> </div> <div style="padding: 30px"> <p>价格:{{ currentPhone.price }}</p> <p>描述:暂无描述</p> </div> </el-card> </el-dialog> </div> </template> <script> export default { data() { return { phones: [ { brand: '华为', type: 'Mate20', price: 3699 }, { brand: '苹果', type: 'iPhone7', price: 2949 }, { brand: '三星', type: 'Galaxy S8+', price: 3299 }, { brand: 'vivo', type: 'Z5x', price: 1698 }, { brand: '一加', type: 'OnePlus7', price: 2999 }, { brand: '360', type: 'N7 Pro', price: 1099 }, { brand: 'oppo', type: 'Reno', price: 2599 } ], dialogVisible: false, currentPhone: {} } }, methods: { showPhone(phone) { this.currentPhone = phone this.dialogVisible = true } } } </script> ``` 这个组件中,我们使用了 `el-table` 表格组件来展示手机数据,同时在最后一列添加了一个“查看”按钮,点击该按钮会弹出一个对话框,用 `el-dialog` 和 `el-card` 组件展示当前手机的详细信息。其中 `currentPhone` 对象用来保存当前选中的手机数据,`dialogVisible` 属性用来控制对话框是否可见。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉念聿辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值