0

MainActivity.java

    package com.example.background_shake;

import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;


public class MainActivity extends Activity implements OnClickListener {
    Button ON,OFF;
private SensorManager sensorManager;
private long lastUpdate;

Intent i1;
public static final String TAG = "ServicesDemo";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    //reseting the window propertys
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    //super method
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ON=(Button)findViewById(R.id.ON);
    OFF=(Button)findViewById(R.id.OFF);
    ON.setOnClickListener(this);
    OFF.setOnClickListener(this);
}
public void onClick(View src) {
    switch (src.getId()) {
    case R.id.ON:
      Log.d(TAG, "onClick: starting srvice");
      startService(new Intent(this, Background_service.class));
      break;
    case R.id.OFF:
      Log.d(TAG, "onClick: stopping srvice");
      stopService(new Intent(this, Background_service.class));
      break;
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
  }

Background_service.java

    package com.example.background_shake;

import java.util.List;
import java.util.Locale;
import android.app.Service;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Address;
import android.location.Geocoder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class Background_service extends Service implements SensorEventListener{
    boolean flag=false;
    private long lastUpdate;
    SensorManager sensorManager;
            int count=0;
@Override
public IBinder onBind(Intent intent) {

    return null;
}
public void onCreate()
{
    flag=true;
    Log.d(MainActivity.TAG, "onCreate");
    super.onCreate();

}
public void onDestroy() {

    flag=false;
    Log.d(MainActivity.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];
    double latitude=0;
    double longitude=0;
    String location_message;
    GPSTracker gps;

    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;
      }

      lastUpdate = actualTime;

      {
          gps=new GPSTracker(Background_service.this);
          if((gps.canGetLocation())&&(count==3)){
                      count=0;    
              latitude = gps.getLatitude();
              longitude = gps.getLongitude();
        //  \n is for new line
        //  Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();    
              Geocoder gcd = new Geocoder(Background_service.this, Locale.getDefault());
              try{
                  List<Address> addresses = gcd.getFromLocation(latitude, longitude, 1);
                  location_message= addresses.get(0).getLocality();
                  if ((addresses.size() > 0)&&(flag))
                  {
                      Toast.makeText(getApplicationContext(), "Your Location is " +addresses.get(0).getLocality()
                              , Toast.LENGTH_LONG).show();
                                      count=0;
                  }

              }catch(Exception e)
              {
                  System.out.print(e);
              }
          }else{
        //  can't get location
        //  GPS or Network is not enabled
        // Ask user to enable GPS/network in settings
        Toast.makeText(getApplicationContext(), "Switch on gps"
                , Toast.LENGTH_LONG).show();
        gps.showSettingsAlert();
    }}


      /*Toast.makeText(this, "Device was shuffed", Toast.LENGTH_SHORT)
          .show();
      if (color) {
        view.setBackgroundColor(Color.GREEN);

      } else {
        view.setBackgroundColor(Color.RED);
      }*/

    }}
  }
public void onSensorChanged(SensorEvent event) {

    getAccelerometer(event);


}
protected void onResume() {
    //super.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);

}

}

上記のコードは、振動パラメーターを感知して現在地を提供するアプリ用です。しかし問題は、GPS がオフになっているにもかかわらず、現在地を取得していることです。

また、私は 2 つのことを知りたいです。2. モバイルを 1 回振るとアプリから出力が得られますが、アプリを 3 ~ 4 回連続して振った場合にのみ目的の結果が得られるようにしたいのですが、それは可能ですか?

4

2 に答える 2

3

質問に答えるには: 1. 電話をロックしてもサービスは機能しますか? いいえの場合、サービスが機能するためにコードにどのような変更を加える必要がありますか?

はい、サービスが起動されると無限に実行され続けますが、電話のスイッチがオフになっていて、電話が起動するとすぐにサービスを開始したい場合は、起動時にトリガーされるブロードキャストレシーバーを作成してみてください

public class Broadcastreceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent startSMSServiceIntent = new Intent(context, SOMEservice.class);
        context.startService(startSMSServiceIntent);
    }
}

マニフェストで

<receiver android:name=".Broadcastreceiver">             
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />  
    </intent-filter>         
</receiver>

権限を忘れないでください

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
于 2013-03-19T06:17:45.590 に答える
0

Q1はすでにakajaymoによってここで答えられています。

Q2の場合、電話を振るたびにアプリで目的の出力を生成する代わりに、2つの静的変数int countとを作成しますlong last

電話を振るたびに、カウントを増やすかどうかを確認し、振る場合(System.currentTimeMillis() - last) < 1000/* considering the shakes are not more than 1 second apart */はカウントを増やします。

count3または4に達すると、完了です。目的の出力を生成するだけです。そうでない場合は、何も生成しません。

揺れが1000ms以上離れている場合は、count1に設定してください。

また、揺れを検出するたびに、を作成しlast = System.currentTimeMillis()ます。この最後への更新は、私が言及した最初のチェックのに行う必要があります。

于 2013-03-19T09:51:54.700 に答える