2017-06-21 5 views
1

手が近接センサの近くにあるときに繰り返し音を鳴らし、センサー。これは私が書いたコードです。近接センサーの近くに行くと音声が再生されますが、手が離れると音声が止まらなくなります。助言がありますか?前もって感謝します。人が近接センサの近くにいて、離れて移動したときに停止すると、繰り返しの音声を再生する方法

public class MainActivity extends Activity implements SensorEventListener { 

private SensorManager sensorManager; 
private Sensor proxy; 
TextView tv; 
MediaPlayer mp; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    proxy = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 
    tv = (TextView) findViewById(R.id.tv); 
    //tv.setText("Maximum range = " + proxy.getMaximumRange() + proxy.getName()); 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    sensorManager.unregisterListener(this); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    sensorManager.registerListener(this,proxy,SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(event.sensor.getType() == Sensor.TYPE_PROXIMITY){ 
     mp = MediaPlayer.create(this,R.raw.alarm); 
     if(event.values[0] < proxy.getMaximumRange()){ 
      mp.start(); 
      mp.setLooping(true); 
     } 
     else{ 
      mp.stop(); 
     } 
     //tv.setText("SEnsor NOT activated"); 
     } 
    } 


@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 
} 

答えて

0

onSensorChanged(SensorEventイベント)が呼び出されるたびに、コードがメディアプレーヤーを初期化しています。 stop()メソッドを呼び出そうとすると、それは作成したばかりのオブジェクトで呼び出されていて、前のオブジェクトは既にメモリ内のアラームを実行しているため、停止していません。 文書によると、start()がまだ呼び出されていない場合、stop()は効果がありません。理想的には例外がスローされるはずですが、明らかに効果はありません。 私はあなたのコードを修正しました。これは(おそらく)うまくいくはずです。

public class MainActivity extends Activity implements SensorEventListener { 

private SensorManager sensorManager; 
private Sensor proxy; 
TextView tv; 
static final MediaPlayer mp= MediaPlayer.create(this,R.raw.alarm); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    proxy = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 
    tv = (TextView) findViewById(R.id.tv); 
    /** 
    * set on prepared listener 
    */ 


mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 
        mp.start(); 
        mp.setLooping(true); 

       } 
      }); 





} 

@Override 
protected void onPause() { 
    super.onPause(); 
    sensorManager.unregisterListener(this); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    sensorManager.registerListener(this,proxy,SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(event.sensor.getType() == Sensor.TYPE_PROXIMITY){ 
     if(event.values[0] < proxy.getMaximumRange()){ 
      mp.prepareAsync(); 
     } 
     else{ 
      mp.stop(); 
     } 

    } 
} 


@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 

}

+0

コードが機能していません。 oncreate関数で作成されたオーディオはまったく再生されません。 – Shri

+0

エラーがありますか?それともうまくいきませんか? mp = MediaPlayer.create(this、R.raw.alarm)を置き換えることができます。 mp = MediaPlayer.create(this.getApplicationContext()、R.raw.alarm);を使用します。 –

+0

まだ動作しません。それはエラー(-38,0)を与えます – Shri

0

私は、オーディオファイルを再生するためにexoplayerを使用しています。

あなたはこのライブラリを追加する必要があります。

compile 'com.google.android.exoplayer:exoplayer:r2.5.4' 

と読み取り権限を追加します。

"android.permission.READ_EXTERNAL_STORAGE" 

コード:

public class MainActivity extends Activity implements SensorEventListener { 

private SensorManager sensorManager; 
private Sensor sensor; 
public static final int MY_PERMISSIONS_REQUEST_READ = 1 ; 

private SimpleExoPlayer exoPlayer ; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    requestPermissions() ; 

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 

    initExoPlayer(); 


} 

public void initExoPlayer(){ 
    DefaultRenderersFactory defaultRenderersFactory = new DefaultRenderersFactory(this , null , DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); 
    DefaultTrackSelector defaultTrackSelector = new DefaultTrackSelector(); 
    exoPlayer = ExoPlayerFactory.newSimpleInstance(defaultRenderersFactory , defaultTrackSelector) ; 
    String agent = Util.getUserAgent(this, "exoplayer") ; 
    ExtractorMediaSource extractorMediaSource = new ExtractorMediaSource(your_audio_uri , new DefaultDataSourceFactory(this , agent) 
      , new DefaultExtractorsFactory() , null , null) ; 

    exoPlayer.prepare(extractorMediaSource); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ: { 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        initExoPlayer(); 

      } 
      return; 
     } 

     // other 'switch' lines to check for other 
     // permissions this app might request 
    } 

} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) { 
     if (event.values[0] < sensor.getMaximumRange()) { 
      exoPlayer.setAudioStreamType(C.STREAM_TYPE_VOICE_CALL); 
      exoPlayer.setPlayWhenReady(true); 
     } else { 
      exoPlayer.setPlayWhenReady(false); 

     } 

    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    sensorManager.unregisterListener(this); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); 
} 




@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 
public void requestPermissions() { 
    if (Build.VERSION.SDK_INT >= 23) { 

      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ); 

    } 

} 
} 
関連する問題