2016-04-15 3 views
1

Я использую MediaProjection для создания снимка экрана. Это то, что я делаю. Я создал значок оверлея, используя service.On, щелкнув значок наложения, снимок сделан. Проблема в том, что всякий раз, когда приложение уничтожается либо нажатием кнопки «Назад», либо вручную, путем его прокрутки, объект 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 
    } 

} 

Мой класс Service для наложения значка ручки нажмите следующим образом:

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 и имею га rd раз вычисляя это out.Any помощь будет оценена.

+0

Приложение, перемещающееся на задний план, не обязательно убивается. Его можно убить, чтобы освободить память, или он может сидеть спокойно, пока он не остановится. Есть ли причина, по которой вы не можете выпустить медиапроекцию во время паузы и воссоздать ее при возобновлении? – fadden

ответ

1

Просто заново создайте медиапроекцию, как предполагалось в его комментарии. Поскольку каждый раз, когда ваша служба убивается, связанный с ней наложение также убивается, поэтому при перезапуске службы вы должны повторно создать медиапроекцию.

Вы уже отлично справляетесь, не потребляя первоначального намерения и вместо этого используя клон, как на это отвечает https://stackoverflow.com/a/33892817/3918978.

Однако, если разрешение или MediaProjection не должны быть действительными, просто получите новый (запустите запрос, запрашивающий его).

Смежные вопросы