Saat ini saya mencoba merancang aplikasi sederhana yang mengalirkan stasiun radio internet. Saya memiliki URL untuk stasiun dan sedang menyiapkan Pemutar Media seperti
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 tidak macet ketika diemulasi, tetapi tidak ada yang diputar dan saya mendapatkan kesalahan berikut:
start called in state 0
dan tepat di bawahnya
Error (-38,0)
Adakah yang tahu apa artinya ini?
Saya telah membaca sedikit tentang kesalahan status ini, tetapi tidak dapat menemukan apa pun yang berlaku untuk proyek saya.
android
android-mediaplayer
SmashCode
sumber
sumber
Jawaban:
Anda perlu menelepon
mediaPlayer.start()
dalamonPrepared
metode dengan menggunakan pendengar. Anda mendapatkan kesalahan ini karena Anda meneleponmediaPlayer.start()
sebelum mencapai keadaan siap.Inilah cara Anda melakukannya:
sumber
Sepertinya Kesalahan -38 berarti pengecualian negara (seperti yang ditunjukkan oleh pesan kesalahan). Misalnya jika Anda menelepon
start()
, sebelum lagu siap, atau saat Anda meneleponpause()
, meskipun lagu tidak diputar sama sekali.Untuk memperbaiki masalah ini, periksa status mediaPlayer sebelum memanggil metode. Sebagai contoh:
Selain itu, MediaPlayer mengirimkan pesan-peristiwa. Meskipun Anda tidak membutuhkan acara-yang disiapkan (meskipun sebaiknya tidak memulai pemutaran sebelum acara ini dipicu) Anda harus menyetel pemroses panggilan balik. Hal ini juga berlaku untuk
OnErrorListener
,OnCompletionListener
,OnPreparedListener
danOnSeekCompletedListener
(jika Anda memanggil mencari metode).Pendengar dapat dilampirkan hanya dengan
sumber
Saya mendapat kesalahan ini ketika saya mencoba untuk mendapatkan posisi saat ini (MediaPlayer.getCurrentPosition ()) dari pemutar media ketika tidak dalam keadaan yang disiapkan. Saya menyiasatinya dengan Melacak statusnya dan hanya memanggil metode getCurrentPosition () setelah onPreparedListener dipanggil.
sumber
Ini adalah kode saya, diuji dan berfungsi dengan baik:
sumber
saya menguji kode di bawah ini. bekerja dengan baik
sumber
SetAudioStreamType(..)
digunakanSetAudioAttributes(...)
Saya mengalami masalah yang sama beberapa hari yang lalu. Audio MediaPlayer saya berfungsi dengan baik pada perangkat dengan daya pemrosesan tinggi, tetapi untuk perangkat yang lambat, pemutar media tidak dapat diputar beberapa waktu dan dari LogCat banyak keluhan tentang panggilan dalam kondisi yang salah. Jadi saya memutuskan itu dengan memanggil menempatkan panggilan untuk mulai () , pause () , ... di onPrepared () metode OnPreparedListener () seperti di bawah ini:
Coba juga untuk melepaskan pemutar media yang tidak Anda perlukan lagi. Misalnya, jika Anda tidak ingin memutar audio atau video di latar belakang, Anda harus memanggil mediaPlayer.release () di onPause () .
sumber
Beberapa file times dikodekan dengan cara yang tidak dapat didekode oleh Android. Bahkan beberapa file mp4 tidak bisa diputar. Silakan coba format file yang berbeda (.3gp dimainkan hampir sepanjang waktu) dan lihat ..
sumber
Di atas gambar, Anda bisa mendapatkan cara yang benar.
sumber
Anda mendapatkan pesan ini di log, karena Anda melakukan sesuatu yang tidak diizinkan dalam status saat ini dari instance MediaPlayer Anda.
Oleh karena itu, Anda harus selalu mendaftarkan penangan kesalahan untuk menangkap hal-hal itu (seperti yang disarankan @tidbeck).
Pada awalnya, saya menyarankan Anda untuk melihat dokumentasi untuk
MediaPlayer
kelas dan mendapatkan pemahaman tentang apa artinya dengan negara bagian. Lihat: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagramKesalahan Anda di sini bisa jadi salah satu yang umum, yang lain menulis di sini, tetapi secara umum, saya akan melihat dokumentasi tentang metode apa yang valid untuk dipanggil dalam status apa: http://developer.android.com/ referensi / android / media / MediaPlayer.html # Valid_and_Invalid_States
Dalam contoh saya, itu adalah metode
mediaPlayer.CurrentPosition
, yang saya panggil ketika pemutar media dalam keadaan, di mana ia tidak diizinkan untuk memanggil properti ini.sumber
Saya memecahkan kesalahan (-19,0) dan (-38,0), dengan membuat objek baru MediaPlayer setiap kali sebelum bermain dan melepaskannya setelah itu.
Sebelum :
}
Setelah:
}
sumber
sumber
Itu sangat membuat frustrasi. Jadi, saya mendapatkan solusi yang cocok untuk saya.
sumber
Bagi saya ini berhasil
sumber
Saya juga mendapatkan kesalahan ini saya mencoba dengan onPreparedListener tetapi masih mendapatkan kesalahan ini. Akhirnya saya mendapat solusi bahwa kesalahan adalah kesalahan saya karena saya lupa izin internet di Android Manifest xml. :)
Saya menggunakan pengkodean sampel untuk mediaplayer. Saya menggunakan metode StreamService.java
onCreate
sumber
Saya menemui masalah yang sama sebelumnya, teman di lantai pertama benar, Anda menelepon
start()
pada waktu yang salah, Anda harus menetapkan pendengar untuk preparasi () atauprepareSync()
dengan metode inimediaPlayer.setOnPreparedListener(this)
; sebelum bersiap, dalam panggilan panggilan balik inistart()
. Ini mungkin menyelesaikan masalah Anda. Saya sudah mencoba.sumber
Saya baru dalam pemrograman android dan saya memiliki kesalahan yang sama seperti ini. jadi saya cukup mendefinisikan ulang mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI). Ini mungkin bukan cara yang benar untuk melakukannya tetapi berhasil untuk saya:
sumber
sumber