Krosxx / Android-Auto-Api

安卓无障碍服务Api, 为了简化无障碍服务使用,并使用 Kotlin 以提供简洁的Api。
Apache License 2.0
467 stars 78 forks source link

截屏咨询 #22

Closed liaoxuewei closed 1 year ago

liaoxuewei commented 1 year ago

截屏函数看来只是向系统发起截屏的请求,按函数理解,应该截屏后把图截了以后保存到截屏目录,这样存在不能建立调用截屏和保存的文件名称的关系,而且访问也比较麻烦,我网上看好像无障碍是提供截屏的api,但是资料不是很多,不知道作者是否可以配套,要是能截屏后返回BitMap就好了。

liaoxuewei commented 1 year ago

https://www.coder.work/article/7876901 https://stackoverflow.com/questions/68646933/does-android-accessibilityservice-take-screenshot-work-on-api-lower-than-30 参考网址,但是因为不太熟悉无障碍服务,还不能对接起来

liaoxuewei commented 1 year ago

不知道我对截屏的理解对不对呢

Krosxx commented 1 year ago

无障碍截屏需要Android 11+

image
liaoxuewei commented 1 year ago
//参考https://stackoverflow.com/questions/68646933/does-android-accessibilityservice-take-screenshot-work-on-api-lower-than-30
//截屏
/*
//暂时无法编译
@RequiresApi(api = Build.VERSION_CODES.R)
fun takeScreenshot(): Bitmap =
    _takeScreenshot()

private fun _takeScreenshot(): Bitmap {
    _baseService.takeScreenshot(Display.DEFAULT_DISPLAY,
        getApplicationContext().getMainExecutor(), object : TakeScreenshotCallback() {
            @RequiresApi(api = Build.VERSION_CODES.R)
            fun onSuccess(@NonNull screenshotResult: ScreenshotResult) {
                Log.i("ScreenShotResult", "onSuccess")
                val bitmap: Bitmap = Bitmap.wrapHardwareBuffer(
                    screenshotResult.getHardwareBuffer(),
                    screenshotResult.getColorSpace()
                )
            }

            fun onFailure(i: Int) {
                Log.i("ScreenShotResult", "onFailure code is $i")
            }
        })
}
*/

当时尝试这样,但是发现很多对象没有定义。 能否增加你所截图所示的功能呢,增加类似@RequiresApi(api = Build.VERSION_CODES.R)可以控制是否可用,在适合的安卓版本使用即可。 谢谢!

liaoxuewei commented 1 year ago
    //参考https://github.com/Vove7/Android-Accessibility-Api/issues/22
    //暂时无法编译
    /*
    @RequiresApi(api = Build.VERSION_CODES.R)
    suspend fun takeScreenshot(): Bitmap? =
        _takeScreenshot()

    @RequiresApi(Build.VERSION_CODES.R)
    private suspend fun _takeScreenshot(): Bitmap? {
        val img = suspendCoroutine { cor ->
            AccessibilityApi.requireBase.takeScreenshot(
                0, act.mainExecutor,
                object : AccessibilityService.TakeScreenshotCallback {
                    override fun onSuccess(screenshot: AccessibilityService.ScreenshotResult) {
                        cor.resume(Bitmap.wrapHardwareBuffer(screenshot.hardwareBuffer, null))
                    }

                    override fun onFailure(errorCode: Int) {
                        cor.resume(null)
                    }
                })
        }
        return img
    }
    */

尝试加上以上代码,act对象不存在,应该怎么处理?

liaoxuewei commented 1 year ago
    //参考https://github.com/Vove7/Android-Accessibility-Api/issues/22
    @RequiresApi(api = Build.VERSION_CODES.R)
    suspend fun takeScreenshot(): Bitmap? =
        _takeScreenshot()

    @RequiresApi(Build.VERSION_CODES.R)
    private suspend fun _takeScreenshot(): Bitmap? {
        val img = suspendCoroutine { cor ->
            AccessibilityApi.requireBase.takeScreenshot(
                0, _baseService.mainExecutor,
                object : AccessibilityService.TakeScreenshotCallback {
                    override fun onSuccess(screenshot: AccessibilityService.ScreenshotResult) {
                        cor.resume(Bitmap.wrapHardwareBuffer(screenshot.hardwareBuffer, null))
                    }

                    override fun onFailure(errorCode: Int) {
                        cor.resume(null)
                    }
                })
        }
        return img
    }

act --> _baseService