Android App,Vibrator不使用AlertDialog

时间:2012-05-29 04:33:21

标签: android media-player alertdialog vibrate

我正在开发我的第一个Android应用程序,并且在尝试实现Vibrator时出现问题。我正在尝试做的是让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 个答案:

答案 0 :(得分:0)

我感觉startAlarm正在阻止,但也建议将所有非UI移动到不同的线程中。我使用AsyncTask来做到这一点,我发现它工作得非常好。

AsyncTask的文档,您可以找到here。 因为在我的应用程序中,我从我的应用程序中的网络服务中获取了阻止了 您的应用可能也会发生整个用户界面。