Как передать поверхностное представление между активностью и обслуживанием через AIDL? - PullRequest
0 голосов
/ 14 мая 2018

Я хочу передать SurfaceView из активности в службу, используя AIDL.В Сервисе я буду рендерить видео.

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

Нашел решение, вместо того, чтобы передавать представление поверхности, приложение может передать Surface, который фактически реализует интерфейс, который можно продать, и экземпляр класса Surface можно передать в MediaPlayer.setSurface () для визуализации видео.

In .aidlфайл

import android.view.Surface;

oneway interface{
void startRender( in Surface surface)
}

в Сервисе

    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.stop();
    mediaPlayer.reset();
    mediaPlayer.setSurface(surfaceViewId);

В приложении

 serviceInstance.startRender((((SurfaceView)findViewById(R.id.surfaceView)).getHolder()).getSurface());
0 голосов
/ 14 мая 2018

Существует только одно решение, но вам нужно использовать одноэлементный вид поверхности и убедиться, что в вашей реализации нет утечек пользовательского интерфейса.И одна вещь, вам нужно повторно инициализировать каждый раз, когда вы используете SurfaceView.Всякий раз, когда вы выходите из вида деятельности и обслуживания, где вид поверхности уже инициализирован, он будет уничтожен.Потому что вид поверхности / поверхность занята диспетчером окон.

0 голосов
/ 14 мая 2018

Service в Android предназначен для того, чтобы что-то делать в фоне .Если вы хотите воспроизвести видеофайл или поток, используйте полноэкранное действие с VideoView в его макете.Передайте URI медиа на VideoView.

0 голосов
/ 14 мая 2018

Вы не можете передать вид поверхности, используя AIDL.По умолчанию поддерживаются только определенные типы данных, список и карта.Вы также можете обрабатывать пользовательские объекты, но SurfaceView не является одним из нихПодробнее Информация .

...