我正在尝试复制Android市场中最新YouTube应用的功能.观看视频时,有两个独立的布局,一个是纵向提供额外的信息,一个是横向,提供视频的全屏视图.

YouTupe应用程序处于纵向模式

横向模式的YouTube应用
(抱歉照片的随机性,但它们是我能找到的第一个实际布局照片)
这通常很容易做到 - 只需在layout-land中指定一个替代布局,一切都会很好.YouTube应用程序的功能非常好(以及我想要复制的内容)是在方向更改时,视频会继续播放,而不必从头开始重新缓冲.
我已经发现,覆盖onConfigurationChange()并设置新的LayoutParameters将允许我在不强制拒绝的情况下调整视频大小 - 但是当多次旋转屏幕时,视频会随机缩放到不同的宽度/高度.我已尝试在VideoView上进行各种invalidate()调用,尝试在父RelativeLayout容器上调用RequestLayout()并尝试尽可能多的不同内容,但我似乎无法让它正常工作.任何建议将不胜感激!
这是我的代码:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
questionText.setVisibility(View.GONE);
respond.setVisibility(View.GONE);
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
} else {
questionText.setVisibility(View.VISIBLE);
respond.setVisibility(View.VISIBLE);
Resources r = getResources();
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150.0f, r.getDisplayMetrics());
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我在logcat中发现了一些有趣的输出,当我的视频旋转时出现这似乎是罪魁祸首 - 虽然我不知道如何解决它:
正确调整大小时的Logcat输出(占用整个窗口)
注意h = 726
12-13 15:37:35.468 1262 1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=210}
12-13 15:37:35.561 1262 1268 I …Run Code Online (Sandbox Code Playgroud) 我是Android开发新手,我正在编写游戏.我的游戏在每个级别开始之前都有过程,并且通过视频查看完成过程.我的问题是,在应用程序暂停时,cutceen在恢复时从头开始.
@Override
public void onPause() {
super.onPause();
video.pause();
}
@Override
public void onResume()
{
super.onResume();
video.resume();
}
Run Code Online (Sandbox Code Playgroud)
我们的问题是视频实际上并没有从我们暂停的地方恢复,而是从一开始就恢复.
我正在构建一个应用程序,用户点击按钮以全屏显示视频.最初,视频附加到ViewPager内的视图.为了能够全屏显示,我将其与父项分离,并将其重新连接到根视图.这种方法很好,除非在播放时将视频切换为全屏.当我分离播放VideoView时,它只是停止,我需要重新启动它.这是不可接受的,因为视频在恢复之前开始缓冲.这里是完成分离的代码部分:
final ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
final ViewGroup root = (ViewGroup) findViewById(R.id.root);
Button b = (Button) findViewById(R.id.button);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
parent.removeView(mVideoView);
LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
root.addView(mVideoView, lp);
}
});
Run Code Online (Sandbox Code Playgroud)
根据设备,我有一个不同的日志错误.可能是因为实际的视频播放器是由制造商提供的,而不是Android SDK.以下是Nexus 7的错误日志:
10-30 20:26:18.618: D/NvOsDebugPrintf(124): NvMMDecTVMRDestroyParser Begin
10-30 20:26:18.618: D/NvOsDebugPrintf(124): --------- Closing TVMR Frame Delivery Thread -------------
10-30 20:26:18.678: D/NvOsDebugPrintf(124): ------- NvAvpClose -------
10-30 20:26:18.678: D/NvOsDebugPrintf(124): NvMMDecTVMRDestroyParser Done
10-30 20:26:18.678: D/NvOsDebugPrintf(124): NvMMLiteTVMRDecPrivateClose Done
Run Code Online (Sandbox Code Playgroud)
我无法在不停止的情况下分离视频.我尝试使用SurfaceView或TextureView但没有成功.
我也尝试过寻找第三方视频播放器.我发现了一个商业原因(http://www.vitamio.org/),我出于商业原因无法真正使用它.我找到了一个开源的,去年没有更新过(https://code.google.com/p/dolphin-player/).
我目前只在平板电脑上定位Android 4.2或更高版本. …
无论如何,您可以使应用程序在方向之后保留缓冲区,而无需手动处理配置更改.
场景基本上:
当方向改变时,应保留视频缓冲区直到最新点.
需要重新加载新的布局(因为portait和lanscape具有不同的布局),因此让app重新启动活动以重新加载新资源是我认为最好的方法.
视频组件位于片段中.
我尝试但不可接受的替代方案:
第一个解决方法是保存视频的位置,在创建视图后,使用seekTo转到最后一个点.但是,这将导致设备再次重新缓冲.
我尝试使用片段setRetainInstance(true)并确保在方向更改后媒体播放器不会重新初始化.在每个onCreateView之后,我只需将mediaplayer.setDisplay()设置为新的surfaceholder.不幸的是,这导致媒体播放器进入错误状态,这又需要重置媒体播放器.
对此有何建议/解决方法?
编辑:我看到stackoverflow中的某个地方,你可以更改媒体播放器表面持有人,而媒体播放器在android 4.0+中处于活动状态.但是,我正在为android 3.x开发一个应用程序.
我想在下载过程中下载和播放视频文件.由于VideoView没有帮助解决这个问题,我决定使用nanoHTTPd创建一个伪HTTP服务器,并在我自己的服务器内尝试下载视频文件并在之后播放但我的问题是:
1 - 如何将下载的部件刷新到视频视图并下载其余部分?
以下是我的来源:
public class VideoStreamingServer extends NanoHTTPD {
public VideoStreamingServer() {
// by default listening on port 8080
super(8080);
}
@Override
public Response serve(String URI, Method method,
Map header, Map parameters, Map files) {
FileInputStream fis = null;
try {
// fis = new FileInputStream("/mnt/sdcard/p/1.mp4");
File bufferFile = File.createTempFile("test", "mp4");
BufferedOutputStream bufferOS = new BufferedOutputStream(
new FileOutputStream(bufferFile));
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.example.net/dl/1.mp4");
HttpResponse response = client.execute(request);
Header[] headers = response.getAllHeaders();
Log.e("Internet buffer", …Run Code Online (Sandbox Code Playgroud)