Android 如何通过摇动手机开始拍照活动
我正在开发一个应用程序,我的目标是通过摇晃手机从服务开始拍照活动。 我可以发起祝酒,但不能发起活动。 我不想展示祝酒词,而是想启动拍照活动。这是我的代码,如何通过摇动启动照相机活动。 后台服务.javaAndroid 如何通过摇动手机开始拍照活动,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
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);