Предотвратить потерю объекта MediaProjection при завершении приложения

Я использую MediaProjection, чтобы сделать снимок экрана. Это то, что я делаю. Я создал значок наложения с помощью сервиса. При нажатии на значок наложения делается снимок экрана. Проблема в том, что всякий раз, когда приложение уничтожается нажатием кнопки «Назад» или вручную прокручивая его, объект MediaProjection теряется. Есть ли способ сохранить MediaProjection и избежать запроса MediaProjection каждый раз, когда приложение уничтожается. Я уже видел этот но я все еще не могу этого сделать.

В моей основной активности 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, и мне трудно понять это. Любая помощь будет оценена по достоинству.


person Junior    schedule 15.04.2016    source источник
comment
Приложение, перемещающееся в фоновый режим, не обязательно уничтожается. Его можно убить, чтобы освободить память, или он может спокойно сидеть, пока не будет снята пауза. Есть ли причина, по которой вы не можете выпустить медиа-проекцию во время паузы и воссоздать ее при возобновлении?   -  person fadden    schedule 17.04.2016


Ответы (1)


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

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

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

person tot    schedule 29.08.2016