0

센서에 대한 자습서를 따르려고합니다. 그것은 활동과 함께 잘 작동합니다. 그러나, 나는 전화가 잠겨있을 때 이것을 배경으로 사용하기를 원한다. 그렇게하는 가장 좋은 방법은 무엇입니까? 여기 Android Sensor 백그라운드에서 흔들림

튜토리얼 http://jasonmcreynolds.com/?p=388

ShakeDetector 클래스

public class ShakeDetector implements SensorEventListener { 

/* 
* The gForce that is necessary to register as shake. 
* Must be greater than 1G (one earth gravity unit). 
* You can install "G-Force", by Blake La Pierre 
* from the Google Play Store and run it to see how 
* many G's it takes to register a shake 
*/ 
private static final float SHAKE_THRESHOLD_GRAVITY = 2.7F; 
private static final int SHAKE_SLOP_TIME_MS = 500; 
private static final int SHAKE_COUNT_RESET_TIME_MS = 3000; 

private OnShakeListener mListener; 
private long mShakeTimestamp; 
private int mShakeCount; 

public void setOnShakeListener(OnShakeListener listener) { 
    this.mListener = listener; 
} 

public interface OnShakeListener { 
    public void onShake(int count); 
} 

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

@Override 
public void onSensorChanged(SensorEvent event) { 

    if (mListener != null) { 
     float x = event.values[0]; 
     float y = event.values[1]; 
     float z = event.values[2]; 

     float gX = x/SensorManager.GRAVITY_EARTH; 
     float gY = y/SensorManager.GRAVITY_EARTH; 
     float gZ = z/SensorManager.GRAVITY_EARTH; 

     // gForce will be close to 1 when there is no movement. 
     Float f = new Float(gX * gX + gY * gY + gZ * gZ); 
     Double d = Math.sqrt(f.doubleValue()); 
     float gForce = d.floatValue(); 

     if (gForce > SHAKE_THRESHOLD_GRAVITY) { 
      final long now = System.currentTimeMillis(); 
      // ignore shake events too close to each other (500ms) 
      if (mShakeTimestamp + SHAKE_SLOP_TIME_MS > now) { 
       return; 
      } 

      // reset the shake count after 3 seconds of no shakes 
      if (mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now) { 
       mShakeCount = 0; 
      } 

      mShakeTimestamp = now; 
      mShakeCount++; 

      mListener.onShake(mShakeCount); 
     } 
    } 
} 
} 

홈페이지 Acitivty

public class MainActivity extends AppCompatActivity { 

// The following are used for the shake detection 
private SensorManager mSensorManager; 
private Sensor mAccelerometer; 
private ShakeDetector mShakeDetector; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent intent = new Intent(MainActivity.this, ShakeService.class); 
    startService(intent); 

    // ShakeDetector initialization 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mAccelerometer = mSensorManager 
      .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    mShakeDetector = new ShakeDetector(); 
    mShakeDetector.setOnShakeListener(new ShakeDetector.OnShakeListener() { 

     @Override 
     public void onShake(int count) { 
      Toast.makeText(getApplicationContext(), "shake",Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    // Add the following line to register the Session Manager Listener onResume 
    mSensorManager.registerListener(mShakeDetector, mAccelerometer, SensorManager.SENSOR_DELAY_UI); 
} 

@Override 
public void onPause() { 
    // Add the following line to unregister the Sensor Manager onPause 
    mSensorManager.unregisterListener(mShakeDetector); 
    super.onPause(); 
} 

}

흔들어 서비스

0123에 대한 링크입니다
public class ShakeService extends Service { 

private SensorManager mSensorManager; 
private Sensor mAccelerometer; 
private ShakeDetector mShakeDetector; 

public ShakeService() { 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO: Return the communication channel to the service. 
    throw new UnsupportedOperationException("Not yet implemented"); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    // ShakeDetector initialization 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mAccelerometer = mSensorManager 
      .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    mShakeDetector = new ShakeDetector(); 
    mShakeDetector.setOnShakeListener(new ShakeDetector.OnShakeListener() { 

     @Override 
     public void onShake(int count) { 

      Intent i = getApplicationContext().getPackageManager().getLaunchIntentForPackage("com.facebook.katana"); 
      getApplicationContext().startActivity(i); 

     } 
    }); 
    mSensorManager.registerListener(mShakeDetector, mAccelerometer, SensorManager.SENSOR_DELAY_UI); 
} 

@Override 
public void onDestroy() { 
    mSensorManager.unregisterListener(mShakeDetector); 
    super.onDestroy(); 
} 

} 당신은 스레드를 사용할 필요가

+0

서비스가 잘못되었습니다. 오류가 있었습니까? –

+0

실제로 작동합니다. 그러나 휴대 전화가 잠겨 있어도이 기능을 사용하고 싶습니다. – Julia

+0

휴대 전화가 잠겨있을 때 실제로 서비스가 실행 중이지만 휴대 전화를 흔들면 화면이 꺼져 있기 때문에 활동이 시작되지 않습니다. [이 질문] (http://stackoverflow.com/questions/20113161/start-activity-screen-even-if-screen-is-locked-in-android)에서 약을 가지고 활동을 시작하는 방법을 찾으십시오 화면이 꺼져있을 때. –

답변