Qt for Android(十四) —— Android Q 之无法接受广播+Android Q新的截图方式

519 阅读1分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

背景

  项目迁移到Android Q之后,发现之前的各种广播都收不到了,包括开机广播、自定义广播等。会提示错误:Background execution not allowed: receiving Intent { act=izis_MinaPushServiceOpen_kyteach flg=0x10 (has extras) } to cn.izis.kyteach/.receiver.DataReceiverPublic

后来了解到在Android 8.0之后所有的广播都需要动态注册,也就是以前的manifest文件中的静态广播不生效。

代码

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            registerReceiver();
        }
        
        public void registerReceiver(){
        m_adbReceiver = new AdbBootBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.BROADCAST_FORM_ADB");
        registerReceiver(m_adbReceiver, intentFilter);
        
        IntentFilter intentFilter2 = new IntentFilter();
        m_bootReceiver = new BootBroadcastReceiver();
        intentFilter2.addAction("android.intent.action.android.intent.action.BOOT_COMPLETED");
        registerReceiver(m_bootReceiver, intentFilter2);
        
        m_installReceiver = new InstallResultReceiver();
        IntentFilter intentFilter3 = new IntentFilter();
        intentFilter3.addAction("android.content.pm.extra.STATUS");
        registerReceiver(m_installReceiver, intentFilter3);
        
        
        
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            unregisterReceiver(m_adbReceiver);
            unregisterReceiver(m_bootReceiver);
            unregisterReceiver(m_installReceiver);
        }
        System.out.println("-- onDestroy()");
    }

背景

  之前项目的截图方式是使用的screencap -p命令,在QT中调用android的cmd函数实现截图,但是这个方法的缺陷是慢,截图有时候需要5S。其实在QT中,我们有更好的截图方式。

方案介绍

在QT5.12版本上,我们尝试过QScreen 的 grabWindow方法,尝试过QWidget的grab方法。这两个方法在android上都没法实现完美截图。基于一些原因,我们升级了QT版本到QT5.15,因为考虑到screencap -p方法的效率比较低,为了优化,便尝试了QPixmap grabWidget方法,发现这个函数可以实现完美截图,虽然在QT的官方文档中是这样写的: 请添加图片描述

但其实QWidget::grab() QScreen::grabWindow()在Android平台上都不能截图,不知道QT官网验证过没。。。

代码

m_bgpixmap = QPixmap::grabWidget(this, this->rect());