0

私はセンサーについてのチュートリアルに従おうとしています。アクティビティでうまく動作します。しかし、私は電話がロックされているときにこれをバックグラウンドで動作させたい。それを行う最善の方法は何ですか?Androidセンサーをバックグラウンドで振る

ここでチュートリアル 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)で戦利品を手に入れて、活動を開始する方法を見つけてください画面がオフのとき –

答えて

関連する問題