java - 在表面上截屏时出现错误
问题描述
在表面上截屏时出现错误。大量图片后,出现此错误(设备自带),但应用程序并没有停止。
经过大量的图片,这种方法不再有效。你对如何解决问题有想法吗?
@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
解决方案
在使用 PixelCopy 连续抓取 SurfaceView 的内容(即用于视频传输)时,我看到了同样的错误。我只在 Android 7.0 设备上看到了这种效果。
我将此归因于 Readback.cpp 中存在的内存泄漏,如果我没记错的话,这就是PixelCopy 在内部使用的。
此修复程序于 2016 年 9 月 1 日添加,而 Android 7.0 于 2016 年 8 月 22 日发布,
推荐阅读
- python - Python:查找循环组的所有生成器
- javascript - Using prototypes to gain more performance
- reactjs - fetch 被告知调用一个 http 资源,但它调用了一个 https 资源
- python - 每个标签的多个复选框
- c++ - 为什么我的 C++ 程序给了我错误的输出?
- django - 在 django 中指定自定义用户模型并调用对象
- c# - 在文本框、单选按钮或下拉菜单上临时存储值
- python - 使用 pyopengl 创建透明窗口/叠加层
- c++ - 将 Poco StreamSocket 转换为 SecureStreamSocket
- python - 从 xarray DataArray 中删除坐标