ควรมีตัวควบคุมคำบรรยายตั้งค่าข้อผิดพลาดของ Mediaplayer แล้ว


137

เมื่อใดก็ตามที่ฉันเล่นสื่อมันจะแสดงคำเตือนใน DDMS Should have subtitle controller already set

รหัสของฉัน:

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

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

DDMS LOG

ควรมีตัวควบคุมคำบรรยายตั้งไว้แล้ว

ข้อมูล / คำเตือน (2, 0)

เมื่อฉันค้นหาใน Google ไม่ใช่แม้แต่หัวข้อเดียวที่เกี่ยวข้อง ฉันจะกำจัดหรือปิดการใช้งานสิ่งนี้ได้อย่างไร

คำตอบ:


187

นักพัฒนาเมื่อเร็ว ๆ นี้เพิ่มการสนับสนุนคำบรรยายเพื่อ VideoView

เมื่อMediaPlayerเริ่มเล่นเพลง (หรือแหล่งอื่น ๆ ) มันจะตรวจสอบว่ามี SubtitleController และแสดงข้อความนี้หากยังไม่ได้ตั้งค่า ดูเหมือนจะไม่สนใจว่าแหล่งข้อมูลที่คุณต้องการเล่นนั้นเป็นเพลงหรือวิดีโอ ไม่แน่ใจว่าทำไมเขาทำอย่างนั้น

คำตอบสั้น ๆ :ไม่สนใจ "ข้อยกเว้น" นี้


แก้ไข:

ยังคงอยู่ในLollipop ,

ถ้าMediaPlayerจะใช้เฉพาะในการเล่นไฟล์เสียงและคุณอยากจะลบข้อผิดพลาดเหล่านี้ใน logcat ที่ร้องรหัสตั้งค่าไปempty SubtitleControllerMediaPlayer

ไม่ควรใช้ในสภาพแวดล้อมการผลิตและอาจมีผลข้างเคียง

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

รหัสนี้พยายามทำสิ่งต่อไปนี้จาก API ที่ซ่อนอยู่

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

12
ฉันเห็นด้วย - ไม่ใช่ข้อผิดพลาดหากไม่มีแทร็กคำบรรยาย ให้ข้อมูลมากที่สุด
คนอยู่ที่ไหนสักแห่ง

4
ตกลงแน่นอน แต่มีวิธีที่ง่ายในการปราบปรามหรือไม่ มัน junking up logcat ของฉัน ...
TJ Ellis

สามารถสร้างตัวกรองฉันคิดว่าถ้ามันน่ารำคาญจริง ๆ หุ่นยนต์คอมไพล์ใหม่หรือการตั้งค่า SubtitleController ว่างเปล่าสำหรับเพลงของคุณ
Hacketo

1
@Hacketo คุณจะตั้งค่า SubtitleController ที่ว่างเปล่าได้อย่างไร? ขออภัยฉันไม่เห็นสิ่งนี้ในเอกสาร
Frank Schwieterman

2
แน่นอนว่าเอกสารไม่ได้ให้ข้อมูลนี้ หากคุณเห็นรหัสที่ใช้ร่วมกันของ MediaPlayer คุณจะเห็นว่ามีตัวตั้งค่าสำหรับ SubtitleController (ดังนั้นจึงควรเป็นไปได้) แต่ดูเหมือนว่าจะไม่สามารถใช้งานได้
Hacketo

8

ในการลบข้อความบน logcat ฉันเพิ่มคำบรรยายเพื่อติดตาม บน windows ให้คลิกขวาที่แทร็ก -> คุณสมบัติ -> รายละเอียด -> แทรกข้อความบนคำบรรยาย เสร็จแล้ว :)


ความคิดสองสามข้อเกี่ยวกับเรื่องนี้: 1) การแก้ไขซอร์สไฟล์ไม่สามารถทำได้ในหลาย ๆ สถานการณ์ 2) คุณไม่ได้อธิบายว่าทำไมการเพิ่มแทร็กคำบรรยายจะแก้ไขข้อผิดพลาดในคอนโทรลเลอร์คำบรรยายใน MediaPlayer
Travis Castillo

ข้อผิดพลาดคือ "ควรมีตัวควบคุมคำบรรยายตั้งไว้แล้ว" ดังนั้นฉันจึงเพิ่มคำบรรยายเพื่อติดตามเพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดนี้
StefanoM5

ตัวควบคุมคำบรรยายหรือคำบรรยาย คุณกำลังบอกว่ามีแทร็กคำบรรยายในวิดีโอที่เครื่องเล่นสื่อสร้างตัวควบคุมโดยอัตโนมัติ?
Travis Castillo

0

นอกจากนี้คุณสามารถตั้งค่าmediaPlayer.reset()และonDestroyตั้งค่าให้ปล่อยเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.