[英]Why does the app crash when accelerometter is added?
我正在尝试创建一个应用程序,当我按下按钮或摇动手机时,该应用程序会播放以前录制的某个音频文件。 这是我的代码。
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]>2.2||event.values[1]>2.2||event.values[2]>2.2){
play();
}
}
}
直到我添加了最后一部分代码(onSensorChanged方法),该应用程序才能正常运行,如果我对其进行注释,则该应用程序可以正常运行。 但是当我用该代码运行代码时,出现以下错误
02-14 17:59:15.425: E/MediaPlayer(12895): Unable to create media player
02-14 17:59:15.426: W/System.err(12895): java.io.IOException: setDataSourceFD failed.: status=0x80000000
02-14 17:59:15.426: W/System.err(12895): at android.media.MediaPlayer._setDataSource(Native Method)
02-14 17:59:15.426: W/System.err(12895): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1035)
02-14 17:59:15.427: W/System.err(12895): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1019)
02-14 17:59:15.427: W/System.err(12895): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:998)
02-14 17:59:15.427: W/System.err(12895): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:954)
02-14 17:59:15.427: W/System.err(12895): at com.example.segundocasopratico.Reproduzir.play(Reproduzir.java:54)
02-14 17:59:15.427: W/System.err(12895): at com.example.segundocasopratico.Reproduzir.onSensorChanged(Reproduzir.java:90)
02-14 17:59:15.427: W/System.err(12895): at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:505)
02-14 17:59:15.427: W/System.err(12895): at android.os.MessageQueue.nativePollOnce(Native Method)
02-14 17:59:15.427: W/System.err(12895): at android.os.MessageQueue.next(MessageQueue.java:138)
02-14 17:59:15.427: W/System.err(12895): at android.os.Looper.loop(Looper.java:150)
02-14 17:59:15.427: W/System.err(12895): at android.app.ActivityThread.main(ActivityThread.java:5327)
02-14 17:59:15.427: W/System.err(12895): at java.lang.reflect.Method.invokeNative(Native Method)
02-14 17:59:15.427: W/System.err(12895): at java.lang.reflect.Method.invoke(Method.java:515)
02-14 17:59:15.428: W/System.err(12895): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
02-14 17:59:15.428: W/System.err(12895): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
02-14 17:59:15.428: W/System.err(12895): at dalvik.system.NativeStart.main(Native Method)
有什么想法吗?
编辑好,我设法解决了这个问题。 我认为问题在于,加速的价值很小。 我将其升至10,并且可以正常工作。 现在的问题是,它只能播放一次...如果我再次摇动它或再次按下按钮,它将无法播放。
我认为这与您的加速度计无关。
0x80000000表示文件已损坏或不完整。
请参阅以下内容: 调用setDataSource(FileDescriptor)方法时发生异常(失败:status = 0x80000000)
这行导致Exception
。
player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
确保您的文件存在,可访问并且未损坏或损坏。 如果您在模拟器上运行,则有时在将文件推送到模拟器时会损坏文件。 如果可以,请在手机上尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.