Android mediaPlayer 只播放文件一次
Android mediaPlayer only plays file once
我正在尝试创建一个应用程序,当我按下按钮或摇动 phone 时,它会播放之前录制的特定音频文件。这是我的代码。
public class Reproduzir extends Activity implements SensorEventListener{
MediaPlayer player = new MediaPlayer();
SensorManager sensor;
@Override
protected void onCreate(Bundle savedInstanceState ){
super.onCreate(savedInstanceState);
sensor= (SensorManager) getSystemService(SENSOR_SERVICE);
setContentView(R.layout.reproduzir);
Button reproduzir = (Button) findViewById(R.id.reproduzir);
reproduzir.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
play();
}
});
Button fechar= (Button) findViewById(R.id.fechar);
fechar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (player.isPlaying()) {
player.stop();
player.release();
}
finish();
}
});
}
public void play(){
try {
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
player.prepare();
player.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onStart(){
super.onStart();
sensor.registerListener(this,sensor.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if(event.values[0]>10.2
||event.values[1]>10.2
||event.values[2]>10.2){
play();
}
}
}
我的问题是,当我 运行 它时,我只能播放一次。如果我再次按下按钮或再次摇动它,它什么也不做。有人可以帮忙吗?
您只能设置一次数据源。
在你的代码中,每次用户按下你这样做的按钮时:
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
哪里错了。
你只需要设置数据和准备一次,玩多少次就玩多少次。
像这样:
把这个放在你的 onCreate:
try {
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
player.prepare();
player.start();
在 onClick(View v) 中,只需:
player.play();
尝试使用:
mediaPlayer.reset()
之后:
mediaPlayer.stop()
而不是释放。
长话短说 - 您必须使用:
setLooping(true)
有关媒体播放器的更多信息,请查看下面的 post。牢记状态图
http://developer.android.com/reference/android/media/MediaPlayer.html
简单的解决方法是在 play()
方法 中添加 player.reset()
,然后 调用 player.setDataSource(...)
.
您只能调用 setDataSource(...)
一次而不重置播放器。然而,在任何状态下调用 reset()
都是合法的(即使播放器尚未初始化)。
换句话说,即使这是您第一次调用 play()
,也可以在 play()
方法中使用以下代码...
try {
player.reset();
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
player.prepare();
player.start();
}
// Your catch blocks here
我正在尝试创建一个应用程序,当我按下按钮或摇动 phone 时,它会播放之前录制的特定音频文件。这是我的代码。
public class Reproduzir extends Activity implements SensorEventListener{
MediaPlayer player = new MediaPlayer();
SensorManager sensor;
@Override
protected void onCreate(Bundle savedInstanceState ){
super.onCreate(savedInstanceState);
sensor= (SensorManager) getSystemService(SENSOR_SERVICE);
setContentView(R.layout.reproduzir);
Button reproduzir = (Button) findViewById(R.id.reproduzir);
reproduzir.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
play();
}
});
Button fechar= (Button) findViewById(R.id.fechar);
fechar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (player.isPlaying()) {
player.stop();
player.release();
}
finish();
}
});
}
public void play(){
try {
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
player.prepare();
player.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onStart(){
super.onStart();
sensor.registerListener(this,sensor.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if(event.values[0]>10.2
||event.values[1]>10.2
||event.values[2]>10.2){
play();
}
}
}
我的问题是,当我 运行 它时,我只能播放一次。如果我再次按下按钮或再次摇动它,它什么也不做。有人可以帮忙吗?
您只能设置一次数据源。 在你的代码中,每次用户按下你这样做的按钮时:
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
哪里错了。
你只需要设置数据和准备一次,玩多少次就玩多少次。
像这样: 把这个放在你的 onCreate:
try {
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
player.prepare();
player.start();
在 onClick(View v) 中,只需:
player.play();
尝试使用:
mediaPlayer.reset()
之后:
mediaPlayer.stop()
而不是释放。
长话短说 - 您必须使用:
setLooping(true)
有关媒体播放器的更多信息,请查看下面的 post。牢记状态图
http://developer.android.com/reference/android/media/MediaPlayer.html
简单的解决方法是在 play()
方法 中添加 player.reset()
,然后 调用 player.setDataSource(...)
.
您只能调用 setDataSource(...)
一次而不重置播放器。然而,在任何状态下调用 reset()
都是合法的(即使播放器尚未初始化)。
换句话说,即使这是您第一次调用 play()
,也可以在 play()
方法中使用以下代码...
try {
player.reset();
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
player.prepare();
player.start();
}
// Your catch blocks here