Android - 摇一摇启动应用程序
Posted
技术标签:
【中文标题】Android - 摇一摇启动应用程序【英文标题】:Android - Launching an app with a shake 【发布时间】:2017-04-27 11:10:07 【问题描述】:我是这个 android 开发领域的新手。我正在开发一个应用程序,我需要通过摇动设备来启动它。我怎样才能完成这件事?我阅读了很多线程并尝试了几个代码。但他们都没有工作。请提供特定文件(或多个文件)的完整代码(从上到下)。这样我就能够了解我需要在代码中更改的确切位置。谢谢!
【问题讨论】:
你做了什么?在此处发布一些代码 如果我这样做了,我会实现一个服务,该服务一直在设备上运行,由 BOOT_COMPLETE 启动,在服务中我会监听加速度计数据,确定 摇晃。然后确定后才启动Activity “我阅读了很多线程并尝试了几个代码。但没有一个有效”——然后提供minimal reproducible example 准确地展示您尝试的内容并准确解释无效的内容。 “请提供特定文件(或多个文件)的完整代码(从上到下)”——这不是 Stack Overflow 的工作方式。如果您想为您编写自定义代码,请雇用某人。 @CommonsWare 对不起,您完全误解了我的意思。正如我之前所说,我是这个 Android 开发领域的新手。有时人们会用不同的短语给出答案。例如,如果您看一下下面的第一个答案,它会说“现在使用 onSensorChanged 来获取读数”。我的知识不足以理解我需要将这个东西放在我的代码中的哪个位置。我应该把它放在 MainActivity 还是 ShakeService 中?如果是 MainActivity,那么它到底在哪里?在 OnCreate() 方法内部还是之后?我没有得到任何这些。我还在 “我的知识还不足以理解我需要把这个东西放在我的代码中的什么地方”——这很好。但是,处理此问题的正确方法是对问题发表评论,要求澄清,是否以及何时发布您不完全理解的答案。 【参考方案1】:试试这个,首先创建你的服务
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));
【讨论】:
ShakeActivity extends Service
看起来很奇怪,但总的来说答案足够好
实际上我的代码有活动,问题只是将其更改为服务,因此可以忽略名称:)
现在编辑,ShakeService
您将把它放在 onStartCommand() 方法之外,在 Service 类中
@AbdulKawee 因为我是新手,你能告诉我我需要把这个“onSensorChanged”方法放在哪里吗?在什么文件里?在哪几行之间?以上是关于Android - 摇一摇启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章