私はアラームプログラムを書いている最中です。そのほとんどは正常に動作しているようです。アラームが鳴る時間を設定できます。この時間が来ると、私の放送受信機は、振動し、音を出し、ユーザーが音を止めることができるボタンを表示するアクティビティを開始します。プログラムを実行すると、アラームが 1 ~ 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();
}
正しく鳴るようにコードを修正する方法を誰か教えてもらえますか...または、簡単に説明しているサイトへのWebリンクを教えてください。
編集:最初に電話を起動することで、おそらく問題を解決できると思いました. これを行うために、バイブレーションのアラームの前に次のコードを追加しました。
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);
メインウィンドウに追加しました。これでロックの問題は回避されましたが、まだ音が出ません。