1

私のコードに問題があります。誰でも助けてくれますか?video&image viewPager

私はそれを行う自動または手動で

私はviewpagerに画像や動画の一覧を表示したいメッセンジャーアプリ
のようにアプリのプレイの話をする必要があるが、私はいくつかの問題

まず直面した:

画像のページが表示され、次のページがビデオを再生するときページャが私が使用した次のフラグメントをロードするため、画像を表示するときにビデオのサウンドが再生されます mViewPager.setOffscreenPageLimit(0);しかし、私は任意のもの

2つ目をしませんでした。

私はビデオからの画像に手動で移動したときに、私は、この発見解決策を検索するときにビデオが再生を停止しない:

public void setUserVisibleHint(boolean isVisibleToUser) {  
super.setUserVisibleHint(isVisibleToUser);       
if (this.isVisible()) 
{  
if (!isVisibleToUser) // If we are becoming invisible, then... 
    { 
     //player.release();}}}} 

が、それはだがプレーヤーを停止しますが、次のページにビデオがある場合は再生されません この問題をどうやって解決できますか?

マイコード:

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; 
} 

}

+0

ビデオ用に別の断片を、画像用に別の断片を持つ方がよいと思います。 – Ibrahim

+0

私はこれを行うが、それは、2つのビデオの音が画像 –

+0

を表示するときに 'fillData(ポストビュー、depate)と呼ばれるので、これが起こっpalyingさも同時に再生し、2本のビデオがあるときに問題を抱えているにもあります;' onCreatViewで'surfaceCreated'の中でそれを使用しようとするかもしれないすべてのビデオを呼び出し、' surfaceDestroyed'の中でそれを停止します – Ibrahim

答えて