Altyazı denetleyicisinin zaten ayarlanmış olması gerekir Mediaplayer hatası Android


137

Bir medya yürüttüğümde DDMS'de bir uyarı görünüyor Should have subtitle controller already set

KODUM:

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

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

DDMS GÜNLÜĞÜ

Altyazı denetleyicisinin önceden ayarlanmış olması gerekir

bilgi / uyarı (2, 0)

Google'da arama yaptığımda bununla ilgili tek bir konu bile değil. Bundan nasıl kurtulabilir veya devre dışı bırakabilirim?

Yanıtlar:


187

Bir geliştirici kısa süre önce VideoView'e altyazı desteği ekledi .

Bir MediaPlayermüzik (veya başka bir kaynak) çalmaya başladığında, bir SubtitleController olup olmadığını kontrol eder ve ayarlanmadıysa bu mesajı gösterir. Oynatmak istediğiniz kaynağın bir müzik veya video olup olmadığı umurumda değil. Bunu neden yaptığından emin değilim.

Kısa cevap: Bu "İstisna" yı önemsemeyin.


Düzenle :

Hala Lolipop'ta mevcut ,

Eğer MediaPlayersadece ses dosyalarını oynatmak için kullanılan ve gerçekten LogCat bu hataları kaldırmak istediğiniz edilir, kod feryat bir set empty SubtitleControlleriçinMediaPlayer .

Üretim ortamında kullanılmamalıdır ve bazı yan etkileri olabilir.

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

Bu kod gizli API'dan aşağıdakileri yapmaya çalışıyor

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

12
Kabul ediyorum - bir altyazı parçası yoksa bir hata değildir. En fazla bilgilendirici.
Bir Yerde

4
tamam, tabii, ama onu bastırmanın kolay bir yolu var mı? benim logcat çıktı junking ...
TJ Ellis

Gerçekten can sıkıcı, android yeniden derlemek veya şarkınız için boş bir SubtitleController ayarını düşünüyorum bir filtre yapabilirsiniz.
Hacketo

1
@Hacketo nasıl boş bir SubtitleController kurarsınız? Üzgünüm bunu dokümanlarda görmüyorum.
Frank Schwieterman

2
Tabii ki belgeler bu bilgileri sağlamıyor. MediaPlayer'ın paylaştığı kodu gördüyseniz SubtitleController için bir ayarlayıcı olduğunu görebilirsiniz (bu yüzden mümkün olmalıdır), ancak ne yazık ki kullanılamıyor gibi görünüyor.
Hacketo

8

Logcat'teki mesajı kaldırmak için, takip etmek için bir altyazı ekliyorum. Pencerelerde, parçaya sağ tıklayın -> Özellik -> Ayrıntılar -> altyazıya bir metin ekleyin. Tamamlandı :)


Bu konuda birkaç düşünce: 1) birçok durumda kaynak dosyayı değiştirmek gerçekten mümkün değildir. 2) bir altyazı parçası eklemenin neden MediaPlayer'daki bir altyazı denetleyicisindeki bir hatayı düzelteceğini açıklamamıştınız.
Travis Castillo

Hata "Altyazı denetleyicisi önceden ayarlanmış olmalıdır", bu yüzden bu hata iletisini önlemek için izlemek için bir altyazı eklemek.
StefanoM5

altyazı veya altyazı denetleyicisi. videonun altyazı parçasını alarak medya yürütücünün otomatik olarak bir denetleyici oluşturduğunu mu söylüyorsunuz?
Travis Castillo

0

Ayrıca yalnızca serbest bırakılacak şekilde ayarlayabilir mediaPlayer.reset()ve onDestroyayarlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.