- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个使用 ExoPlayer 从 URL 流式传输视频的项目。但是我的代码有问题。旋转设备时,将重新启动整个视频。使用 android:configChanges
修复它,但我不应该使用它。我使用 onSaveInstanceState()
来缓存所有必需的数据,例如 playerPosition、currentWindow 和 setPlayWhenReady;我相应地检索它。但它仍然没有按预期工作。我该如何解决这个问题?
这是存在此问题的整个 Fragment 类:
package com.app.shubhamjhunjhunwala.thebakingapp;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.app.shubhamjhunjhunwala.thebakingapp.Objects.Dish;
import com.app.shubhamjhunjhunwala.thebakingapp.Objects.Step;
import com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.ui.SimpleExoPlayerView;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
import com.google.android.exoplayer2.util.Util;
import com.squareup.picasso.Picasso;
import org.parceler.Parcels;
import org.w3c.dom.Text;
import java.io.IOException;
public class ExtraDetailsFragment extends Fragment {
public ExtraDetailsFragment() {}
public boolean twoPaneLayout;
public Dish dish;
public int stepID;
public String videoURL;
public SimpleExoPlayerView playerView;
public SimpleExoPlayer player;
public long playerPosition;
public boolean playWhenReady;
public int currentWindow;
public TextView textView;
public static boolean hasShownVideoInFullScreen = false;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
final View rootView;
rootView = inflater.inflate(R.layout.extra_details_fragment, container, false);
if (savedInstanceState != null) {
dish = Parcels.unwrap(savedInstanceState.getParcelable("Dish"));
stepID = savedInstanceState.getInt("ID");
twoPaneLayout = savedInstanceState.getBoolean("TwoPane");
playerPosition = savedInstanceState.getLong("PlayerPosition", 0);
playWhenReady = savedInstanceState.getBoolean("PlayWhenReady", true);
currentWindow = savedInstanceState.getInt("CurrentWindow", 0);
Log.d("Player Position", Long.toString(playerPosition));
}
Log.d("Details Fragment", dish.toString());
playerView = rootView.findViewById(R.id.video_view);
textView = rootView.findViewById(R.id.details_text_view);
Step[] steps = dish.getSteps();
textView.setText(steps[stepID].getDescription());
return rootView;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("Dish", Parcels.wrap(dish));
outState.putInt("ID", stepID);
outState.putBoolean("TwoPane", twoPaneLayout);
outState.putLong("PlayerPosition", playerPosition);
outState.putBoolean("PlayWhenReady", playWhenReady);
outState.putInt("CurrentWindow", currentWindow);
}
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
initializePlayer();
}
}
@Override
public void onResume() {
super.onResume();
/*if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE && !twoPaneLayout && !hasShownVideoInFullScreen) {
hasShownVideoInFullScreen = true;
playVideoInFullScreen();
}*/
if ((Util.SDK_INT <= 23 || player == null)) {
initializePlayer();
}
}
@Override
public void onPause() {
super.onPause();
if (Util.SDK_INT <= 23) {
releasePlayer();
}
}
@Override
public void onStop() {
super.onStop();
if (Util.SDK_INT > 23) {
releasePlayer();
}
}
public void initializePlayer() {
player = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(getContext()), new DefaultTrackSelector(), new DefaultLoadControl());
playerView.setPlayer(player);
Step[] steps = dish.getSteps();
String imageURL = "";
videoURL = steps[stepID].getVideoURL();
imageURL = steps[stepID].getImageURL();
if (!videoURL.equals("")) {
Uri uri = Uri.parse(videoURL);
MediaSource mediaSource = buildMediaSource(uri);
player.prepare(mediaSource);
player.seekTo(currentWindow, playerPosition);
player.setPlayWhenReady(true);
} else if (videoURL.equals("") && !imageURL.equals("")) {
final String finalImageURL = imageURL;
new AsyncTask<Void, Void, Void>() {
Bitmap bitmap;
@Override
protected Void doInBackground(Void... voids) {
try {
bitmap = Picasso.with(getContext()).load(finalImageURL).get();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (bitmap != null) {
playerView.setDefaultArtwork(bitmap);
} else {
playerView.setVisibility(View.GONE);
Toast.makeText(getContext(), "No Video Available", Toast.LENGTH_SHORT).show();
}
}
}.execute();
} else {
playerView.setVisibility(View.GONE);
Toast.makeText(getContext(), "No Video Available", Toast.LENGTH_SHORT).show();
}
}
private void playVideoInFullScreen() {
Intent intent = new Intent(getContext(), FullScreenVideoActivity.class);
intent.putExtra("Video URL", videoURL);
startActivity(intent);
}
private void releasePlayer() {
if (player != null) {
playerPosition = player.getCurrentPosition();
playWhenReady = player.getPlayWhenReady();
currentWindow = player.getCurrentWindowIndex();
player.release();
player = null;
}
}
private MediaSource buildMediaSource(Uri uri) {
return new ExtractorMediaSource.Factory(new DefaultHttpDataSourceFactory("exoplayer")).createMediaSource(uri);
}
}
最佳答案
尝试将 fragment 保留实例设置为真:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setRetainInstance(true);
}
不再需要使用 onSaveInstanceState() 或 configChanges。
一些有用的信息: https://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)和 https://stackoverflow.com/a/11318942/6193843
关于java - 如何在不使用android :configChanges的情况下让ExoPlayer在设备旋转时恢复视频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590509/
我想知道Android是否有任何标志要添加到configChanges在 AndroidManifest 中的一个 Activity 属性中用于修改 反转颜色 设备的选项。 android doc显示
谁能给我解释一下 android:configChanges="orientation|keyboardHidden 是什么意思?我有一本书解释如下: Line 16 makes sure that
我试图阻止在旋转设备时调用 onCreate()。为了达到这个目标,我遵循了文档并添加了 到 list 。之后,我将其插入到
这个问题在这里已经有了答案: Android Activity, how to override manifest's android:configChanges with Java code? (2
我知道我们可以为 android:configChanges 设置以下值 mcc mnc touchScreen keyboardHidden orientation,etc. 有时我们通过这个
我正在使用 android:configChanges="orientation|keyboardHidden|screenSize" 这样当屏幕旋转从横向变为纵向时 Activity 不会再次启动,
我正在创建一个杂志应用程序,它使用 ViewPager 并在不同的 WebView 上滚动。大多数页面是纵向的,但也有一些页面可以横向显示。 为了处理这个问题,我在包含 ViewPager 的 Act
我遇到了两种方法来防止 Activity 在屏幕旋转时重绘。一种是 saveInstanceState + restoreInstanceState 组合,我仍然未能成功实现。 另一个是在manife
我正在使用 actionbarsherlock 的 ActionBar,第一次以横向或水平方向运行应用程序时,选项卡以 Tabs Mode 显示。将方向更改为纵向后,导航模式仍在 Tabs 中。第二次
我正在使用 android:configChanges="keyboardHidden|orientation" 在纵向和横向模式之间切换。但是当用户打开 纵向软键盘 并更改为 横向键盘应该隐藏或消失
引用文档: Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the de
我有一个 Android 库项目和使用这个库项目的主应用程序。主应用程序的 list 文件如下所示:
据我了解,如果您将“android:configChanges="orientation"'插入到 list 中的 Activity 中, Activity 将不会在方向更改时被销毁和重新创建。为了测
我使用了 Web View 。加载网页。当我改变方向时,它会重新加载。我想停止重新加载。我在 list XML 文件中做了以下更改。它适用于 android 2.2 但不适用于 android 4.0
我想避免 Activity 在屏幕方向改变时重新启动。在旧的 sdk 版本中,它是由 configChanges="orientation" (在 list 中)完成的。在较新的版本中,添加了 scr
我有一个奇怪的问题。通常在奇怪的问题上我做了一些非常愚蠢的事情。但这我完全不知道哪里出了问题。我加了 android:configChanges="orientation" 到我的应用程序的 Acti
这个问题在这里已经有了答案: 关闭9年前。 Possible Duplicate: Admob Error in Eclipse for android:configChanges 我想在我的 And
我只是想调整我的一些应用程序以适应 HoneyComb。 我面临的问题是我在改变方向(横向/纵向)方面的 Activity 遭到破坏 当我使用经典 Activity 时,我在 list 中写道: 但是
如何使用 Java 代码而不是 XML 来完成此操作?谢谢 android:configChanges="keyboardHidden" 最佳答案 简短回答:你不能。 长答案:开箱即用是不可能的,我想
我为 list 文件中的 Activity 添加了 android:configChanges="density"。但我没有收到 onConfigurationChanged() 回调
我是一名优秀的程序员,十分优秀!