Android 如何通过摇动手机开始拍照活动

Android 如何通过摇动手机开始拍照活动,android,android-service,accelerometer,android-sensors,android-camera-intent,Android,Android Service,Accelerometer,Android Sensors,Android Camera Intent,我正在开发一个应用程序,我的目标是通过摇晃手机从服务开始拍照活动。 我可以发起祝酒,但不能发起活动。 我不想展示祝酒词,而是想启动拍照活动。这是我的代码,如何通过摇动启动照相机活动。 后台服务.java public class Background_service extends Service implements SensorEventListener { boolean flag=false; private long lastUpdate; SensorMana

我正在开发一个应用程序,我的目标是通过摇晃手机从服务开始拍照活动。 我可以发起祝酒,但不能发起活动。 我不想展示祝酒词,而是想启动拍照活动。这是我的代码,如何通过摇动启动照相机活动。

后台服务.java

public class Background_service extends Service implements SensorEventListener
{
    boolean flag=false;
    private long lastUpdate;
    SensorManager sensorManager;
    int count=0;
    final static int cameraData = 0;
    private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
    private Uri fileUri;
    ImageView iv;
    Intent I;
    Bitmap bmp;

    @Override
    public IBinder onBind(Intent intent) 
    {

        return null;
    }
    public void onCreate()
    {
        flag=true;
        Log.d(MainShake.TAG, "onCreate");
        super.onCreate();
    }

    public void onDestroy() 
    {
        flag=false;
        Log.d(MainShake.TAG, "onDestroy");
        super.onDestroy();
    }

    public void onStart(Intent intent, int startId)
    {
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
        lastUpdate = System.currentTimeMillis();


    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) 
    {
    }

    private void getAccelerometer(SensorEvent event) 
    {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
        {
            float[] values = event.values;
            // Movement
            float x = values[0];
            float y = values[1];
            float z = values[2];

            float accelationSquareRoot = (x * x + y * y + z * z) / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
            long actualTime = System.currentTimeMillis();
            if (accelationSquareRoot >= 2)
            {
                if (actualTime - lastUpdate < 2000) 
                {
                    count++;
                    return;
                }
                Context context = getApplicationContext();
                CharSequence text = "Please fill all the field...!";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.show();

            }
        }
    }


    public void onSensorChanged(SensorEvent event) 
    {

        getAccelerometer(event);

    }
    protected void onResume() 
    {
        // register this class as a listener for the orientation and
        // accelerometer sensors
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),             SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause()
    {
        // unregister listener
        sensorManager.unregisterListener(this);

    }

}
公共类后台\u服务扩展服务实现SensorEventListener
{
布尔标志=假;
私人长期更新;
传感器管理器传感器管理器;
整数计数=0;
最终静态int cameraData=0;
私有静态最终整数捕获\视频\活动\请求\代码=200;
私有Uri文件Uri;
ImageView iv;
意图一;
位图bmp;
@凌驾
公共IBinder onBind(意向)
{
返回null;
}
public void onCreate()
{
flag=true;
Log.d(MainShake.TAG,“onCreate”);
super.onCreate();
}
公共空间
{
flag=false;
Log.d(MainShake.TAG,“onDestroy”);
super.ondestory();
}
公共无效启动(Intent Intent,int startId)
{
sensorManager=(sensorManager)getSystemService(传感器服务);
sensorManager.registerListener(这是sensorManager.getDefaultSensor(Sensor.TYPE\u Accelerator),sensorManager.Sensor\u DELAY\u NORMAL);
lastUpdate=System.currentTimeMillis();
}
@凌驾
精度更改时的公共无效(传感器,int精度)
{
}
专用传感器(传感器事件)
{
if(event.sensor.getType()==sensor.TYPE\u加速计)
{
float[]值=event.values;
//运动
浮点x=值[0];
浮动y=值[1];
浮动z=数值[2];
浮动加速度平方根=(x*x+y*y+z*z)/(SensorManager.GRAVITY\u EARTH*SensorManager.GRAVITY\u EARTH);
长实际时间=System.currentTimeMillis();
如果(加速度平方根>=2)
{
如果(实际时间-上次更新<2000)
{
计数++;
返回;
}
Context=getApplicationContext();
CharSequence text=“请填写所有字段…!”;
int duration=Toast.LENGTH\u SHORT;
Toast Toast=Toast.makeText(上下文、文本、持续时间);
toast.show();
}
}
}
传感器更改时的公共无效(传感器事件)
{
(事件),;
}
受保护的void onResume()
{
//将此类注册为方向和方向的侦听器
//加速度传感器
sensorManager.registerListener(这是sensorManager.getDefaultSensor(Sensor.TYPE\u Accelerator),sensorManager.Sensor\u DELAY\u NORMAL);
}
受保护的void onPause()
{
//取消注册侦听器
sensorManager.UnregistereListener(此);
}
}
ShakeEventListner.java

public class ShakeEventListener implements SensorEventListener {


      /** Minimum movement force to consider. */
      private static final int MIN_FORCE = 10;

      /**
       * Minimum times in a shake gesture that the direction of movement needs to
       * change.
       */
      private static final int MIN_DIRECTION_CHANGE = 3;

      /** Maximum pause between movements. */
      private static final int MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE = 200;

      /** Maximum allowed time for shake gesture. */
      private static final int MAX_TOTAL_DURATION_OF_SHAKE = 400;

      /** Time when the gesture started. */
      private long mFirstDirectionChangeTime = 0;

      /** Time when the last movement started. */
      private long mLastDirectionChangeTime;

      /** How many movements are considered so far. */
      private int mDirectionChangeCount = 0;

      /** The last x position. */
      private float lastX = 0;

      /** The last y position. */
      private float lastY = 0;

      /** The last z position. */
      private float lastZ = 0;

      /** OnShakeListener that is called when shake is detected. */
      private OnShakeListener mShakeListener;

      /**
       * Interface for shake gesture.
       */
      public interface OnShakeListener {

        /**
         * Called when shake gesture is detected.
         */
        void onShake();
      }

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

      @Override
      public void onSensorChanged(SensorEvent se) {
        // get sensor data
        float x = se.values[SensorManager.DATA_X];
        float y = se.values[SensorManager.DATA_Y];
        float z = se.values[SensorManager.DATA_Z];

        // calculate movement
        float totalMovement = Math.abs(x + y + z - lastX - lastY - lastZ);

        if (totalMovement > MIN_FORCE) {

          // get time
          long now = System.currentTimeMillis();

          // store first movement time
          if (mFirstDirectionChangeTime == 0) {
            mFirstDirectionChangeTime = now;
            mLastDirectionChangeTime = now;
          }

          // check if the last movement was not long ago
          long lastChangeWasAgo = now - mLastDirectionChangeTime;
          if (lastChangeWasAgo < MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE) {

            // store movement data
            mLastDirectionChangeTime = now;
            mDirectionChangeCount++;

            // store last sensor data 
            lastX = x;
            lastY = y;
            lastZ = z;

            // check how many movements are so far
            if (mDirectionChangeCount >= MIN_DIRECTION_CHANGE) {

              // check total duration
              long totalDuration = now - mFirstDirectionChangeTime;
              if (totalDuration < MAX_TOTAL_DURATION_OF_SHAKE) {
                mShakeListener.onShake();
                resetShakeParameters();
              }
            }

          } else {
            resetShakeParameters();
          }
        }
      }

      /**
       * Resets the shake parameters to their default values.
       */
      private void resetShakeParameters() {
        mFirstDirectionChangeTime = 0;
        mDirectionChangeCount = 0;
        mLastDirectionChangeTime = 0;
        lastX = 0;
        lastY = 0;
        lastZ = 0;
      }

      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }

    }
公共类ShakeEventListener实现SensorEventListener{
********
专用静态最终最小内力=10;
/**
*晃动姿势中移动方向需要调整的最小次数
*改变。
*/
私有静态最终整数最小方向变化=3;
/**动作之间的最大停顿*/
私有静态最终整数最大暂停方向变化=200;
/**抖动手势允许的最长时间*/
私有静态最终整数最大值总持续时间抖动=400;
/**手势开始的时间*/
私有长mFirstDirectionChangeTime=0;
/**上次移动开始的时间*/
专用长时间方向转换时间;
/**到目前为止考虑了多少运动*/
私有int mDirectionChangeCount=0;
/**最后一个x位置*/
私有浮动lastX=0;
/**最后一个y位置*/
私人浮动弹性=0;
/**最后一个z位置*/
私有浮动lastZ=0;
/**检测到抖动时调用的OnShakeListener*/
私人OnShakeListener mShakeListener;
/**
*摇动手势的界面。
*/
ShakeListener上的公共接口{
/**
*检测到抖动手势时调用。
*/
void onShake();
}
公共无效设置OnShakeListener(OnShakeListener侦听器){
mShakeListener=侦听器;
}
@凌驾
传感器更改时的公共无效(传感器事件se){
//获取传感器数据
浮点x=se.值[SensorManager.DATA_x];
浮动y=se.值[SensorManager.DATA_y];
float z=se.值[SensorManager.数据_z];
//计算运动
float totalMovement=Math.abs(x+y+z-lastX-lastY-lastZ);
如果(总移动>最小作用力){
//有时间
long now=System.currentTimeMillis();
//存储首次移动时间
如果(mFirstDirectionChangeTime==0){
mFirstDirectionChangeTime=现在;
mLastDirectionChangeTime=现在;
}
//检查最后一个动作是否在不久前
long lastChangeWasAgo=now-mLastDirectionChangeTime;
如果(上一次更改为前一次=最小方向更改){
//检查总持续时间
long totalDuration=now-mFirstDirectionChangeTime;
if(总持续时间<最大总持续时间\u抖动){
mShakeListener.onShake();
沙克帕尔酒店
Toast toast = Toast.makeText(context, text, duration);
toast.show();
Intent myIntent = new Intent(Background_service.this, YOUR_ACTIVITY.class);    
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Background_service.this.startActivity(myIntent);