2013-04-02 8 views
21

Tôi đang sử dụng thành phần VideoView để phát video. Tôi dường như không thể xóa hiển thị VideoView sau khi tôi gọi thủ công stopPlayback(). Tôi muốn đặt lại VideoView để nền ban đầu hiển thị.Android VideoView hiển thị rõ ràng sau stopPlayback()

  1. Phát video trong thành phần VideoView.
  2. Chọn video mới để phát.
  3. VideoView bị kẹt trên khung hình cuối cùng của video đầu tiên cho đến khi video tiếp theo bắt đầu. Nếu có lỗi với video tiếp theo, hình ảnh tĩnh từ video đầu tiên vẫn bị kẹt ở đó.
  4. Nếu tôi để trạng thái phát video hoàn thành, màn hình sẽ bị xóa.

Mã Tôi đang sử dụng:

private VideoView videoViewer = null; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    if (videoViewer != null) { 
    videoViewer.setOnPreparedListener(new OnPreparedListener()); 
    } 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    } 
} 

Lưu ý rằng dựa trên các nguồn VideoView.java, stopPlayback() có các hành động sau trên MediaPlayer cơ bản:

public void stopPlayback() { 
    if (mMediaPlayer != null) { 
    mMediaPlayer.stop(); 
    mMediaPlayer.release(); 
    mMediaPlayer = null; 
    } 
} 

Trả lời

9

Các giải pháp tôi giải quyết trên, trừ khi ai đó có thể cung cấp một tốt hơn, là sử dụng setBackgroundResource, mà dường như kỳ lạ được đặt tên vì nó xuất hiện để thay đổi tài nguyên tiền cảnh.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    // Set the background back to the drawable resource to clear the current video when switching to a new one. 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    // Clear the background resource when the video is prepared to play. 
    videoViewer.setBackgroundResource(0); 
    } 
} 

Tôi có thể tham chiếu một cách đơn giản layer-list với nền màu xanh tùy chỉnh và hình ảnh biểu tượng trung tâm.

drawable \ viewer_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
    <shape android:shape="rectangle"> 
     <solid android:color="@color/custom_blue" /> 
    </shape> 
    </item> 
    <item> 
    <bitmap android:src="@drawable/img_logo" 
     android:gravity="center" /> 
    </item> 
</layer-list> 

Ngoài ra tôi cũng đã có thể sử dụng setZOrderOnTop để kiểm soát nơi xem bề mặt được đặt (bạn cũng có thể xác định một điểm trên đầu trang của VideoViewer và chuyển tầm nhìn đó chiều):

videoViewer.setZOrderOnTop(false); 
videoViewer.setZOrderOnTop(true); 

Ngoài ra tôi cũng có thể sử dụng setBackgoundColor để thực hiện được điều tương tự như setBackgroundResource:

videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue)); 
videoViewer.setBackgroundColor(Color.TRANSPARENT); 
+0

Khi Tôi làm điều này, phát lại tiếp theo vẫn hiển thị khung cuối cùng của khung hình trước đó. Bất kỳ ý tưởng nào về lý do tại sao điều đó xảy ra? – slhck

+0

Khung hình video thực tế được vẽ trên bề mặt "bên dưới" VideoView. Đặt nền trên VideoView sẽ ẩn khung nhưng không xóa nó.Khi nền được xóa, khung cũ vẫn còn đó. – William

12

Đối với tôi, những gì làm việc chỉ đơn giản là ẩn sau đó hiển thị VideoView sử dụng setVisibility.

public void clearCurrentFrame() { 
    videoView.setVisibility(GONE); 
    videoView.setVisibility(VISIBLE); 
} 

Điều này là do tôi muốn VideoView trở nên trong suốt, không phải là màu đồng nhất. Đặt nền thành trong suốt không hoạt động - khung video vẫn hiển thị.

+0

Tôi vừa nhận được một bản chỉnh sửa được đề xuất từ ​​một người dùng nặc danh nói để đặt 'videoView.stopPlayback();' làm dòng cuối cùng của mã. Tôi không thể xác minh rằng nó là cần thiết, mặc dù video sẽ cần phải được dừng lại để câu trả lời của tôi hoạt động. Chỉ muốn để nó ở đây trong trường hợp nó giúp ai :) – William

1

Vâng, đối với tôi không ai trong số các giải pháp từ chủ đề này làm việc, vì vậy tôi cố gắng cái gì khác và dưới đây là những giải pháp mà làm việc cho tôi,

new Handler().postDelayed(new Runnable() { 

    @Override 
    public void run() { 
     mVideoViewPlayList.setVisibility(View.GONE); 
     mVideoViewPlayList.setVisibility(View.VISIBLE); 
     mVideoViewPlayList.setVideoURI(Uri.parse(path)); 
    } 
}, 500); 
+0

Không vi phạm. Tôi thực sự tự hỏi mục đích của những dòng đó là gì. mVideoViewPlayList.setVisibility (View.GONE); mVideoViewPlayList.setVisibility (View.VISIBLE); –

+2

@PsyCoder trong một số thiết bị, mVideoViewPlayList.setVideoURI (Uri.parse (đường dẫn)) không có hiệu lực cho đến khi khả năng hiển thị thay đổi ít nhất một lần! –

+0

Cảm ơn bạn đã giải thích. Nó có thể tiết kiệm thời gian của tôi một ngày nào đó :) –

0

chỉ mã này:

videoView.setVideoURI(null); 
+0

Vui lòng thêm các chi tiết khác vào câu trả lời của bạn! –

+2

java.lang.NullPointerException: uriString nó creashes ứng dụng của tôi khi tôi setUrl null. –

+0

Làm việc cho tôi cảm ơn –