簡體   English   中英

之后如何停止Android中的聲音

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM