【问题标题】:Prevent MediaProjection object from being lost on killing the Application防止 MediaProjection 对象在杀死应用程序时丢失
【发布时间】:2023-03-11 13:20:01
【问题描述】:

我正在使用 MediaProjection 截屏。这就是我正在做的事情。我使用服务创建了一个覆盖图标。单击覆盖图标时会截取屏幕截图。问题是每当应用程序被按下后退按钮被杀死时或手动滑动它,MediaProjection 对象会丢失。有没有办法维护 MediaProjection 并避免每次应用程序被杀死时请求 MediaProjection。我已经看过this,但我还是做不到。

在我的 Mainactivity Onclick 中包含 startActivityForResult ,结果 onActivityResult 如下:

 @Override
protected void onActivityResult(final int requestCode,final int resultCode,final Intent data)
{
    if (requestCode == requestcode)
    {
        if (resultCode == RESULT_OK)
        {
            Singelton.setScreenshotPermission((Intent) data.clone());
            Singelton.putmanger(mediaProjectionManager);

        }else if (resultCode==RESULT_CANCELED) {
            Singelton.setScreenshotPermission(null);
        }
    }
}

Singelton类如下:

protected static void setScreenshotPermission(final Intent permissionIntent)
{
    screenshotPermission = permissionIntent;
//screenshotPermission becomes null once the application is killed
}

public static MediaProjection getData()
{
    return (mediaProjection);
}

public static void getScreenshotPermission()
{
    if (screenshotPermission != null)
    {
        Log.d("screenshotpermisson", "screenshotPermission != null ");
        if(mediaProjection!=null)
        {
            Log.d("mediaprojection", "mediaprojection != null ");
            mediaProjection.stop();
            mediaProjection = null;
        }
        mediaProjection = mediaProjectionManager.getMediaProjection(Activity.RESULT_OK, (Intent) screenshotPermission.clone());
    }
   else
    {
    //Here I need to request for media projection again without starting activity
    }

}

我的覆盖图标句柄的服务类点击如下:

 public void createDisplay()
{
    if (mediaProjection == null)
    {
        Singelton.getScreenshotPermission();
        mediaProjection = Singelton.getData();
    }

    mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1);
    vd = mediaProjection.createVirtualDisplay("screen-mirror", width, height, mDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);
    mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener(){..}
}

我是 android 新手,很难弄清楚这一点。任何帮助将不胜感激。

【问题讨论】:

  • 移动到后台的应用不一定会被杀死。它可能会被杀死以释放内存,或者它可能会静静地坐着直到它没有暂停。是否有您不能在暂停时释放媒体投影并在恢复时重新创建它的原因?

标签: android singleton android-mediaprojection


【解决方案1】:

只需按照他评论中暗示的时尚重新创建媒体投影即可。由于每次您的服务被终止时,相关的覆盖也会随之终止,因此在重新启动服务时无论如何您都必须重新创建媒体投影。

您已经做得很好,不使用原始意图,而是使用此处回答的克隆https://stackoverflow.com/a/33892817/3918978

但是,如果权限或 MediaProjection 不再有效,只需获取一个新权限(启动一项请求它的活动)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多