Android - 用摇晃启动应用程序

问题描述:

我是Android开发领域的新手。我正在开发一个应用程序,我需要通过摇动设备来启动。我怎样才能完成这件事?我阅读了很多主题并尝试了几个代码。但他们中没有人工作。请提供一些特定文件(或文件)的完整代码(从上到下)。这样我就能够明白我在代码中需要更改的位置。谢谢!Android - 用摇晃启动应用程序

+1

你有什么做了什么?在这里发布一些代码 –

+1

如果我这样做了,我会实现一种服务,它始终在设备上工作,由BOOT_COMPLETE启动,并且在服务中,我会听加速计数据,确定* shake *。然后在确定 –

+0

“我阅读了很多主题并尝试了几个代码,但其中没有一个能够工作” - 然后提供一个[mcve]来准确地展示您尝试的内容并准确解释哪些内容无效。 “请提供一些特殊文件(或文件)的完整代码(从上到下)” - 这不是Stack Overflow的工作方式。如果您想为您编写自定义代码,请雇用某人。 – CommonsWare

试试这个,首先创建您的服务

public class ShakeService extends Service implements SensorEventListener { 

private SensorManager sensorMgr; 
private Sensor acc; 
private long lastUpdate = -1; 
private float x, y, z; 
private float last_x, last_y, last_z; 
private static final int SHAKE_THRESHOLD = 1100; 



@Override 
public void onCreate() { 


    Toast.makeText(this, 
      "Service Started", Toast.LENGTH_SHORT).show(); 
    sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); 
    acc=sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 

    boolean accelSupported= sensorMgr.registerListener((SensorEventListener) this, acc, SensorManager.SENSOR_DELAY_GAME); 
    long curTime11 = System.currentTimeMillis(); 

    if (!accelSupported) { 
     // on accelerometer on this device 
     sensorMgr.unregisterListener((SensorEventListener) this,acc); 
    } 

    super.onCreate(); 
} 


protected void onPause() { 
    if (sensorMgr != null) { 
     sensorMgr.unregisterListener((SensorEventListener) this,acc); 
     sensorMgr = null; 
    } 
    return; 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 


    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public void onDestroy() { 

    if (sensorMgr != null) { 
     sensorMgr.unregisterListener((SensorEventListener) this,acc); 
     sensorMgr = null; 
    } 
    stopSelf(); 
    super.onDestroy(); 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onSensorChanged(SensorEvent sensorEvent) { 

    if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     long curTime = System.currentTimeMillis(); 
     // only allow one update every 100ms. 
     if ((curTime - lastUpdate) > 100) { 
      long diffTime = (curTime - lastUpdate); 
      lastUpdate = curTime; 

      x = sensorEvent.values[SensorManager.DATA_X]; 
      y = sensorEvent.values[SensorManager.DATA_Y]; 
      z = sensorEvent.values[SensorManager.DATA_Z]; 

      float speed = Math.abs(x+y+z - last_x - last_y - last_z)/diffTime * 10000; 

      if (speed > SHAKE_THRESHOLD) { 
       Log.d("sensor", "shake detected w/ speed: " + speed); 
       Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show(); 

         Intent myIntent= new Intent(this, MyActivity.class); 
         myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    /    startActivity(myIntent); 
       ////Here start your activity and your application will be started 
      } 
      last_x = x; 
      last_y = y; 
      last_z = z; 
     } 

    } 

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

} 

} 

并确保您的活动启动服务来声明你的服务清单中

<service 
     android:name=".ShakeService" 
     android:enabled="true" 
     android:exported="true"></service> 

现在,作为

startService(new Intent(MainActivity.this,ShakeService.class)); 
+0

'ShakeActivity extends Service'看起来很奇怪,但总的来说回答足够好 –

+0

其实我的代码有活动,因为问题只是改了它的服务所以名字可以忽略:) –

+1

现在编辑,ShakeService –