[英]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.