繁体   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