私はアンドロイドで音楽を再生することに関するいくつかの例を読んだことがあり、非同期スレッドで開発しました。すべて問題ないように見えますが、アクティビティに入ったときにサウンドが再生されません。ただし、簡単な方法(コメント間)で行うと、サウンドが再生されます。
package net.sgoliver.android.listviewopt;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources.NotFoundException;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
public class Detector extends Activity implements SensorEventListener, OnPreparedListener, OnCompletionListener {
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private MediaPlayer mediaPlayer;
TextView title,tv,tv1,tv2, txtNombre;
LinearLayout layout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.detector);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//get layout
layout = (LinearLayout)findViewById(R.id.linear);
//get textviews
title=(TextView)findViewById(R.id.name);
tv=(TextView)findViewById(R.id.xval);
tv1=(TextView)findViewById(R.id.yval);
tv2=(TextView)findViewById(R.id.zval);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnCompletionListener(this);
try {
mediaPlayer.setDataSource(getResources().getResourceName(R.raw.song));
} 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 (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mediaPlayer.setLooping(true);
mediaPlayer.prepareAsync();
/** This way it works perfect
MediaPlayer mediaPlayer;
mediaPlayer = MediaPlayer.create(this,R.raw.song);
mediaPlayer.setLooping(true);
mediaPlayer.setVolume(100,100);
mediaPlayer.start(); **/
//Localizar los controles
txtNombre = (TextView)findViewById(R.id.nombre);
//Recuperamos la información pasada en el intent
Bundle bundle = this.getIntent().getExtras();
//Construimos el mensaje a mostrar
txtNombre.setText("" + bundle.getString("NOMBRE"));
txtNombre.setVisibility(View.GONE);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy)
{
// Do something here if sensor accuracy changes.
}
@Override
public final void onSensorChanged(SensorEvent event)
{
// Many sensors return 3 values, one for each axis.
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
//display values using TextView
title.setText(R.string.app_name);
tv.setText("X axis" +"\t\t"+x);
tv1.setText("Y axis" + "\t\t" +y);
tv2.setText("Z axis" +"\t\t" +z);
if(y<3.0){
txtNombre.setVisibility(View.VISIBLE);
}else{
txtNombre.setVisibility(View.INVISIBLE);
}
}
@Override
protected void onResume()
{
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();//Cuando acaba de cargar inicia la reproducción
}
@Override
public void onCompletion(MediaPlayer mp) {
mp = null;//Para que cuando pulses de nuevo el botón play, no cree otro reproductor, eliminamos el actual
}
}
前もって感謝します。