2012-05-29 4 views
1

첫 번째 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 

답변

0

내가 느낌 startAlarm이 차단해야하지만, 또한 다른 스레드로 모든 비 UI를 이동하는 것이 좋습니다. 이 작업을 수행하기 위해 AsyncTask를 사용했는데 실제로 잘 작동하는 것으로 나타났습니다.

AsyncTask의 설명서는 here입니다. 내 앱에서 내 앱의 webservice에서 가져온 것이므로 앱에서 발생하는 전체 UI가 인 것을 막았습니다.

+0

글쎄, 그는 스레드를 사용하므로 UI ​​스레드에서 발생하지 않습니다. –