Nên có bộ điều khiển phụ đề đã đặt lỗi Mediaplayer Android


137

Bất cứ khi nào tôi chơi một phương tiện truyền thông, nó sẽ hiển thị một cảnh báo trong DDMS Should have subtitle controller already set

MÃ CỦA TÔI:

private void start() {
    mediaPlayer.start();

        mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.stop();
            mp.release();
        }
    });
}

Nhật ký DDMS

Nên cài đặt bộ điều khiển phụ đề

thông tin / cảnh báo (2, 0)

Khi tôi tìm kiếm trên Google, thậm chí không có một chủ đề nào liên quan đến nó. Làm thế nào tôi có thể thoát khỏi hoặc vô hiệu hóa điều này?

Câu trả lời:


187

Một nhà phát triển gần đây đã thêm hỗ trợ phụ đề cho VideoView .

Khi MediaPlayerbắt đầu phát nhạc (hoặc nguồn khác), nó sẽ kiểm tra xem có SubtitleContoder hay không và hiển thị thông báo này nếu nó không được đặt. Dường như không quan tâm đến việc nguồn bạn muốn phát là nhạc hay video. Không chắc chắn tại sao anh ta làm điều đó.

Câu trả lời ngắn: Đừng quan tâm đến "Ngoại lệ" này.


Biên tập :

Vẫn hiện diện trong Lollipop ,

Nếu MediaPlayerchỉ được sử dụng để chơi các file âm thanh và bạn thực sự muốn loại bỏ những sai sót trong logcat, mã dưới đây thiết lập một empty SubtitleControllerđến MediaPlayer.

Nó không nên được sử dụng trong môi trường sản xuất và có thể có một số tác dụng phụ.

static MediaPlayer getMediaPlayer(Context context){

    MediaPlayer mediaplayer = new MediaPlayer();

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) {
        return mediaplayer;
    }

    try {
        Class<?> cMediaTimeProvider = Class.forName( "android.media.MediaTimeProvider" );
        Class<?> cSubtitleController = Class.forName( "android.media.SubtitleController" );
        Class<?> iSubtitleControllerAnchor = Class.forName( "android.media.SubtitleController$Anchor" );
        Class<?> iSubtitleControllerListener = Class.forName( "android.media.SubtitleController$Listener" );

        Constructor constructor = cSubtitleController.getConstructor(new Class[]{Context.class, cMediaTimeProvider, iSubtitleControllerListener});

        Object subtitleInstance = constructor.newInstance(context, null, null);

        Field f = cSubtitleController.getDeclaredField("mHandler");

        f.setAccessible(true);
        try {
            f.set(subtitleInstance, new Handler());
        }
        catch (IllegalAccessException e) {return mediaplayer;}
        finally {
            f.setAccessible(false);
        }

        Method setsubtitleanchor = mediaplayer.getClass().getMethod("setSubtitleAnchor", cSubtitleController, iSubtitleControllerAnchor);

        setsubtitleanchor.invoke(mediaplayer, subtitleInstance, null);
        //Log.e("", "subtitle is setted :p");
    } catch (Exception e) {}

    return mediaplayer;
}

Mã này đang cố thực hiện các thao tác sau từ API ẩn

SubtitleController sc = new SubtitleController(context, null, null);
sc.mHandler = new Handler();
mediaplayer.setSubtitleAnchor(sc, null)

12
Tôi đồng ý - đó không phải là lỗi nếu bản nhạc phụ đề không tồn tại. Thông tin nhiều nhất.
Ai đó ở đâu đó

4
ok, chắc chắn, nhưng có một cách dễ dàng để đàn áp nó? nó đang làm hỏng đầu ra logcat của tôi ...
TJ Ellis

Tôi có thể tạo bộ lọc mà tôi nghĩ rằng nếu nó thực sự gây phiền nhiễu, biên dịch lại Android hoặc đặt SubtitleControll trống cho bài hát của bạn.
Hqueto

1
@Hqueto làm thế nào để bạn thiết lập một SubtitleContoder trống? Xin lỗi tôi không thấy điều này trong các tài liệu.
Frank Schwieterman

2
Tất nhiên các tài liệu không cung cấp thông tin này. Nếu bạn đã thấy mã được chia sẻ của MediaPlayer, bạn có thể thấy rằng có một trình cài đặt cho SubtitleContoder (vì vậy nó có thể thực hiện được), nhưng rất tiếc là dường như không có.
Hqueto

8

Để xóa tin nhắn trên logcat, tôi thêm phụ đề để theo dõi. Trên cửa sổ, nhấp chuột phải vào bản nhạc -> Thuộc tính -> Chi tiết -> chèn văn bản vào phụ đề. Làm xong :)


Vài suy nghĩ về điều này: 1) sửa đổi tệp nguồn không thực sự khả thi trong nhiều tình huống. 2) bạn đã không giải thích lý do tại sao việc thêm bản nhạc phụ đề sẽ khắc phục lỗi trên bộ điều khiển phụ đề trong MediaPlayer.
Travis Castillo

Lỗi là "Nên cài đặt bộ điều khiển phụ đề", vì vậy tôi thêm phụ đề để theo dõi để tránh thông báo lỗi này.
StefanoM5

phụ đề hoặc bộ điều khiển phụ đề. bạn đang nói rằng bằng cách có một phụ đề trên video, trình phát đa phương tiện sẽ tự động tạo bộ điều khiển?
Travis Castillo

0

Ngoài ra, bạn chỉ có thể thiết lập mediaPlayer.reset()và trong onDestroythiết lập để phát hành.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.