첫 번째 Android 앱을 개발 중이며 진동기 구현에 문제가 있습니다. 내가하려는 것은 AlertDialog에 메시지를 표시하는 것입니다. 사용자가 실제로 앱을 실행하지 않았을 수도 있기 때문에 알림을 재생하고 알림을 닫을 때까지 전화를 진동시킬 수 있습니다. 먼저 나는 바이브레이터없이 잘 작동 시켰습니다. 그리고 나는 바이브레이터를 구현했을 때 알람 소리를 멈추었으며 더 이상 AlertDialog를 표시하지 않았습니다. 나는 새로운 스레드에서 알람을 실행하여 알람 문제를 해결할 수 있었지만 여전히 AlertDialog가 없다는 것을 알았습니다. 그래서 나는 진동기를 새로운 나사로 옮기려고했는데 그것은 내 문제를 해결하지 못했습니다. 따라서 현재의 문제는 전화 소리가 울리고 진동하는 것입니다.하지만 표시하도록 알리는 AlertDialog는 표시되지 않습니다. 이 세 가지를 모두 한꺼번에 처리하려면 어떻게해야합니까? 여기에 내 코드 (제거 관련이없는 부분) ...Android 앱, 진동기가 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
글쎄, 그는 스레드를 사용하므로 UI 스레드에서 발생하지 않습니다. –