如何在Android中停止声音
我试图构建一个闹钟应用程序。当警报开启时,用户必须在关闭之前扫描一个匹配的QR码。我查看了此链接以播放声音:How to play ringtone/alarm sound in Android,我正在使用QR码扫描器的zxing库中的ScanningViaIntent:https://code.google.com/p/zxing/。如何在Android中停止声音
于是我开始了声音的在onStart()活动:
private class HandleClick implements OnClickListener{
public void onClick(View arg0) {
IntentIntegrator integrator = new IntentIntegrator(AlarmRequirementsActivity.this);
integrator.initiateScan();
}
}
这里返回扫描仪的结果:
@Override
public void onStart(){
super.onStart();
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
}
然后用户通过按下一个按钮开始扫描:
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()方法,但无济于事为好。
UPDATE:
我已经试过:
@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 doc for the activity lifecycle,特别是onSaveInstanceState()
)。
我在接下来的步骤可能是将招行:
r = RingtoneManager.getRingtone(getApplicationContext(), notification);
到您的onCreate()
方法。我的希望是,这与if (!r.isPlaying())
代码结合在一起应该可以防止大多数情况下的双重报警问题。
这样做。刚把它移到了onCreate()。我现在已经强迫这个方向成为肖像,这是一种处理方向变化的懒惰方式,我猜。 – 2013-04-20 19:52:26