简体   繁体   English

为什么添加加速器后应用程序崩溃?

[英]Why does the app crash when accelerometter is added?

I'm trying to create an app that play a certain audio file, that was previously recorded, when I press a button or shake my phone. 我正在尝试创建一个应用程序,当我按下按钮或摇动手机时,该应用程序会播放以前录制的某个音频文件。 Here is my code. 这是我的代码。

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();

    }
}

} }

The app was working fine untill I added the last bit of code (the onSensorChanged method) and if I comment it the app runs fine. 直到我添加了最后一部分代码(onSensorChanged方法),该应用程序才能正常运行,如果我对其进行注释,则该应用程序可以正常运行。 But when I run the code with that code I get the following error 但是当我用该代码运行代码时,出现以下错误

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)

any thoughts on a reason for this? 有什么想法吗?

EDIT Ok I managed to solve this. 编辑好,我设法解决了这个问题。 The problem was, I think, that the value for the acceleration was to small. 我认为问题在于,加速的价值很小。 I upped it to 10 and it's working. 我将其升至10,并且可以正常工作。 The problem now is that it only plays once... if I shake it again or press the button a second time it won't play. 现在的问题是,它只能播放一次...如果我再次摇动它或再次按下按钮,它将无法播放。

I do not believe this has to do with your accelerometer. 我认为这与您的加速度计无关。

0x80000000 means the file is corrupted, or incomplete. 0x80000000表示文件已损坏或不完整。

See this: Exception when calling setDataSource(FileDescriptor) method (failed.: status=0x80000000) 请参阅以下内容: 调用setDataSource(FileDescriptor)方法时发生异常(失败:status = 0x80000000)

This line is causing the Exception . 这行导致Exception

player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");

Make sure that your file is existing, is accessable and is not corrupted or damaged. 确保您的文件存在,可访问并且未损坏或损坏。 If you are running on the emulator, sometimes when pushing files to the emulator it corrupts the files. 如果您在模拟器上运行,则有时在将文件推送到模拟器时会损坏文件。 Try it on your phone, if you can. 如果可以,请在手机上尝试。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM