Android-приложение, вибратор не работает с AlertDialog
Я работаю над своим первым приложением для Android, и у меня возникла проблема при попытке реализовать вибратор. То, что я пытаюсь сделать, это заставить AlertDialog отображать сообщение, и, поскольку пользователь мог на самом деле не запускать приложение в то время, включите будильник и вибрируйте телефон, пока он не закроет предупреждение. Сначала я работал без вибратора, потом, когда я установил вибратор, он прекратил звук будильника и больше не отображал AlertDialog. Я обнаружил, что смог исправить проблему с сигналом тревоги, выполнив его в новом потоке, но все еще не AlertDialog. Тогда я попытался переместить Вибратор в новую ветку, и это не решило мою проблему. Таким образом, моя текущая проблема заключается в том, что телефон воспроизводит звук будильника и вибрирует, но AlertDialog, о котором я говорю, никогда не отображается. Как я могу заставить все эти три вещи работать одновременно? Вот мой код (ненужные части удалены)...
public class AlarmDisplayActivity extends Activity {
private MediaPlayer media;
private PowerManager.WakeLock lock;
private AlertDialog alert;
private Vibrator vibrator;
private Thread vibrateThread;
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.alarmdisplay_screen);
PowerManager power = (PowerManager)getSystemService(Context.POWER_SERVICE);
lock = power.newWakeLock(PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP, "AlarmReceiverActivity");
alert = new AlertDialog.Builder(AlarmDisplayActivity.this).create();
vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
vibrateThread = new VibrateThread();
lock.acquire();
alert.setCancelable(false);
alert.setButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
media.stop();
vibrateThread.interrupt();
lock.release();
}// Ends onClick
}// Ends setButton
startAlarm(this);
vibrateThread.start();
alert.show();
}// Ends onCreate
private void startAlarm(final Context context) {
new Thread() {
public void run() {
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if(uri == null) {
uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
if(uri == null)
uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
}// Ends if
media = new MediaPlayer();
try{
media.setDataSource(context, uri);
final AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if(audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
media.setAudioStreamType(AudioManager.STREAM_ALARM);
media.setLooping(true);
media.prepare();
media.start();
}// Ends if
}// Ends try
catch(Exception e){}
}// Ends run method
}.start();
}// Ends startAlarm method
class VibrateThread extends Thread {
public VibrateThread() {
super();
}
public void run() {
try {
long[] vibPattern = new long[] {0L,100L,250L,1000L,250L,500L};
vibrator.vibrate(vibPattern, 2);
}// Ends try
catch (Exception e) {}
}// Ends run method
}// Ends VibrateThread class
}// Ends AlarmDisplayActivity
1 ответ
У меня есть ощущение startAlarm
блокируется, но также рекомендуется переместить все не пользовательский интерфейс в другой поток. Я использовал AsyncTask для этого и обнаружил, что он работает очень хорошо.
Документацию по AsyncTask вы можете найти здесь. потому что в моем приложении я загружал данные из веб-службы в моем приложении, которая блокировала весь пользовательский интерфейс, который, вероятно, также происходит с вашим приложением.