2012-09-27 33 views
5

Đối với videoview tùy chỉnh, tôi phải ghi đè MediaController (để thay đổi thiết kế của các nút và kết nối với các nút tạm dừng/phát bộ chọn). Tình huống này là: đặt video tạm dừng và chuyển ứng dụng, sau đó khôi phục lại, video bắt đầu phát lại và không phải từ thời điểm video bị tạm ngưng và do đó câu hỏi nảy sinh: cách làm cho video bắt đầu phát từ nơi này, nơi nó đã được dừng lại? Tôi cần thay đổi gì trong VideoActivity?Phát video từ trạng thái tạm dừng trong VideoView

public class VideoActivity extends Activity { 

VideoView videoView; 

VkMediaController mc; 

private static final String CURRENT = "duration"; 

private static final String URL = "url"; 

private Uri mURI; 

private int mCurrentPosition = -1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.video_view_player); 
    videoView = (VideoView) findViewById(R.id.videoViewplayer); 
    mc = new VkMediaController(this); 
    mURI = getIntent().getData(); 
    if (savedInstanceState != null) { 
     mURI = Uri.parse(savedInstanceState.getString(URL)); 
     mCurrentPosition = savedInstanceState.getInt(CURRENT); 

    } 
    videoView.setMediaController(mc); 
    videoView.setVideoURI(mURI); 
    videoView.requestFocus(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    videoView.start(); 
    if (mCurrentPosition != -1) { 
     videoView.seekTo(mCurrentPosition); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(CURRENT, videoView.getCurrentPosition()); 
    outState.putString(URL, mURI.toString()); 
    super.onSaveInstanceState(outState); 
} 

}

+0

lỗi/vấn đề là gì? điều gì sai với mã này? – njzk2

+0

không có lỗi, nhưng không bắt đầu phát từ vị trí hiện tại và từ đầu – ricky

+0

bạn đã kiểm tra giá trị của mCurrentPosition chưa? – njzk2

Trả lời

14

Tôi nghĩ vấn đề là videoView.getCurrentPosition() sẽ luôn luôn trở về 0 khi bạn gọi bên onSaveInstanceState(Bundle outState), cos lúc bấy giờ video đã thiết lập lại, vì vậy gọi videoView.getCurrentPosition() khi onPause(), điều này sẽ đưa bạn trở mong muốn giá trị.

+0

cảm ơn, tôi cố gắng làm điều đó – ricky

+0

bảo vệ void onPause() { videoView.pause(); videoView.getCurrentPosition(); super.onPause(); } có đúng không? – ricky

+0

và tôi phải giữ mCurrentPosition trong onSaveInstanceState (Bundle outState)? – ricky

2

Tôi đã gặp vấn đề tương tự. Tôi nghĩ tôi đã làm mọi thứ đúng nhưng nó không hoạt động. Sau đó, tôi chỉ thay đổi thứ tự vì vậy lần đầu tiên tôi gọi VideoView.seekTo() và sau đó VideoView.start(). Điều đó hiệu quả. Tôi cũng có VideoView.requestFocus() trong đó nhưng tôi không biết nếu có vấn đề.

videoPlayer.requestFocus(); 
videoPlayer.seekTo(position); 
videoPlayer.start(); 

Vì vậy, nếu bạn chắc chắn biến vị trí của bạn có giá trị phù hợp, đây có thể là câu trả lời của bạn. Bạn có thể không tìm được khi Video không được tải. Triển khai onPreparedListener như thế này:

public class VideoActivity extends Activity implements OnPreparedListener { 
    VideoView videoPlayer; 
    int position; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState!=null){ 
    position=savedInstanceState.getInt("pos") 
    } 
    // setting up the videoview 
    setContentView(R.layout.activity_video); 
    getIntent().getExtras().getString("url"); 
    Uri videouri = Uri.parse(getIntent().getExtras().getString("url")); 
    videoPlayer = (VideoView) findViewById(R.id.videoView); 
    videoPlayer.setOnPreparedListener(this); 
    videoPlayer.setKeepScreenOn(true); 
    videoPlayer.setVideoURI(videouri); 

    } 

    /** 
    * Start the plaback when the video is loaded 
    * 
    * @param mp 
    * @see android.media.MediaPlayer.OnPreparedListener#onPrepared(android.media.MediaPlayer) 
    */ 
    public void onPrepared(MediaPlayer mp) { 
    //this is a TextView infront of the VideoView which tells the User the Video is loading- hide that 
    findViewById(R.id.tv_video_load).setVisibility(View.GONE); 

    videoPlayer.requestFocus(); 
    videoPlayer.seekTo(position) 
    videoPlayer.start(); 
} 
} 
+0

Bạn gọi các phương thức này trong onCreate() hoặc trong onStart()? – ricky

+0

oh bạn đúng. Tôi đã triển khai OnPreparedListener và đây là tất cả trong phương thức onPrepared. Làm cho tinh thần bạn không thể tìm kiếm nếu video chưa được tải. –

+0

tôi gọi những phương pháp này trong onStar, nó là chính xác? – ricky

Các vấn đề liên quan