如何通过AIDL在activity和service之间传递surfaceview?
How to pass a surfaceview between activity and service through AIDL?
我想使用 AIDL 将 SurfaceView 从 activity 传递到服务。
在服务中,我将渲染视频。
您不能使用 AIDL 传递 surfaceview。默认只支持某些数据类型,list 和 map。您也可以打包自定义对象,但 surfaceview 不是其中之一。更多 Info.
只有一种解决方案,但您需要使用单例 surfaceview 并确保您的实施中没有任何 UI 泄漏。有一件事,无论何时使用 surfaceview,您都需要重新初始化。每当您从 activity 移出时,已经初始化 surfaceview 的服务将被销毁。因为surfaceview/surface被windowmanager占用了。
android 中的 Service
旨在在 后台 中执行某些操作。如果您想播放视频文件或流,请使用全屏 activity 并在其布局中使用 VideoView
。将媒体的 uri 传递给 VideoView
.
找到解决方案,
代替传递表面视图应用程序可以传递实际实现可分割接口的 Surface,并且可以将 Surface class 的实例传递给 MediaPlayer.setSurface() 以呈现视频。
在 .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());
我想使用 AIDL 将 SurfaceView 从 activity 传递到服务。 在服务中,我将渲染视频。
您不能使用 AIDL 传递 surfaceview。默认只支持某些数据类型,list 和 map。您也可以打包自定义对象,但 surfaceview 不是其中之一。更多 Info.
只有一种解决方案,但您需要使用单例 surfaceview 并确保您的实施中没有任何 UI 泄漏。有一件事,无论何时使用 surfaceview,您都需要重新初始化。每当您从 activity 移出时,已经初始化 surfaceview 的服务将被销毁。因为surfaceview/surface被windowmanager占用了。
Service
旨在在 后台 中执行某些操作。如果您想播放视频文件或流,请使用全屏 activity 并在其布局中使用 VideoView
。将媒体的 uri 传递给 VideoView
.
找到解决方案, 代替传递表面视图应用程序可以传递实际实现可分割接口的 Surface,并且可以将 Surface class 的实例传递给 MediaPlayer.setSurface() 以呈现视频。
在 .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());