首页 > 解决方案 > 在表面上截屏时出现错误

问题描述

在表面上截屏时出现错误。大量图片后,出现此错误(设备自带),但应用程序并没有停止。

经过大量的图片,这种方法不再有效。你对如何解决问题有想法吗?

@SuppressLint("NewApi")
public static void request(Activity activity, SurfaceView surfaceView, OnScreenShotFinishedListener onScreenShotFinishedListener) {

    // Create a bitmap the size of the scene surfaceView.
    final Bitmap bitmap = Bitmap.createBitmap(surfaceView.getWidth(), surfaceView.getHeight(), Bitmap.Config.ARGB_8888);

    // Create a handler thread to offload the processing of the image.
    final HandlerThread handlerThread = new HandlerThread("PixelCopier" + String.valueOf(new Random().nextInt()));
    handlerThread.start();
    // Make the request to copy.
    PixelCopy.request(surfaceView, bitmap, (copyResult) -> {
        activity.runOnUiThread(() -> onScreenShotFinishedListener.onScreenShotFinished(copyResult, bitmap));
        Log.d("MyData", bitmap.toString());
        handlerThread.quitSafely();
        handlerThread.interrupt();
    }, new Handler(handlerThread.getLooper()));

}
2019-01-29 18:36:07.361 23730-23768/ge.bunny.giffer E/Parcel: dup() failed in Parcel::read, i is 0, fds[i] is -1, fd_count is 2, error: Too many open files
2019-01-29 18:36:07.361 23730-23768/ge.bunny.giffer W/OpenGLRenderer: Failed to get last queued buffer, error = -22

标签: javaandroid

解决方案


在使用 PixelCopy 连续抓取 SurfaceView 的内容(即用于视频传输)时,我看到了同样的错误。我只在 Android 7.0 设备上看到了这种效果。

我将此归因于 Readback.cpp 中存在的内存泄漏,如果我没记错的话,这就是PixelCopy 在内部使用的。

https://github.com/aosp-mirror/platform_frameworks_base/commit/8a29c0ec86a9411a07bb10018c3da69fffc0fe7d#diff-3f79906243073ec92400b65644d330654c8b349e6317259e9639f3a026347d17

此修复程序于 2016 年 9 月 1 日添加,而 Android 7.0 于 2016 年 8 月 22 日发布,


推荐阅读