Java 如何在Android中停止声音
我正在尝试构建一个报警应用程序。当警报打开时,用户必须扫描匹配的二维码,然后才能将其关闭。我已经查看了这个链接来播放声音:我正在使用zxing库中的ScanningViaIntent用于二维码扫描仪: 因此,我在onStart()活动中启动声音:Java 如何在Android中停止声音,java,android,audio,ringtone,Java,Android,Audio,Ringtone,我正在尝试构建一个报警应用程序。当警报打开时,用户必须扫描匹配的二维码,然后才能将其关闭。我已经查看了这个链接来播放声音:我正在使用zxing库中的ScanningViaIntent用于二维码扫描仪: 因此,我在onStart()活动中启动声音: @Override public void onStart(){ super.onStart(); Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYP
@Override
public void onStart(){
super.onStart();
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
}
然后,用户按下按钮启动扫描仪:
private class HandleClick implements OnClickListener{
public void onClick(View arg0) {
IntentIntegrator integrator = new IntentIntegrator(AlarmRequirementsActivity.this);
integrator.initiateScan();
}
}
扫描仪的结果在此处返回:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (scanResult != null) {
System.out.println("scanREsult" + scanResult);
System.out.println("requestCode: " + requestCode);
TextView result =(TextView)findViewById(R.id.scanResult);
if (resultCode == RESULT_OK) {
String scanResultString = intent.getStringExtra("SCAN_RESULT");
if(scanResultString .equals(matchString))
{
result.setText("You found it!");
r.stop();
}
else
{
result.setText("\"" + scanResultString + "\""+ " did not match");
}
System.out.println(intent.getStringExtra("SCAN_RESULT"));
} else if (resultCode == RESULT_CANCELED) {
}
}
// else continue with any other code you need in the method
}
如您所见,我在成功匹配后调用r.stop()。然而,这些是我的问题:
- 从扫描仪返回后,活动将重新启动。比赛成功与否无关紧要李>
- 这将导致现在播放两个报警音
@Override
public void onStart(){
super.onStart();
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
r = RingtoneManager.getRingtone(getApplicationContext(), notification);
if(!r.isPlaying())
{
r.play();
}
}
下面是这个。两者都有相同的问题
if(scanResultString .equals(matchString))
{
result.setText("You found it!");
if(r.isPlaying())
{
r.stop();
}
}
从扫描仪返回后,活动将重新启动。比赛成功与否无关紧要
我假设您需要启动另一个活动来执行扫描,这意味着您的活动(至少)需要暂停,更有可能需要停止,以允许其他活动运行(根据Android活动生命周期)
因此,从扫描仪返回时,您必须期望调用onStart()
这将导致现在播放两个报警音
您应该能够避免这种情况,您的代码检查铃声是否已经播放似乎是一个良好的开端。但是,我怀疑您每次执行onStart()
时都在创建一个新的铃声对象
我很难猜测您需要做什么才能完全解决问题(更不用说只有在Android完全重新创建您的活动时,您才会看到问题,例如当屏幕方向发生变化时,因为这需要在代码中进一步处理;请参阅,尤其是onSaveInstanceState()
)
我猜下一步是移动线路:
r = RingtoneManager.getRingtone(getApplicationContext(), notification);
进入您的
onCreate()
方法。我的希望是,在大多数情况下,这与if(!r.isplay())代码相结合,可以防止双重警报问题。这就成功了。只是将其移动到onCreate()。我现在已经强迫方向是可移植的,我想这是一种处理方向改变的懒惰方式。