【问题标题】:Why does the app crash when accelerometter is added?为什么添加加速度计时应用程序崩溃?
【发布时间】:2015-02-14 18:06:10
【问题描述】:

我正在尝试创建一个应用程序,当我按下按钮或摇晃手机时,它可以播放之前录制的某个音频文件。这是我的代码。

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 并且它正在工作。现在的问题是它只播放一次......如果我再次摇动它或第二次按下按钮它就不会播放。

【问题讨论】:

  • java.io.IOException: setDataSourceFD failed.: status=0x80000000 它找不到您的数据源或无法播放文件本身。

标签: android android-mediaplayer accelerometer


【解决方案1】:

我认为这与您的加速度计无关。

0x80000000 表示文件已损坏或不完整。

看到这个:Exception when calling setDataSource(FileDescriptor) method (failed.: status=0x80000000)

【讨论】:

  • 该文件是在先前的活动中生成的,该活动记录声音并启动此活动。请查看我的编辑
【解决方案2】:

此行导致Exception

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

确保您的文件存在、可访问且未损坏或损坏。如果您在模拟器上运行,有时将文件推送到模拟器时会损坏文件。如果可以的话,在你的手机上试试。

【讨论】:

  • 我在手机上试过了。我认为问题在于加速度的值太小。我把它提高到 10 并且它正在工作。现在的问题是它只播放一次......如果我再次摇动它或第二次按下按钮它就不会播放。
  • 很高兴它成功了。你应该发布一个新问题来解决你的这个新问题@Rasmnev
  • 是的,你需要开一个新的问题,因为原来的问题已经解决了,又出现了一个新的问题。然后更容易为这个新问题提供更多细节和更好的清晰度。祝你好运,编码愉快! @Rasmnev
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多