Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中停止声音_Java_Android_Audio_Ringtone - Fatal编程技术网

Java 如何在Android中停止声音

Java 如何在Android中停止声音,java,android,audio,ringtone,Java,Android,Audio,Ringtone,我正在尝试构建一个报警应用程序。当警报打开时,用户必须扫描匹配的二维码,然后才能将其关闭。我已经查看了这个链接来播放声音:我正在使用zxing库中的ScanningViaIntent用于二维码扫描仪: 因此,我在onStart()活动中启动声音: @Override public void onStart(){ super.onStart(); Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYP

我正在尝试构建一个报警应用程序。当警报打开时,用户必须扫描匹配的二维码,然后才能将其关闭。我已经查看了这个链接来播放声音:我正在使用zxing库中的ScanningViaIntent用于二维码扫描仪:

因此,我在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完全重新创建您的活动时,您才会看到问题,例如当屏幕方向发生变化时,因为这需要在代码中进一步处理;请参阅,尤其是
onSaveInstanceState()

我猜下一步是移动线路:

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

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

这就成功了。只是将其移动到onCreate()。我现在已经强迫方向是可移植的,我想这是一种处理方向改变的懒惰方式。