2017-05-09 13 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

に取り組んでいます。ヌルセンサーに登録しようとすると例外がスローされます。 –

答えて

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

:加速度計がある場合は、今onCreateから復帰し、ボタンクリックリスナーを設定する、ことを含む残りのコードをスキップします。

+0

ええ、ありがとう、私はそれをやろうとします。 –

0

setContentView()下回るとトリック

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

mSensormanager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);の上にこのコードを入れていますが、nullをチェックした後 `registerListener`呼び出しを配置することが私のデバイス

+0

うわー、うまくいってくれてありがとう –

+0

@FanFanしかし、*これは期待どおりに動作し、元のコードはなぜですか? –

+0

@EugenPechanecはい、私はそれを理解していると思います。理由はあなたが前に言ったことです。この方法では、単にアプリケーションをボタンをクリックして実行してから、ヌルチェックを実行します。私は理解したものが正しいかどうかわからない。そして最後に私はあなたの提案を使用し、それは非常にうまくいく –

関連する問題