android - 为什么添加 list CAPTURE_VIDEO_OUTPUT 或 CAPTURE_SECURE_VIDEO_OUTPUT 时会出现错误?

标签 android screenshot screen-capture

遇到这样的问题。随着这段代码的实现,出现异常:

DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); int mDensity = displayMetrics.密度Dpi;

        DisplayManager dM = (DisplayManager) getSystemService(ContextWrapper.DISPLAY_SERVICE);

        ImageReader imR = ImageReader.newInstance(300, 300, PixelFormat.RGBA_8888, 2);


        VirtualDisplay vD = dM.createVirtualDisplay("VladScreen", 300, 300, mDensity, imR.getSurface(), DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC);

异常情况如下:

 java.lang.SecurityException: Requires CAPTURE_VIDEO_OUTPUT or CAPTURE_SECURE_VIDEO_OUTPUT permission, or an appropriate MediaProjection token in order to create a screen sharing virtual display.
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.os.Parcel.readException(Parcel.java:1599)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.os.Parcel.readException(Parcel.java:1552)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.hardware.display.IDisplayManager$Stub$Proxy.createVirtualDisplay(IDisplayManager.java:484)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.hardware.display.DisplayManagerGlobal.createVirtualDisplay(DisplayManagerGlobal.java:377)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.hardware.display.DisplayManager.createVirtualDisplay(DisplayManager.java:537)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.hardware.display.DisplayManager.createVirtualDisplay(DisplayManager.java:529)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.hardware.display.DisplayManager.createVirtualDisplay(DisplayManager.java:480)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at com.example.novoseltsev.applicationpopupwindow.MainActivity.onCreate(MainActivity.java:106)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.app.Activity.performCreate(Activity.java:6237)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.app.ActivityThread.-wrap11(ActivityThread.java)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.os.Looper.loop(Looper.java:148)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
09-27 04:03:30.321 7739-7739/com.example.novoseltsev.applicationpopupwindow W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
09-27 04:03:30.363 7739-11879/com.example.novoseltsev.applicationpopupwindow D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true

据我了解,它未添加到权限 CAPTURE_VIDEO_OUTPUTCAPTURE_SECURE_VIDEO_OUTPUT 中。

但是添加manifest.xml后异常仍然存在

<uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"/>

最佳答案

用于系统服务,不适用于第三方应用程序。

https://developer.android.com/reference/android/hardware/display/DisplayManager.html#VIRTUAL_DISPLAY_FLAG_PUBLIC

创建不限于自己内容的公共(public)虚拟显示只会隐式创建自动镜像显示。有关允许谁创建自动镜像显示的限制,请参阅 VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR。

https://developer.android.com/reference/android/hardware/display/DisplayManager.html#VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR ...... 创建自动镜像虚拟显示器需要 CAPTURE_VIDEO_OUTPUT 或 CAPTURE_SECURE_VIDEO_OUTPUT 权限。这些权限保留供系统组件使用,第三方应用程序不可使用。或者,可以使用适当的 MediaProjection 来创建自动镜像虚拟显示。

关于android - 为什么添加 list CAPTURE_VIDEO_OUTPUT 或 CAPTURE_SECURE_VIDEO_OUTPUT 时会出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39715812/

相关文章:

python - 如何对新加载的网页进行截图

java - Java + Cucumber 失败的屏幕截图

c# - 单击时捕获并保存屏幕截图 - Windows C#

android - 是否有适用于 Mac 或 Windows 的 Miracast 客户端/服务器?

java - Android NullPointerException(getDatabaseLocked 和 getWritableDatabase)

java - 应用程序退出时 MediaPlayer 不会停止

Android - 允许在设备所有者应用程序中安装非市场应用程序失败

android - 我找不到适用于 Play 商店的 apk 发布文件

c# - 在 C# 中使用 IronOCR 进行光学字符识别

c++ - BitBlt 忽略 CAPTUREBLT 并且似乎总是捕获目标的缓存拷贝