0 durumunda Media Player çağrıldı, hata (-38,0)


105

Şu anda bir internet radyo istasyonunu yayınlayan basit bir uygulama tasarlamaya çalışıyorum. İstasyonun URL'sine sahibim ve Media Player'ı şu şekilde kuruyorum

    MediaPlayer mediaPlayer = new MediaPlayer();
    try {
        mediaPlayer.setDataSource(URL);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.start();

Program taklit edildiğinde çökmüyor, ancak hiçbir şey oynatılmıyor ve aşağıdaki hatayı alıyorum:

start called in state 0

ve hemen altında

Error (-38,0)

Bunun ne anlama geldiğini bilen var mı?

Bu durum hataları hakkında biraz okudum, ancak projem için geçerli hiçbir şey bulamadım.




@SmashCode, cevabım tamamen yararsız olduğu için lütfen başka bir cevabı işaretleyin.
tidbeck

Yanıtlar:


120

Sen buna gerek mediaPlayer.start()de onPreparedbir dinleyici kullanarak yöntemle. Bu hatayı mediaPlayer.start(), hazır duruma gelmeden önce aradığınız için alıyorsunuz .

İşte bunu nasıl yapabileceğiniz:

mp.setDataSource(url); 
mp.setOnPreparedListener(this);
mp.prepareAsync();

public void onPrepared(MediaPlayer player) {
    player.start();
}

Ya hemen başlamasını istemiyorsak? Oynatıcımı başlatıp bir dakika kadar beklesem bile, onu ilk oynamaya çalıştığımda, onPrepared
Elliptica

1
Daha önce hazırlarsınız ve hazırladığını hatırlarsınız. Paralel olarak, çalıştırmak isteyip istemediğinizi hatırlamaya çalışırsınız. Hem hazır olduğunda hem de çalıştırmak istediğinizde, başlatırsınız.
Victor Paléologue

33

Görünüşe göre Hata -38 bir durum istisnası anlamına geliyor (hata mesajının gösterdiği gibi). Örneğin start(), şarkı hazır olmadan önce veya aradığınızda pause(), şarkı hiç çalmasa bile ararsanız .

Bu sorunu gidermek için, yöntemleri çağırmadan önce mediaPlayer'ın durumunu kontrol edin. Örneğin:

if(mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
}

Ek olarak, MediaPlayer olay mesajları gönderiyor. Hazırlanan olaya ihtiyacınız olmasa bile (bu olay tetiklenmeden önce kayıttan yürütmeyi başlatmamak iyi bir fikir olsa da) bir geri arama dinleyicisi ayarlamalısınız. Bu aynı zamanda için de geçerlidir OnErrorListener, OnCompletionListener, OnPreparedListenerve OnSeekCompletedListener(eğer ararsanız yöntemini aramak).

Dinleyiciler kolayca eklenebilir

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // Do something. For example: playButton.setEnabled(true);
    }
});

oyuncu
oynamama

geçersiz bir durumda mediaPlayer.isPlaying () 'i çağırmak medya oynatıcıyı bir hata durumuna gönderecektir. Durumları korumak için açık bir numaralandırmayı sürdürmek daha iyidir.
Madeyedexter

14

Bu hatayı, medya yürütücünün mevcut konumunu (MediaPlayer.getCurrentPosition ()) belirtilen hazırlanmadığı halde almaya çalışırken aldım. Durumunu takip ederek ve onPreparedListener çağrıldıktan sonra yalnızca getCurrentPosition () yöntemini çağırarak bunu aştım.


Bu nedenle olduğunu nasıl anladın?
AdamMc331

9

Bu benim kodum, test edildi ve iyi çalışıyor:

package com.example.com.mak.mediaplayer;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final MediaPlayer mpp = MediaPlayer.create(this, R.raw.red); //mp3 file in res/raw folder

    Button btnplay = (Button) findViewById(R.id.btnplay); //Play
    btnplay.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View vone) {
        mpp.start();
      }
    });

    Button btnpause = (Button) findViewById(R.id.btnpause); //Pause
    btnpause.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View vtwo) {
        if (mpp.isPlaying()) {
          mpp.pause();
          mpp.seekTo(0);
        }
      }
    });
  }
}

4

Aşağıdaki kodu test ettim. iyi çalışıyor

public class test extends Activity implements OnErrorListener, OnPreparedListener {

private MediaPlayer player;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    player = new MediaPlayer();
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        player.setDataSource("http://www.hubharp.com/web_sound/BachGavotte.mp3");
        player.setOnErrorListener(this);
        player.setOnPreparedListener(this);
        player.prepareAsync();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }       
}
@Override
public void onDestroy() {
    super.onDestroy();
    player.release();
    player = null;
}
@Override
public void onPrepared(MediaPlayer play) {
    play.start();
}
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
    return false;
}
}

SetAudioStreamType(..)Kullanım ve güncelleme içinSetAudioAttributes(...)
Pierre

4

Birkaç gün önce aynı sorunla karşılaştım. Sesli MediaPlayer'ım yüksek işlem gücüne sahip cihazlarda iyi çalışıyor, ancak yavaş cihazlar için medya oynatıcı bir süre oynatmadı ve LogCat'tan birçok kişi yanlış durumda çağrıldığından şikayet etti. Bu yüzden OnPreparedListener () yönteminin start () , pause () , ... in onPrepared () yöntemine çağrıyı aşağıdaki gibi koyarak çağırarak çözdüm :

mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    ........
                    mediaPlayer.start();
                    ....
                    songControlBtn.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (mediaPlayer.isPlaying()) {
                                mediaPlayer.pause();

                            } else {
                                mediaPlayer.start();

                            }
                        }
                    });

                    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            ............

                        }
                    });
                }
            });

Ayrıca, artık ihtiyacınız olmayan herhangi bir medya oynatıcıyı serbest bırakmayı deneyin. Örneğin, sesi veya videoyu arka planda yürütmek istemiyorsanız onPause () içinde mediaPlayer.release () öğesini çağırmalısınız .


3

Bazı zamanlar dosyası, Android'in kodunu çözemeyeceği şekilde kodlanır. Bazı mp4 dosyaları bile oynatılamaz. Lütfen farklı bir dosya biçimi deneyin (.3gp çoğu zaman oynatılır) ve bakın ..


46
Bir internet radyo istasyonundan dosya formatını değiştirmesini isteyemem.
SmashCode

"Bu videoyu oynatamıyor" açılır penceresini görüyor musunuz? Bununla nasıl başa çıkıyorsun? Hatayı yakaladım ancak bu modeli ne olursa olsun alıyorum ve genel bir API'den geldiği için medyanın kaynağı üzerinde hiçbir kontrolüm yok. "Bu videoyu oynatamazsın" modelini nasıl engelleyeceğini bilen biri varsa minnettar olurum.
Krafty

Bir hata dinleyici ayarlamayı denediniz mi? MediaPlayer mp = new MediaPlayer () {@Override public void setOnErrorListener (android.media.MediaPlayer.OnErrorListener dinleyici) {// İşleri burada yapın ..}}; mp.setDataSource (..
Rukmal Dias


0

MediaPlayer örneğinizin mevcut durumunda izin verilmeyen bir şey yaptığınız için bu mesajı günlüklerde alırsınız.

Bu nedenle, bunları yakalamak için her zaman bir hata işleyici kaydetmelisiniz (@tidbeck'in önerdiği gibi).

İlk olarak, MediaPlayersınıfın belgelerine bir göz atmanızı ve bunun devletlerle ne anlama geldiğini anlamanızı tavsiye ederim . Bkz: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

Buradaki hatanız yaygın olanlardan biri olabilir, diğerleri burada yazdı, ancak genel olarak, hangi durumda aramak için hangi yöntemlerin geçerli olduğuna dair belgelere bir göz atardım : http://developer.android.com/ reference / android / media / MediaPlayer.html # Valid_and_Invalid_States

mediaPlayer.CurrentPositionÖrneğimde, medya oynatıcı bu özelliği çağırmasına izin verilmeyen bir durumdayken aradığım yöntemdi .


0

Her seferinde oynamadan önce yeni bir MediaPlayer nesnesi oluşturarak ve daha sonra yayınlayarak hem hataları (-19,0) hem de (-38,0) çözdüm.

Önce :

void play(int resourceID) {
if (getActivity() != null) {

     //Using the same object - Problem persists
    player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

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

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

}

}

Sonra:

void play(int resourceID) {

if (getActivity() != null) {

    //Problem Solved
    //Creating new MediaPlayer object every time and releasing it after completion
    final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

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

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

}

}


0
  if(length>0)
        {
            mediaPlayer = new MediaPlayer();
            Log.d("length",""+length);
            try {
                mediaPlayer.setDataSource(getApplication(),Uri.parse(uri));
            } catch(IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mediaPlayer.seekTo(length);
                    mediaPlayer.start();

                }
            });
            mediaPlayer.prepareAsync();

0

Çok hüsrana uğramıştı. Bu yüzden benim için çalışan bir çözüm buldum.

try {
                        if (mediaPlayer != null) {
                            mediaPlayer.release();
                            mediaPlayer = null;

                        }
                        mediaPlayer = new MediaPlayer();
                        mediaPlayer.setDataSource(file.getAbsolutePath());
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mediaPlayer) {
                                mediaPlayer.start();
                                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                                    @Override
                                    public void onCompletion(MediaPlayer mediaPlayer) {
                                        mediaPlayer.stop();
                                        mediaPlayer.release();
                                        mediaPlayer = null;
                                    }
                                });
                            }
                        });
                        mediaPlayer.prepare();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }


0

Ayrıca onPreparedListener ile denediğim bu hatayı aldım ama yine de bu hatayı alıyorum. Sonunda Android Manifest xml'de internet iznini unuttuğum için hatanın benim hatam olduğu çözüme ulaştım. :)

<uses-permission android:name="android.permission.INTERNET" />

Mediaplayer için örnek kodlama kullandım. StreamService.java
onCreateyönteminde kullandım

String url = "http://s17.myradiostream.com:11474/";
mediaPlayer = new MediaPlayer();            
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();

-1

Aynı problemle daha önce karşılaştım, birinci kattaki arkadaş haklıydı, start()yanlış zamanda aradınız, hazırla () için bir dinleyici belirlemelisiniz veya prepareSync()bu yöntemle mediaPlayer.setOnPreparedListener(this); Hazırlanmadan önce, bu geri arama çağrısında start(). Sorununuzu çözebilir. Ben zaten denedim.


Daha spesifik olabilir misin?
Karthik AMR

Üzgünüm, İngilizce benim ilk dilim değil ve bunda da iyi değilim ... ama sadece aynı soruları olan başkalarına yardım etmek istiyorum, hepsi bu.
peerless2012

-1

Android programlamada yeniyim ve bununla aynı hatayı aldım. bu yüzden mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI) 'yi yeniden tanımladım. Bunu yapmanın doğru yolu olmayabilir ama benim için para cezası aldı:

try {
  mp = MediaPlayer.create(getApplicationContext(), Settings.System.DEFAULT_RINGTONE_URI);
} catch (Exception e) {
  e.printStackTrace();
}

mp.start();

-2
mp = new MediaPlayer();
AssetFileDescriptor afd = mContext.getAssets().openFd(fileName);
mp.reset();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  public void onPrepared(MediaPlayer mp) {
    mp.start();
  }
});

mp.prepareAsync();
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.