我正在使用MediaProjection截屏,这就是我的工作。我使用service创建了一个叠加图标。单击叠加图标后,就会截屏。轻扫它会丢失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的新手,很难解决这个问题。感谢您的帮助。
最佳答案
只需按照他的评论暗示的方式重新创建媒体投影。由于每次服务被杀死时,关联的叠加层也会随之消失,因此,无论如何,您都必须在重新启动服务时重新创建媒体投影。
通过不使用原始意图,而使用在此处https://stackoverflow.com/a/33892817/3918978回答的克隆,您已经很好了。
但是,如果该许可或MediaProjection不再有效,则只需获取一个新的许可(启动一个活动来询问该许可)。