2017-05-09 44 views
0

我想获取加速计传感器数据并同时播放音乐。当我评论所有与加速度传感器相关的代码时,音乐可以发挥得很好。但是,当我没有对它发表评论时,它不能播放音乐,但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(); 
    } 

} 
+0

您可能希望把'registerListener'调用空检查后。尝试注册到空传感器将引发异常。 –

回答

0
if (accelerometer != null) { 
    return; 
} 

换句话说:如果有一个加速度计,从onCreate现在返回并跳过剩下的代码包括,设定按钮,点击收听。

+0

是的,非常感谢,我会尽力做到这一点。 –

0

把下面setContentView()以上mSensormanager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

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

伎俩,但工作这个代码我的设备上

+0

哇,这是有效的,非常感谢 –

+0

@FanFan但你明白为什么*这个按预期工作,你的原始代码没有? –

+0

@EugenPechanec是的,我想我明白这一点。原因是你之前说过的。这种方式只是让应用程序首先运行按钮,然后运行空检查。我不确定我的理解是否正确。最后我使用你的建议,它工作得很好 –