[英]How to stop sound in Android after
我正在尝试构建一个警报应用程序。 警报打开时,用户必须先扫描匹配的QR码,然后再将其关闭。 我查看了以下链接以播放声音: 如何在Android中播放铃声/警报声音,并且我正在使用zxing库中的ScanningViaIntent作为QR码扫描仪: https : //code.google.com/ p / zxing / 。
因此,我在onStart()活动中开始播放声音:
@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()。 但是这些是我的问题:
我试过将其放在onCreate()方法中,但也无济于事。
更新:
我试过了:
@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完全重新创建活动时(例如,当屏幕方向改变时)看到的问题,因为需要在您的代码中进行进一步处理;请参阅Android文档以了解活动生命周期 ,尤其是onSaveInstanceState()
)。
我下一步的猜测是移动这条线:
r = RingtoneManager.getRingtone(getApplicationContext(), notification);
到您的onCreate()
方法中。 我希望这与if (!r.isPlaying())
代码结合在一起可以在大多数情况下防止出现双重警报问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.