सबटाइटल कंट्रोलर होना चाहिए जो पहले से ही सेट मेदियापेलर एरर एंड्रॉयड


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

डीडीएमएस लॉग

सबटाइटल कंट्रोलर पहले से सेट होना चाहिए

जानकारी / चेतावनी (2, 0)

जब मैंने Google पर खोज की, तो इससे संबंधित एक भी विषय नहीं था। मैं इसे कैसे हटा या अक्षम कर सकता हूं?

जवाबों:


187

एक डेवलपर ने हाल ही में VideoView में उपशीर्षक समर्थन जोड़ा

जब MediaPlayerकोई संगीत (या अन्य स्रोत) बजाना शुरू करता है, तो यह जांचता है कि क्या सबटाइटलकंट्रोलर है और यह संदेश सेट नहीं होने पर दिखाता है। यह परवाह नहीं करता है कि अगर आप जिस स्रोत को चलाना चाहते हैं वह संगीत या वीडियो है। निश्चित नहीं कि उसने ऐसा क्यों किया।

संक्षिप्त उत्तर: इस "अपवाद" की परवाह न करें।


संपादित करें:

लॉलीपॉप में अभी भी मौजूद है ,

यदि MediaPlayerकेवल ऑडियो फ़ाइलों को चलाने के लिए उपयोग किया जाता है और आप वास्तव में logcat में इन त्रुटियों को दूर करना चाहते हैं, तो कोड bellow सेट empty SubtitleControllerकरने के लिए MediaPlayer

इसका उपयोग उत्पादन वातावरण में नहीं किया जाना चाहिए और इसके कुछ दुष्प्रभाव हो सकते हैं।

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

यह कोड छिपे हुए एपीआई से निम्नलिखित करने की कोशिश कर रहा है

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

12
मैं सहमत हूँ - यदि उपशीर्षक ट्रैक मौजूद नहीं है तो यह कोई त्रुटि नहीं है। अधिकांश पर सूचनात्मक।
किसी ने

4
ठीक है, यकीन है, लेकिन क्या इसे दबाने का एक आसान तरीका है? यह मेरा logcat आउटपुट जोड़ रहा है ...
TJ Ellis

एक फिल्टर बना सकते हैं मुझे लगता है कि अगर यह वास्तव में कष्टप्रद है, तो एंड्रॉइड को पुन: स्थापित करें, या अपने गीत के लिए एक खाली सबटाइटलकंट्रोलर सेट करें।
हैकिटो

1
@Hacketo आप एक खाली सबटाइटलकंट्रोलर कैसे सेट करते हैं? क्षमा करें, मुझे यह डॉक्स में दिखाई नहीं दे रहा है।
फ्रैंक श्वेतेरमैन

2
बेशक प्रलेखन यह जानकारी प्रदान नहीं कर रहा है। यदि आपने MediaPlayer का साझा कोड देखा है, तो आप देख सकते हैं कि सबटाइटलकंट्रोलर के लिए एक सेटर है (इसलिए यह संभव होना चाहिए), लेकिन दुर्भाग्य से अनुपलब्ध प्रतीत होता है।
हैकेटो सेप

8

लॉगकैट पर संदेश को हटाने के लिए, मैं ट्रैक करने के लिए एक उपशीर्षक जोड़ता हूं। खिड़कियों पर, ट्रैक पर राइट क्लिक करें -> संपत्ति -> विवरण -> उपशीर्षक पर एक पाठ डालें। किया हुआ :)


इस पर युगल विचार: 1) स्रोत फ़ाइल को संशोधित करना बहुत सारी स्थितियों में वास्तव में संभव नहीं है। 2) आपने यह नहीं बताया कि सबटाइटल ट्रैक को जोड़ने से MediaPlayer में एक उपशीर्षक नियंत्रक पर एक त्रुटि ठीक हो जाएगी।
ट्रैविस कैस्टिलो

त्रुटि है "सबटाइटल कंट्रोलर पहले से सेट होना चाहिए", इसलिए मैं एक उपशीर्षक जोड़कर ट्रैक करता हूं ताकि इस त्रुटि संदेश से बचा जा सके।
स्टेफानो 5

उपशीर्षक या उपशीर्षक नियंत्रक। क्या आप कह रहे हैं कि वीडियो प्लेयर पर सबटाइटल ट्रैक होने से मीडिया प्लेयर अपने आप एक कंट्रोलर जेनरेट करता है?
ट्रैविस कास्टिलो

0

इसके अलावा, आप केवल सेट कर सकते हैं mediaPlayer.reset()और onDestroyइसे रिलीज़ करने के लिए सेट कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.