при отладке я не могу создать MediaPlayer
Приложение загружается, а затем зависает, когда я нажимаю кнопку для звука. Вот ошибки logcat я не могу найти, что пошло не так.
04-03 16:00:17.273: ERROR/gralloc(61): [unregister] handle 0x4456d0 still locked (state=40000001)
04-03 16:00:22.793: ERROR/PlayerDriver(31): Command PLAYER_PREPARE completed with an error or info PVMFErrResource
04-03 16:00:22.803: ERROR/MediaPlayer(279): error (1, -17)
04-03 16:00:17.273: ERROR/gralloc(61): [unregister] handle 0x4456d0 still locked (state=40000001)
Вот мой код.
package com.yes.hotrod;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class main extends Activity {
MediaPlayer FilmSound=new MediaPlayer();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Button button1 = (Button) findViewById(R.id.button1);
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.animalkingdom);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.animalkingdom);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.animalkingdom);
FilmSound.start();
}
}
});
Button button2 = (Button) findViewById(R.id.button2);
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.bigassstunt);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.bigassstunt);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.bigassstunt);
FilmSound.start();
}
}
});
Button button3 = (Button) findViewById(R.id.button3);
FilmSound = MediaPlayer
.create(getApplicationContext(), R.raw.godsofwar);
button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.godsofwar);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.godsofwar);
FilmSound.start();
}
}
});
Button button4 = (Button) findViewById(R.id.button4);
FilmSound = MediaPlayer.create(getApplicationContext(), R.raw.greentea);
button4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.greentea);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.greentea);
FilmSound.start();
}
}
});
Button button11 = (Button) findViewById(R.id.button11);
FilmSound = MediaPlayer.create(getApplicationContext(), R.raw.havefun);
button11.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.havefun);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.havefun);
FilmSound.start();
}
}
});
Button button6 = (Button) findViewById(R.id.button6);
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.kisswashot);
button6.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.kisswashot);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.kisswashot);
FilmSound.start();
}
}
});
Button button7 = (Button) findViewById(R.id.button7);
FilmSound = MediaPlayer.create(getApplicationContext(), R.raw.ohshit);
button7.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.ohshit);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.ohshit);
FilmSound.start();
}
}
});
Button button8 = (Button) findViewById(R.id.button8);
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.throwingstar);
button8.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.throwingstar);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.throwingstar);
FilmSound.start();
}
}
});
Button button9 = (Button) findViewById(R.id.button9);
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.twolegittwoquit);
button9.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.twolegittwoquit);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.twolegittwoquit);
FilmSound.start();
}
}
});
Button button10 = (Button) findViewById(R.id.button10);
FilmSound = MediaPlayer.create(getApplicationContext(), R.raw.whiskey);
button10.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.whiskey);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.whiskey);
FilmSound.start();
}
}
});
Button button5 = (Button) findViewById(R.id.button5);
FilmSound = MediaPlayer.create(getApplicationContext(), R.raw.demons);
button5.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.demons);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.demons);
FilmSound.start();
}
}
});
}
}
Вот код с подготовкой:
Button button1 = (Button) findViewById(R.id.button1);
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.animalkingdom);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
FilmSound.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (FilmSound.isPlaying()) {
FilmSound.stop();
FilmSound.reset();
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.animalkingdom);
FilmSound.start();
} else {
FilmSound = MediaPlayer.create(getApplicationContext(),
R.raw.animalkingdom);
FilmSound.start();
}
}
});
У меня была аналогичная проблема. Я решил это, просто добавив следующее в ваш файл манифеста:
<uses-permission android:name="android.permission.INTERNET" />
До ICS не требуется разрешение Интернета.
Удалите метод create()
вне onClickListener
. Прямо сейчас, когда вы запустите приложение, оно создаст 10 экземпляров FilmSound, поскольку код находится вне onClickListener, а затем, когда вы нажмете кнопку, он создаст 11-й экземпляр FilmSound. Вероятно, у него заканчивается память под Android 2.2. Вам не нужно готовиться после использования метода create()
, он будет подготовлен после создания в первый раз.
Кроме того, я уверен, что isPlaying()
может генерировать исключения.
if (FilmSound != null) {
try {
if (FilmSound.isPlaying()) {
FilmSound.release();
FilmSound = null;
}
} catch(Exception e) {FilmSound= new MediaPlayer(); }};
if (FilmSound == null) {
FilmSound= new MediaPlayer();
}
FilmSound = MediaPlayer.create(this, clip);
FilmSound.start();
FilmSound.setOnCompletionListener(this);
Проверьте этот вопрос: Android - Невозможно воспроизвести видео (mp4/mov/3gp/etc.)?
Вы пытались воспроизвести файл в другом формате? Возможно, для вашего звука требуется какой-то кодек, который Android не имеет, поэтому команда prepare() не работает.
После создания MediaPlayer
попробуйте подготовить его:
FilmSound.prepare();