如何在Android之后停止声音

时间:2013-04-20 19:09:34

标签: java android audio ringtone

我正在尝试构建一个警报应用程序。当闹钟开启时,用户必须在关闭之前扫描匹配的QR码。我已经看过这个链接来播放声音:How to play ringtone/alarm sound in 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();
    }
}

1 个答案:

答案 0 :(得分:1)

  

从扫描仪返回后重新启动活动。如果比赛成功与否则无关紧要。

我假设您需要启动另一项活动来执行扫描,这意味着您的活动(至少)需要暂停并且更有可能停止以允许其他活动运行(根据Android活动生命周期)

因此,从扫描仪返回时,您将不得不调用onStart()

  

这导致现在播放两种警报音

您应该能够避免这种情况以及您的代码检查铃声是否已经播放似乎是一个好的开始。但是,我怀疑您每次执行onStart()时都会创建一个新的铃声对象。

我很难猜到你需要做的所有事情来完全解决你的问题(更不用说你在Android完全重新创建活动时会看到的问题 - 例如当屏幕方向改变时 - 因为这需要在代码中进一步处理;请参阅Android doc for the activity lifecycle,尤其是onSaveInstanceState()。)

我对下一步的猜测是移动线:

r = RingtoneManager.getRingtone(getApplicationContext(), notification);

进入onCreate()方法。我希望这与if (!r.isPlaying())代码相结合可以防止大多数情况下出现双重警报问题。