2

我正在编写一个报警程序。其中大部分似乎工作正常。我可以设置闹钟响起的时间。当这个时间到来时,我的广播接收器会启动一个活动,该活动会振动、发出声音并显示一个按钮以允许用户停止声音。当我运行程序时,我可以将闹钟设置为在一两分钟内响起。然后我可以退出警报程序并运行其他程序。果然,闹钟时间到了,我被闹钟活动打断,手机震动,闹钟响起,我看到了按钮。即使将媒体音量调低,我也能听到声音。

问题是如果手机处于睡眠状态,那么在闹钟时间手机会振动,但我听不到任何声音。当我唤醒手机时,我正确地看到了屏幕上的按钮。

我查看了大量不同的代码片段,了解如何发出警报声。它们看起来都异常复杂,而且彼此之间有着惊人的不同。我不完全理解其中任何一个。我使用的是下面显示的几个片段的集合:

alarm_sound = new MediaPlayer();

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if(alert == null){
    // alert is null, using backup
    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if(alert == null){  // I can't see this ever being null (as always have a default notification) but just incase
        // alert backup is null, using 2nd backup
        alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);               
    }
}

 try {
        alarm_sound.setDataSource(this, alert);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
 if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) 
 {

                alarm_sound.setAudioStreamType(AudioManager.STREAM_ALARM);
                alarm_sound.setLooping(true);
                try {
                    alarm_sound.prepare();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                alarm_sound.start();
  }

谁能告诉我如何更正我的代码以使其正常响铃……或者给我一个简单解释它的网站的网络链接。

编辑:我认为也许可以通过先唤醒电话来解决问题。为此,我在任何振动警报之前添加了以下代码:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();

PowerManager pm2 = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock2 = pm2.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock2.acquire();

我还在清单中添加了以下内容:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

这段代码似乎只工作了一半——手机确实在屏幕亮起时唤醒了,但锁仍然打开,即我必须自己执行滑动解锁操作。而且只是雪上加霜,警报器仍然没有发出声音:-(

编辑::我刚刚getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 为我的主窗口添加了。这绕过了锁定问题 - 但仍然没有声音。

4

0 回答 0