J'ai un problème dans mon code quelqu'un peut-il m'aider?vidéo et image viewPager
que je dois faire l'histoire de jeu d'application comme l'application Messenger
Je veux afficher une liste des images et des vidéos en viewpager automatiquement ou manuellement
je le fais, mais je faisais face à un problème
Première:
lorsque la page de l'image est affichée et que la page suivante lit la vidéo, le son de la vidéo est lu lorsque l'image est affichée car le pager charge le fragment suivant que j'ai utilisé mViewPager.setOffscreenPageLimit (0); mais je ne l'ai pas quelque chose
seconde:
quand je me déplace manuellement de la vidéo à l'image de la vidéo ne cesse de jouer quand je recherche une solution que je trouve ceci:
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (this.isVisible())
{
if (!isVisibleToUser) // If we are becoming invisible, then...
{
//player.release();}}}}
il est arrêter le lecteur mais s'il y a une vidéo dans la page suivante, elle ne joue pas Comment puis-je résoudre ce problème?
Mon code:
public class PostsViews extends Activity {
ArrayList<Post> postsList;
Post postView;
Debate debate;
int position;
private ViewPager mViewPager;
private DemoCollectionPagerAdapter mDemoCollectionPagerAdapter;
private Timer t = new Timer();
private int mCurrentPagerIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_posts_views);
position = 0;
ArrayList postList = new ArrayList<>();
postList.add(new Post("debate_112254", "post_123", 1, "https://firebasestorage.googleapis.com/v0/b/satol-19f92.appspot.com/o/UsersPost%2FImages%2FPhoto_96uMAYBw8b.jpg?alt=media&token=71a5fb9d-7a71-465b-b4e3-4ad2c7513bc5"));
postList.add(new Post("debate_112254", "post_111", 2, "https://firebasestorage.googleapis.com/v0/b/satol-19f92.appspot.com/o/UsersPost%2FVideo%2FVideo_ZVZFgP5JGT.mp4?alt=media&token=07ecb08f-950b-46e3-86aa-ea72e6ccf8d5"));
postList.add(new Post("debate_112254", "post_1563", 2, "https://firebasestorage.googleapis.com/v0/b/satol-19f92.appspot.com/o/UsersPost%2FImages%2FPhoto_mWB8XRF7m5.jpg?alt=media&token=85ca502a-09df-46ab-9b0f-218e28487513"));
postList.add(new Post("debate_112254", "post_189", 1, "https://firebasestorage.googleapis.com/v0/b/satol-19f92.appspot.com/o/UsersPost%2FImages%2FPhoto_qVxVgeqUmR.jpg?alt=media&token=8c079e15-4579-41ee-b373-f34dc23ad045"));
postList.add(new Post("debate_112254", "post_561", 1, "https://firebasestorage.googleapis.com/v0/b/satol-19f92.appspot.com/o/UsersPost%2FImages%2FPhoto_L4wKupgboV.jpg?alt=media&token=3f523167-426c-43bd-91df-b146ee8633db"));
postList.add(new Post("debate_112254", "post_56221", 2, "https://firebasestorage.googleapis.com/v0/b/satol-19f92.appspot.com/o/UsersPost%2FVideo%2FVideo_qS6dMVjMv0.mp4?alt=media&token=fca08c17-b4bb-46eb-a698-eef1f3df3980"));
debate = new Debate("debate_112254", postList, "2017-07-12 12:30");
postsList = debate.getPost();
Log.i("-----", debate.getKey());
mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getFragmentManager(), debate);
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mDemoCollectionPagerAdapter);
mViewPager.setCurrentItem(position);
mViewPager.setOffscreenPageLimit(0);
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
t.cancel();
t = new Timer();
snapImage();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
snapImage();
}
public void snapImage() {
final int pos;
pos = mViewPager.getCurrentItem();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (debate.getPost().get(mViewPager.getCurrentItem()).getPostType() == 1) {
if (pos == debate.getPost().size() - 1) {
try {
t.cancel();
finish();
} catch (Exception e) {
}
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
mViewPager.setCurrentItem(pos + 1);
}
});
}
}
}
}, 10000, 10000);
}
@Override
public void onPause() {
super.onPause();
try {
if (t != null)
t.cancel();
} catch (Exception e) {
}
}
}
public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
Depate depate;
public DemoCollectionPagerAdapter(FragmentManager fm, Depate depate) {
super(fm);
this.depate=depate;
}
@Override
public Fragment getItem(int i) {
Fragment fragment = new DemoObjectFragment();
Bundle args = new Bundle();
// Our object is just an integer :-P
args.putInt(DemoObjectFragment.ARG_OBJECT, i);
args.putSerializable("depate",depate);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
return depate.getPost().size();
}
@Override
public CharSequence getPageTitle(int position) {
return "OBJECT " + (position + 1);
}
}
DemoObjectFragment.class
public class DemoObjectFragment extends Fragment implements SurfaceHolder.Callback,
MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener {
public static final String ARG_OBJECT = "object";
private Depate depate;
private int position;
SurfaceView videoSurface;
MediaPlayer player;
VideoControllerView controller;
private ImageView postImage;
private Post postView;
private String filePath;
private String type;
private FrameLayout frameLayout;
private RelativeLayout rl_video;
private RelativeLayout activity_view_post;
private int mVideoWidth, mVideoHeight;
private Activity activity;
private String fileName;
private ProgressBar loading;
private LinearLayout ll_data;
private ImageView thumb;
private long POST_VIEW_COUNT = 1;
private String depateID;
private String postID;
long time;
private ProgressDialog pd;
private ArrayList<String> debateList = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View viewLayout = inflater.inflate(R.layout.fragment_demo_object, container, false);
Bundle args = getArguments();
depate = (Depate) (args.getSerializable("depate"));
position = args.getInt(ARG_OBJECT);
postView = depate.getPost().get(position);
activity = getActivity();
frameLayout = (FrameLayout) viewLayout.findViewById(R.id.videoSurfaceContainer);
rl_video = (RelativeLayout) viewLayout.findViewById(R.id.rl_video);
postImage = (ImageView) viewLayout.findViewById(R.id.postImage);
thumb = (ImageView) viewLayout.findViewById(R.id.thumb);
ll_data = (LinearLayout) viewLayout.findViewById(R.id.ll_data);
loading = (ProgressBar) viewLayout.findViewById(R.id.loading);
loading.getIndeterminateDrawable().setColorFilter(Color.parseColor("#6782fa"), android.graphics.PorterDuff.Mode.MULTIPLY);
loading.setVisibility(View.VISIBLE);
videoSurface = (SurfaceView) viewLayout.findViewById(R.id.videoSurface);
fillData(postView, depate);
return viewLayout;
}
private void fillData(final Post postView, Depate depate) {
filePath = postView.getFilePath();
type = (postView.getPostType() == 1 ? "image/jpeg" : "video/mp4");
if (type.equalsIgnoreCase("video/mp4")) {
SurfaceHolder videoHolder = videoSurface.getHolder();
videoHolder.addCallback(this);
player = new MediaPlayer();
try {
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDataSource(activity, Uri.parse(filePath));
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
thumb.setVisibility(View.VISIBLE);
loading.setVisibility(View.VISIBLE);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
rl_video.setVisibility(View.VISIBLE);
postImage.setVisibility(View.GONE);
} else {
thumb.setVisibility(View.GONE);
postImage.setVisibility(View.VISIBLE);
rl_video.setVisibility(View.GONE);
loading.setVisibility(View.VISIBLE);
Glide.with(activity)
.load(filePath).centerCrop().listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
postImage.setScaleType(ImageView.ScaleType.CENTER);
postImage.setImageResource(R.drawable.ic_avatar);
loading.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
loading.setVisibility(View.GONE);
return false;
}
}).into(postImage);
}
}
@Override
public void onPrepared(MediaPlayer mp) {
player.start();
loading.setVisibility(View.GONE);
thumb.setVisibility(View.GONE);
}
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
try {
final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.pager);
final int pos;
position = viewPager.getCurrentItem();
if (position == depate.getPost().size() - 1) {
try {
getActivity().finish();
} catch (Exception e) {
}
} else {
pos = position;
viewPager.setCurrentItem(pos + 1);
}
} catch (Exception e) {
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (this.isVisible()) {
if (!isVisibleToUser) {
if (player != null) {
player.release();
}
}else player.start();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
player.setDisplay(holder);
player.prepareAsync();
} catch (Exception e) {
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
activity_posts_views.xml
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000" />
fragment_demo_object.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_view_post"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff000000"
android:fitsSystemWindows="true"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rl_media"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000">
<RelativeLayout
android:id="@+id/rl_video"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible">
<FrameLayout
android:id="@+id/videoSurfaceContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/videoSurface"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
<ImageView
android:id="@+id/thumb"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerInParent="true"
android:background="@drawable/white_circle_opacity"
android:padding="5dp"
android:src="@drawable/evp_action_play" />
</RelativeLayout>
<ImageView
android:id="@+id/postImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:background="#000"
android:visibility="visible" />
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>
Debate.class
public class Debate implements Serializable {
String CreatedAt;
String key;
ArrayList<Post> Post;
public Debate(String key, ArrayList<Post> posts, String createdAt) {
this.key = key;
this.Post = posts;
this.CreatedAt = createdAt;
}
public ArrayList<Post> getPost() {
return Post;
}
public void setPost(ArrayList<Post> Post) {
this.Post = Post;
}
public String getCreatedAt() {
return CreatedAt;
}
public void setCreatedAt(String CreatedAt) {
this. CreatedAt = CreatedAt;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
Post.class
public class Post implements Serializable {
String DebateId;
String PostId;
int PostType;
String FilePath;
public Post(String debateId, String postId, int postType, String filePath) {
DebateId = debateId;
PostId = postId;
PostType = postType;
FilePath = filePath;
}
public String getPostId() {
return PostId;
}
public void setPostId(String postId) {
PostId = postId;
}
public String getDebateId() {
return DebateId;
}
public void setDebateId(String DebateId) {
this.DebateId = DebateId;
}
public int getPostType() {
return PostType;
}
public void setPostType(int PostType) {
this.PostType = PostType;
}
public String getFilePath() {
return FilePath;
}
public void setFilePath(String FilePath) {
this.FilePath = FilePath;
}
}
Je pense qu'il vaudrait mieux avoir un fragment séparé pour la vidéo et un autre pour les images. – Ibrahim
Je fais cela mais il y a aussi un problème quand il y a deux vidéo les deux jouant en même temps aussi le son de la vidéo est palying quand voir une image –
cela est arrivé parce que vous avez appelé 'fillData (postView, depate);' onCreatView invoquera toutes les vidéos, vous pouvez essayer de l'utiliser dans 'surfaceCreated' et l'arrêter dans' surfaceDestroyed' – Ibrahim