2011-07-27 46 views
5

Tôi đã viết một ứng dụng thử nghiệm kiểm soát phát lại nhạc nhỏ. Tôi có nút phát, tạm dừng, dừng và tua lại. Vấn đề của tôi là player.stop(); hoạt động theo cách chính xác giống như player.pause(); Tôi đang gọi player.prepare() ngay sau player.stop() để tôi có thể có phiên bản trình phát sẵn sàng cho thao tác start().Ví dụ MediaPlayer: dừng hoạt động như tạm dừng

Tôi không thấy bất kỳ lỗi nào [IOexceptions hoặc IllegalStateExceptions] được nêu trong khi gọi hàm chuẩn bị() sau khi tôi dừng(). Ngoài ra, tôi không gọi bất kỳ seekTo (0) sau khi dừng(). Vì vậy, tôi không đặt lại vị trí cho phần đầu của bài hát.

Tôi đang sử dụng điện thoại Nexus Google One chạy 2.3.4.

Bất kỳ ý tưởng nào nếu tôi đang làm điều gì đó ngu ngốc hoặc nếu những gì tôi đang quan sát thực sự là cách máy trạng thái được xây dựng.

TIA.

+0

Đã ba năm kể từ khi bạn đặt câu hỏi, và sự nghi ngờ của tôi cũng giống nhau. . Tôi chỉ muốn kiểm tra thời tiết mà họ đã cập nhật api để sau khi dừng nó bắt đầu từ khi bắt đầu? – user3726986

+0

@ user3726986 hãy xem nhận xét của tôi trong chuỗi có câu trả lời "được chấp nhận". Đó là vào năm 2011. Nó vẫn hoạt động. –

Trả lời

2

không phải biểu đồ trạng thái http://developer.android.com/reference/android/media/MediaPlayer.html cho biết rằng dừng có nghĩa là "ở trạng thái dừng"?

Dừng gọi() dừng phát lại và khiến MediaPlayer ở trạng thái Đã bắt đầu, Tạm dừng, Chuẩn bị hoặc Phát lạiĐược hoàn thành để vào trạng thái Ngưng.

Khi ở trạng thái Ngưng, không thể bắt đầu phát lại cho đến khi chuẩn bị() hoặc PrepareAsync() được gọi để đặt đối tượng MediaPlayer lại trạng thái đã chuẩn bị. Dừng gọi() không ảnh hưởng đến đối tượng MediaPlayer đã ở trạng thái Ngưng.

Không có xác nhận rằng stop() nên thay đổi CurrentPosition.

Không có xác nhận rằng việc gọi số prepare() phải thay đổi CurrentPosition.

Vì vậy, để chuyển sang phần bắt đầu của bản nhạc, bạn nên sắp xếp vị trí của nó.

Nhưng tôi đồng ý với bạn. Vì phương thức pause() cho biết nó sẽ tiếp tục phát từ vị trí hiện tại, tôi hy vọng nó sẽ quay lại đầu khi stop() được gọi.

Và nó có một số tác động khi bạn cần phải gọi prepare()

Ví dụ, cuộc gọi để chuẩn bị() có thể mất nhiều thời gian để thực hiện, bởi vì nó có thể liên quan đến việc lấy và phương tiện truyền thông giải mã dữ liệu.

nên stop() cần gọi prepare() có thể làm cho nó mất nhiều thời gian, trong khi pause() có tác động ít hơn: bạn có thể gọi start() ngay sau đó.

+0

Câu hỏi là khi bạn đi từ trạng thái dừng sang trạng thái đã chuẩn bị và sau đó gọi start(), chúng ta có mong đợi bài hát bắt đầu từ đầu hoặc từ điểm mà người chơi đã dừng lại hay không. Tôi cảm thấy nó nên bắt đầu từ đầu nhưng tôi đang quan sát nó bắt đầu từ điểm mà nó bị dừng lại. Vì vậy, nó làm cho tôi nghĩ rằng không có sự khác biệt giữa stop() và pause(). Đúng nếu tôi đã sai lầm. –

+0

Đó là cách tôi mong đợi nó sẽ hành xử, nhưng ... hãy xem rằng 'stop' không làm cho nó đi đến một vị trí khác (không có gì nói rằng nó sẽ đi). Và getCurrentPosition() hoạt động ngay cả trong trạng thái dừng. – woliveirajr

+0

hhmm ... tôi mong đợi getCurrentPosition() ở trạng thái dừng để trả về 0. vậy, điểm khác biệt giữa pause() là gì? và dừng lại()? tại sao có hai trạng thái cơ bản hoạt động theo cùng một cách. Đồng ý rằng bạn không cần phải gọi chuẩn bị() sau khi tạm dừng(). Nhưng từ quan điểm của người dùng, không có sự khác biệt ở hai trạng thái này. Cảm ơn woliveirajr. –

3

Tôi nghĩ rằng đây có thể là một lỗi, bởi vì tài liệu API cho phương pháp bắt đầu MediaPlayer cho thấy hành vi mà bạn mong đợi:

public void start()

Bắt đầu hoặc sơ yếu lý lịch phát lại. Nếu phát lại trước đó đã bị tạm dừng, việc phát lại sẽ tiếp tục từ khi phát lại, phát lại . Nếu phát lại đã bị dừng hoặc không bao giờ bắt đầu trước đó, quá trình phát lại sẽ bắt đầu tại số bắt đầu.

Trong thời gian này, gọi rõ ràng seekTo (0) khi người chơi được chuẩn bị có vẻ là giải pháp hợp lý.

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