2013-04-20 126 views
0

我试图构建一个闹钟应用程序。当警报开启时,用户必须在关闭之前扫描一个匹配的QR码。我查看了此链接以播放声音:How to play ringtone/alarm sound in Android,我正在使用QR码扫描器的zxing库中的ScanningViaIntent:https://code.google.com/p/zxing/如何在Android中停止声音

于是我开始了声音的在onStart()活动:

private class HandleClick implements OnClickListener{ 
    public void onClick(View arg0) { 
     IntentIntegrator integrator = new IntentIntegrator(AlarmRequirementsActivity.this); 
     integrator.initiateScan(); 

    } 
} 

这里返回扫描仪的结果:

@Override 
public void onStart(){ 
    super.onStart(); 
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
    r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
    r.play(); 
} 

然后用户通过按下一个按钮开始扫描:

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()方法,但无济于事为好。

UPDATE:

我已经试过:

@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

活动即将从扫描仪回来后重新启动。这场比赛是否成功并不重要。

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

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

这导致两个闹钟铃声正在播放的

你应该能够避免这种情况,你的代码检查,如果铃声已经发挥似乎是一个良好的开端。但是,我怀疑您每次执行onStart()时都会创建一个新的铃声对象。

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

我在接下来的步骤可能是将招行:

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

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

+0

这样做。刚把它移到了onCreate()。我现在已经强迫这个方向成为肖像,这是一种处理方向变化的懒惰方式,我猜。 – 2013-04-20 19:52:26