2016-04-15 108 views
1

我正在使用MediaProjection截取屏幕快照。这就是我所做的。我使用service创建了一个覆盖图标。单击覆盖图标时会截图。问题是,每当通过按回按钮或通过滑动手动杀死应用程序时,MediaProjection对象都会丢失。是否有办法维护MediaProjection并避免每次应用程序被终止时请求MediaProjection。我已经看到this,但我仍然无法做到。防止MediaProjection对象在杀死应用程序时丢失

在我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和具有公顷第三次弄清楚这一点。任何帮助将不胜感激。

+0

移动到后台的应用程序不一定会被杀死。它可能被杀死以释放内存,或者它可能安静地坐下,直到它没有被暂停。是否有理由不能在暂停时间发布媒体投影,并在简历中重新创建? – fadden

回答

1

只需重新创建媒体投影,就像fadden在他的评论中暗示的那样。由于每次您的服务被终止时,相关的叠加层也会被终止,因此您必须在重新启动服务时重新创建媒体投影。

你已经做得很好,没有消耗原意,而是使用了一个克隆,这里的答案是https://stackoverflow.com/a/33892817/3918978

但是,如果权限或MediaProjection不再有效,只需要获得一个新的(开始一个活动)。