1

私は最初の Android アプリに取り組んでおり、バイブレーターを実装しようとして問題が発生しています。私がやろうとしているのは、AlertDialog にメッセージを表示させることです。ユーザーはその時点で実際にはアプリを実行していない可能性があるため、アラームを再生し、アラートを閉じるまで電話を振動させます。最初はバイブレーターなしで問題なく動作していましたが、バイブレーターを実装するとアラーム音が止まり、AlertDialog が表示されなくなりました。新しいスレッドでアラームを実行することでアラームの問題を解決できることがわかりましたが、それでも AlertDialog はありません。それで、バイブレーターを新しいスレッドにも移動しようとしましたが、問題は解決しませんでした. したがって、私の現在の問題は、電話がアラーム音を鳴らして振動することですが、表示するように指示している AlertDialog は表示されません。これら 3 つを同時に機能させるにはどうすればよいでしょうか。これが私のコードです(無関係な部分は削除されています)...

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
4

1 に答える 1

0

ブロックしているように感じますstartAlarmが、UI 以外のすべてを別のスレッドに移動することもお勧めします。これを行うために AsyncTask を使用しましたが、非常にうまく機能することがわかりました。

ここで見つけることができる AsyncTask のドキュメント。私のアプリでは、おそらくあなたのアプリでも起こっているUI全体をブロックしたアプリのWebサービスからフェッチしていたからです。

于 2012-05-29T06:30:54.857 に答える