Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用加速计传感器时无法播放音乐_Android - Fatal编程技术网

Android 使用加速计传感器时无法播放音乐

Android 使用加速计传感器时无法播放音乐,android,Android,我想获得加速度传感器数据,同时播放音乐。当我评论了所有与加速度传感器相关的代码时,音乐可以播放得很好。然而,当我没有评论它时,它不能再播放音乐了,但是logcat中没有错误,我可以很好地获取传感器数据。我想知道为什么会发生这种情况,我非常感谢你的帮助 import android.content.Context; import android.content.Intent; import android.hardware.Sensor; import android.hardware.Senso

我想获得加速度传感器数据,同时播放音乐。当我评论了所有与加速度传感器相关的代码时,音乐可以播放得很好。然而,当我没有评论它时,它不能再播放音乐了,但是logcat中没有错误,我可以很好地获取传感器数据。我想知道为什么会发生这种情况,我非常感谢你的帮助

import android.content.Context;
import android.content.Intent;
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.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;

public class MUSIC extends AppCompatActivity implements SensorEventListener, MediaPlayer.OnPreparedListener {
    private Button startButton;
    private SensorManager mSensormanager;
    private Sensor accelerometer;
    private final float NOISE=(float)2.0;
    private boolean initialization;
    private float mLastX, mLastY, mLastZ;
    private static final String TAG = "sensor";
    final MediaPlayer mediaPlayer=new MediaPlayer();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music);

        mSensormanager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
        accelerometer=mSensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensormanager.registerListener(this,accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
        if(accelerometer!=null){
            return;
        }else{
            Toast.makeText(getApplicationContext(),"Sorry,there are no accelerometers on your device",Toast.LENGTH_LONG).show();
        }

        startButton=(Button)findViewById(R.id.button3);
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Prepareplay(mediaPlayer,Uri.parse("android.resource://"+getPackageName()+ "/raw/test1"));

                onPrepared(mediaPlayer);
            }
        });
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        float x=event.values[0];
        float y=event.values[1];
        float z=event.values[2];
        if(initialization==false){
            mLastX=x;
            mLastY=y;
            mLastZ=z;
            initialization=true;
        }else {
            float deltaX = Math.abs(mLastX - x);
            float deltaY = Math.abs(mLastY - y);
            float deltaZ = Math.abs(mLastZ - z);
            Log.i(TAG,"\n x "+deltaX);
            Log.i(TAG,"\n y "+deltaY);
            Log.i(TAG,"\n z "+deltaZ);

        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    @Override
    protected void onResume(){
        super.onResume();
        mSensormanager.registerListener(this,accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    protected void onPause(){
        super.onPause();
        mSensormanager.unregisterListener(this);
    }

    public void Prepareplay(MediaPlayer player, Uri uri){
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        try {
            player.setDataSource(getApplicationContext(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void onPrepared(MediaPlayer player){
        player.start();
    }
    public void pause(MediaPlayer player){
        player.pause();
    }

}

换句话说:如果有一个加速计,现在从
onCreate返回,跳过剩余的代码,包括设置按钮单击侦听器的代码。

将此代码放在
setContentView()
下面和
mSensormanager=(SensorManager)getSystemService(Context.SENSOR\u SERVICE)上面


技巧,但在我的设备上工作

您可能希望将
registerListener
调用置于空检查之后。试图注册到空传感器将引发异常。@FanFan但您是否理解为什么这会按预期工作,而您的原始代码却不能?@EugenPechanec是的,我想我理解。原因是你以前说过的。这种方法只是让应用程序先运行按钮单击,然后运行空检查。我不确定我所理解的是对还是错。最后我使用了你的建议,效果很好
if (accelerometer != null) {
    return;
}
startButton=(Button)findViewById(R.id.button3);
startButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Prepareplay(mediaPlayer,Uri.parse("android.resource://" + getPackageName() + "/raw/test1"));
        onPrepared(mediaPlayer);
    }
});