Question

Je ne trouve pas où le problème.Quand j'ai secouer le téléphone ce qu'il doit faire est de Changer le texte de la textview, mais au Lieu de cela lorsque je le secouer, il se bloque.Quel est le problème Dans mon code?J'ai essaye de regarder sur le logcat, mais je ne suis pas habile encore à Comprendre quelque chose (surtout parce que ma langue maternelle n'est pas anglais ).Merci!L'Activité Principale

package nir.rauch.accelrate;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.TextView;

public class MainActivity extends Activity
{
  private ShakeListener mShaker;
public TextView text;
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
final TextView text =(TextView)findViewById(R.id.textView1);
    final Vibrator vibe = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
mShaker = new ShakeListener(this);
mShaker.setOnShakeListener(new ShakeListener.OnShakeListener () {
  public void onShake()
  {
    vibe.vibrate(100);
   text.setText("" + "what a suprise! after the shaking The text has been changed and it also "
        + "Vibrates , so AMAZING!");
  }
});
  }

  @Override
  public void onResume()
  {
    mShaker.resume();
    super.onResume();
  }
  @Override
  public void onPause()
  {
    mShaker.pause();
    super.onPause();
  }
}

Le Shaker activité

    package nir.rauch.accelrate;

import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.content.Context;
import java.lang.UnsupportedOperationException;

public class ShakeListener implements SensorListener 
{
  private static final int FORCE_THRESHOLD = 350;
  private static final int TIME_THRESHOLD = 100;
  private static final int SHAKE_TIMEOUT = 500;
  private static final int SHAKE_DURATION = 1000;
  private static final int SHAKE_COUNT = 3;

  private SensorManager mSensorMgr;
  private float mLastX=-1.0f, mLastY=-1.0f, mLastZ=-1.0f;
  private long mLastTime;
  private OnShakeListener mShakeListener;
  private Context mContext;
  private int mShakeCount = 0;
  private long mLastShake;
  private long mLastForce;

  public interface OnShakeListener
  {
    public void onShake();
  }

  public ShakeListener(Context context) 
  { 
    mContext = context;
    resume();
  }

  public void setOnShakeListener(OnShakeListener listener)
  {
    mShakeListener = listener;
  }

  public void resume() {
    mSensorMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
    if (mSensorMgr == null) {
      throw new UnsupportedOperationException("Sensors not supported");
    }
    boolean supported = mSensorMgr.registerListener(this, SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_GAME);
    if (!supported) {
      mSensorMgr.unregisterListener(this, SensorManager.SENSOR_ACCELEROMETER);
      throw new UnsupportedOperationException("Accelerometer not supported");
    }
  }

  public void pause() {
    if (mSensorMgr != null) {
      mSensorMgr.unregisterListener(this, SensorManager.SENSOR_ACCELEROMETER);
      mSensorMgr = null;
    }
  }

  public void onAccuracyChanged(int sensor, int accuracy) { }

  public void onSensorChanged(int sensor, float[] values) 
  {
    if (sensor != SensorManager.SENSOR_ACCELEROMETER) return;
    long now = System.currentTimeMillis();

    if ((now - mLastForce) > SHAKE_TIMEOUT) {
      mShakeCount = 0;
    }

    if ((now - mLastTime) > TIME_THRESHOLD) {
      long diff = now - mLastTime;
      float speed = Math.abs(values[SensorManager.DATA_X] + values[SensorManager.DATA_Y] + values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) / diff * 10000;
      if (speed > FORCE_THRESHOLD) {
        if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION)) {
          mLastShake = now;
          mShakeCount = 0;
          if (mShakeListener != null) { 
            mShakeListener.onShake(); 
          }
        }
        mLastForce = now;
      }
      mLastTime = now;
      mLastX = values[SensorManager.DATA_X];
      mLastY = values[SensorManager.DATA_Y];
      mLastZ = values[SensorManager.DATA_Z];
    }
  }

}

Le fichier XML:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40sp"
        android:text="Does the Accelorometer works? Shake it and found out!" />


</RelativeLayout>

mon LOGCAT:

    04-12 18:49:15.831: E/SensorManager(5343): Exception dispatching input event.
04-12 18:49:15.831: E/AndroidRuntime(5343): FATAL EXCEPTION: main
04-12 18:49:15.831: E/AndroidRuntime(5343): java.lang.SecurityException: Requires VIBRATE permission
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.Parcel.readException(Parcel.java:1431)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.Parcel.readException(Parcel.java:1385)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.IVibratorService$Stub$Proxy.vibrateMagnitude(IVibratorService.java:342)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.SystemVibrator.vibrate(SystemVibrator.java:115)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.SystemVibrator.vibrate(SystemVibrator.java:83)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at nir.rauch.accelrate.MainActivity$1.onShake(MainActivity.java:25)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at nir.rauch.accelrate.ShakeListener.onSensorChanged(ShakeListener.java:79)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.hardware.LegacySensorManager$LegacyListener.onSensorChanged(LegacySensorManager.java:274)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:467)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.MessageQueue.nativePollOnce(Native Method)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.MessageQueue.next(MessageQueue.java:132)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.os.Looper.loop(Looper.java:124)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at android.app.ActivityThread.main(ActivityThread.java:5419)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at java.lang.reflect.Method.invokeNative(Native Method)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at java.lang.reflect.Method.invoke(Method.java:525)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
04-12 18:49:15.831: E/AndroidRuntime(5343):     at dalvik.system.NativeStart.main(Native Method)
04-12 18:55:45.396: E/SensorManager(6408): Exception dispatching input event.
04-12 18:55:45.401: E/AndroidRuntime(6408): FATAL EXCEPTION: main
04-12 18:55:45.401: E/AndroidRuntime(6408): java.lang.SecurityException: Requires VIBRATE permission
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.Parcel.readException(Parcel.java:1431)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.Parcel.readException(Parcel.java:1385)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.IVibratorService$Stub$Proxy.vibrateMagnitude(IVibratorService.java:342)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.SystemVibrator.vibrate(SystemVibrator.java:115)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.SystemVibrator.vibrate(SystemVibrator.java:83)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at nir.rauch.accelrate.MainActivity$1.onShake(MainActivity.java:25)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at nir.rauch.accelrate.ShakeListener.onSensorChanged(ShakeListener.java:79)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.hardware.LegacySensorManager$LegacyListener.onSensorChanged(LegacySensorManager.java:274)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:467)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.MessageQueue.nativePollOnce(Native Method)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.MessageQueue.next(MessageQueue.java:132)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.os.Looper.loop(Looper.java:124)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at android.app.ActivityThread.main(ActivityThread.java:5419)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at java.lang.reflect.Method.invokeNative(Native Method)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at java.lang.reflect.Method.invoke(Method.java:525)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
04-12 18:55:45.401: E/AndroidRuntime(6408):     at dalvik.system.NativeStart.main(Native Method)
Était-ce utile?

La solution

en tant que votre logcat dit,

java.lang.SecurityException:Nécessite VIBRER autorisation

vous avez besoin de Vibrer autorisation.si vous avez besoin d'ajouter la ligne suivante dans le fichier de manifeste:

 <uses-permission android:name="android.permission.VIBRATE"/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top