Заставить мое Android-приложение вибрировать с событием wasItTouched

У меня есть приложение, в котором есть объекты (спрайты), движущиеся по экрану. Я хотел бы, чтобы телефон вибрировал, когда к ним прикасались / нажимали, но у меня возникли некоторые проблемы.

Я добавил то, что, как я думал, будет работать в методе wasItTouched (в классе спрайтов), как показано ниже:

public boolean wasItTouched(float ex, float ey) {
    boolean touched = false;
    if ((x <= ex) && (ex < x + bmp_width) &&
            (y <= ey) && (ey < y + bmp_height)) {
        touched = true;

        Vibrator vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        vibe.vibrate(500);
        //mySound.play(zapSoundId, 1, 1, 1, 0, 1);


    }

    return touched;
}

Как вы, наверное, видите из "комментариев", я пытался добавить звук, но это тоже не сработало.

Интересно, я просто не помещаю это в правильное место.

Я объявил это в манифесте (см. Ниже):

<uses-permission android:name="android.permission.VIBRATE" />

Когда я нажимаю на спрайт (или в любом месте экрана), приложение вылетает.

Вот что я получаю от logcat:

04-24 17:32:56.192 7551-7551/cct.mad.lab D/AndroidRuntime: Shutting down VM
04-24 17:32:56.192 7551-7551/cct.mad.lab W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xb0d7cb20)
04-24 17:32:56.192 7551-7551/cct.mad.lab E/AndroidRuntime: FATAL EXCEPTION: main
                                                       Process: cct.mad.lab, 
PID: 7551
                                                       java.lang.IllegalStateException: System services not available to Activities before onCreate()
                                                           at android.app.Activity.getSystemService(Activity.java:4532)
                                                           at cct.mad.lab.Sprite.wasItTouched(Sprite.java:136)
                                                           at cct.mad.lab.GameView.onTouchEvent(GameView.java:187)
                                                           at android.view.View.dispatchTouchEvent(View.java:7706)
                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
                                                           at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
                                                           at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
                                                           at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
                                                           at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
                                                           at android.view.View.dispatchPointerEvent(View.java:7886)
                                                           at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
                                                           at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
                                                           at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                           at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                                                           at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                                                           at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
                                                           at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                                                           at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
                                                           at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                           at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
                                                           at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
                                                           at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
                                                           at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
                                                           at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
                                                           at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
                                                           at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
                                                           at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
                                                           at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                           at android.os.MessageQueue.nativePollOnce(Native Method)
                                                           at android.os.MessageQueue.next(MessageQueue.java:138)
                                                           at android.os.Looper.loop(Looper.java:123)
                                                           at android.app.ActivityThread.main(ActivityThread.java:5017)
                                                           at java.lang.reflect.Method.invokeNative(Native Method)
                                                           at java.lang.reflect.Method.invoke(Method.java:515)
                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                                                           at dalvik.system.NativeStart.main(Native Method)
04-24 17:32:56.192 1591-1711/system_process W/ActivityManager:   Force finishing activity cct.mad.lab/.GameActivity

Если кто-то может предложить какое-либо руководство, я был бы очень признателен.

Спасибо

1 ответ

Решение

"Системные сервисы недоступны для Активности до onCreate()"

Вы как-то вызываете это до вызова onCreate для этого действия, что недопустимо. Основной случай, в котором это происходит, - это если вы либо вызываете функцию в init объекта в качестве значения по умолчанию, либо если вы пытаетесь создать Activity с помощью new (что никогда не должно выполняться).

Другие вопросы по тегам