2017-04-24 8 views
0

J'ai une application qui a des objets (sprites) se déplaçant sur l'écran. Je voudrais que le téléphone vibre lorsqu'on les touche/clique mais j'ai des problèmes.Faire vibrer mon application Android avec un événement wasItTouched

Ce que je faisais était ajouter ce que je pensais travailler dans la méthode wasItTouched (dans la classe de sprite) comme on le voit ci-dessous:

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; 
} 

Comme vous pouvez le voir dans les « commentaires » que j'ai essayé d'ajouter un son mais ça n'a pas marché non plus. Je me demande si je ne le mets pas au bon endroit.

Je l'ai déclaré dans le manifeste (voir ci-dessous):

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

Quand je vais cliquer sur l'image-objet (ou ne importe où sur l'écran pour cette matière), les accidents de l'application.

Voici ce que je reçois de 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 

Si quelqu'un peut offrir toute orientation que je serais très reconnaissant.

Merci

Répondre

0

« Services système non disponible aux activités avant onCreate() »

Vous appelez en quelque sorte ça avant onCreate est appelé à cette activité, ce qui est légal. Le cas principal qui se passe est si vous appelez une fonction dans l'init de l'objet comme valeur par défaut, ou si vous essayez de créer une activité via new (ce qui ne devrait jamais être fait).

+0

Services non disponibles pour les activités antérieures à onCreate() Je crois que wasItTouched() a été appelé depuis onClick et vous pourriez enregistrer l'événement click avant l'exécution de la méthode onCreate(). – rahul

+0

Je n'ai pas de onClick. J'ai un MotionEvent dans la méthode suivante dans la classe Gameview: onTouchEvent public boolean (événement MotionEvent) { \t \t si (sprite.wasItTouched (event.getX(), event.getY())) { \t \t \t sprite = nouveau Sprite (ceci); \t \t \t hitCount ++; \t \t \t return true; \t \t} else { \t \t \t return true; \t \t} \t} – emulus

+0

@emulus Quelque chose ne peut pas être correct. Ici vous avez wasItTouched sur le sprite, et wasItTouched appelle getSystemService ce qui signifie qu'il doit être un contexte - probablement une activité. Si c'est le cas, votre hiérarchie de classe est complètement fausse. Si ce n'est pas le cas, le code que vous avez collé n'est pas le code que vous utilisez. –