如何在其他应用程序上显示透明相机覆盖?

Posted

技术标签:

【中文标题】如何在其他应用程序上显示透明相机覆盖?【英文标题】:How to display Transparent camera overlay over other apps? 【发布时间】:2021-11-04 14:35:05 【问题描述】:

我正在创建一个 android 应用程序,我必须实现一个功能,其中我的应用程序具有“在其他应用程序上显示”权限,并且从辅助功能服务它需要在其他应用程序上显示一个透明的相机覆盖。

需要什么?

打开 WhatsApp 后,立即从我的应用程序中在 WhatsApp 应用程序上显示一个透明的相机叠加层。附上截图。

我做了什么

1- 添加显示在应用程序权限工作

2- 添加了无障碍服务,只要打开 WhatsApp,就会触发 onAccessibilityEvent。

我尝试在 WhatsApp 打开时添加相机覆盖

1- 我添加了提到的捕获预览类here

2- 尝试使用 cameraX Preview 但没有运气

下面是我的 AccessibilityService 代码,我想从这里开始透明相机叠加层

class CameraAccessibilityService : AccessibilityService() 
    val tinyDB: TinyDB by inject()

    override fun onInterrupt() 

    override fun onAccessibilityEvent(event: AccessibilityEvent?) 
        if (event?.eventType?.equals(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED)!! || event?.eventType?.equals(
                AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
            )!!
        ) 
            if (event.packageName == Constants.WHATSAPP_PKG_NAME || event.packageName == Constants.WHATSAPP_BUSINESS_PKG_NAME) 
                if (tinyDB.getBoolean(Constants.isCameraOverLayEnabled)) 
                    Toast.makeText(applicationContext, "Setting ON", Toast.LENGTH_SHORT)
                        .show()
                    val preview=CapturePreview(this)
                    val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager

                    val metrics = DisplayMetrics()
                    wm.defaultDisplay.getMetrics(metrics)


                    val params = WindowManager.LayoutParams(
                        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,  // TYPE_SYSTEM_ALERT is denied in apiLevel >=19
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        PixelFormat.TRANSLUCENT
                    )
                    params.title = "Touhou"

                    wm.addView(preview, params)

                 else 
                    Toast.makeText(applicationContext, "Setting OFF", Toast.LENGTH_SHORT)
                        .show()
                

            

        
    

    override fun onServiceConnected() 
        this.serviceInfo.apply 
            eventTypes =
                AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED or AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
            packageNames =
                arrayOf(Constants.WHATSAPP_PKG_NAME, Constants.WHATSAPP_BUSINESS_PKG_NAME)
            feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK
            notificationTimeout = 100
        
    

    override fun onDestroy() 
        super.onDestroy()
        Log.d(TAG, "Save Status CameraAccessibilityService Destroyed")
    




有人可以帮我解决这个问题吗?任何帮助将不胜感激。

【问题讨论】:

我不确定其他应用程序上的显示功能是如何工作的,但我会采用一种非常幼稚的第一种方法。如果您将预览视图和活动(包括预览视图)的背景设​​置为透明会发生什么?也许这会有所帮助:***.com/a/2700683/2895045 “但没有运气” - 这不是对您的问题的非常有用的解释。当你尝试这个时发生了什么?应用程序是否崩溃(如果是,堆栈跟踪是什么)?你有编译器错误吗?事情是否运行但没有给你想要的输出(如果是的话,你得到了什么输出)? @CommonsWare “但没有运气”明显的意思是它没有工作。没有显示输出。相机显示与正常一样,没有透明度(即不透明度较低) “明显的意思是它没有工作”——是的,但细节很重要。 “相机显示与正常情况相同,没有透明度(即不透明度较低)” - 充其量,如果您使用TextureView 进行预览,这可能是可能的。 AFAIK,SurfaceView 不支持透明度。 @User 你做到了吗? 【参考方案1】:

试试这个

SurfaceView surface1 = (SurfaceView)findViewById(R.id.surface1);
surface1.setZOrderOnTop(true);
SurfaceHolder holder1 = surface1.getHolder();
holder1.setFormat(PixelFormat.TRANSPARENT);

【讨论】:

以上是关于如何在其他应用程序上显示透明相机覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

在相机视图中显示 3D 图形?

如何将 QWindow 设置为对鼠标和其他事件透明?

用于相机的具有透明度的矩形框架

AVFoundation -> 用动画覆盖记录相机视频

iphone应用程序在ipad上运行的问题

iPhone 相机图像上的 3D 模型。透明背景?