1

アプリにシェイク機能を含めようとしています。そのためには、ユーザーがアプリケーションのどこにいるかに関係なく、電話が揺れたときにアクティビティを意図する必要があります。ここで、センサー コードをアプリケーション クラスに配置しましたが、意図するためにはコンテキストが必要です。私は正しい道を進んでいますか、それともこの機能を実現する他の方法はありますか? これが私のコードです

public class MyApplication extends Application {


/* variables for shake detection */
private SensorManager mSensorManager;
private float mAccel; // acceleration apart from gravity
private float mAccelCurrent; // current acceleration including gravity
private float mAccelLast; // last acceleration including gravity
@Override
public void onCreate(){

    /* sensor shake detection */
  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    mAccel = 0.00f;
    mAccelCurrent = SensorManager.GRAVITY_EARTH;
    mAccelLast = SensorManager.GRAVITY_EARTH;   
}


private final SensorEventListener mSensorListener = new SensorEventListener() {

    public void onSensorChanged(SensorEvent se) {
      float x = se.values[0];
      float y = se.values[1];
      float z = se.values[2]; 
      mAccelLast = mAccelCurrent;
      mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
      float delta = mAccelCurrent - mAccelLast;
      mAccel = mAccel * 0.9f + delta; // perform low-cut filter

      if(mAccel > 3.0f)
      {
         // Toast.makeText(getBaseContext(), "Phone shaked", Toast.LENGTH_SHORT).show();
          Intent intent = new Intent(getApplicationContext(),LiveSearchActivity.class);
          startActivity(intent);


      }
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

  };

}

4

2 に答える 2

0

クラスはApplicationを拡張していますが、その代わりにActivityを拡張する必要があります。

public class MyApplication extends Activity
{
    @Override
    protected void onCreate(Bundle Sumit)
    { 
        super.onCreate(Sumit);
    }    
}
于 2013-03-14T13:17:30.670 に答える
0

このコードで試してください。私はそれをチェックしました。出来た 。モバイルが揺れた後、目的の場所に正しくリダイレ​​クトされるようになりました。それがあなたを助けることを願っています。

package com.example.stack;

import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class MyApplication extends Application {


/* variables for shake detection */
private SensorManager mSensorManager;
private float mAccel; // acceleration apart from gravity
private float mAccelCurrent; // current acceleration including gravity
private float mAccelLast; // last acceleration including gravity
Context context;
@Override
public void onCreate(){

    context=this;
    /* sensor shake detection */
  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    mAccel = 0.00f;
    mAccelCurrent = SensorManager.GRAVITY_EARTH;
    mAccelLast = SensorManager.GRAVITY_EARTH;   
}


private final SensorEventListener mSensorListener = new SensorEventListener() {

    public void onSensorChanged(SensorEvent se) {
      float x = se.values[0];
      float y = se.values[1];
      float z = se.values[2]; 
      mAccelLast = mAccelCurrent;
      mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
      float delta = mAccelCurrent - mAccelLast;
      mAccel = mAccel * 0.9f + delta; // perform low-cut filter

      if(mAccel > 3.0f)
      {
         // Toast.makeText(getBaseContext(), "Phone shaked", Toast.LENGTH_SHORT).show();
          Intent intent = new Intent(context,MainActivity.class);
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);       

          startActivity(intent);


      }
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

  };

}
于 2013-03-14T13:40:58.743 に答える