最新の GPS 座標を取得し、PHP スクリプトを介してサーバーに投稿するバックグラウンド サービスを実行しようとしています。
これは、情報をサーバーに投稿するという意味で機能しており、バックグラウンドで(サービスとして)そうします。
以下のスニペットでは、常に false (location == null) です。
私は Java プログラミングが初めてで、これを正しく行っているとは思いません。GPS の更新があるたびに更新する変数を用意し、それをバックグラウンド サービスから読み取る必要がありますか?
GPS 機能をこの Service クラスとは別にして、データが必要なときに呼び出す必要がありますか? または、 AsyncTask を使用する必要がありますか?
質問が初心者で申し訳ありませんが、Java は PHP に比べてかなり複雑です。
ありがとうございました。
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
String Long = null;
String Lat = null;
if (location != null) {
Long = String.format("%1$s",location.getLongitude());
Lat = String.format("%1$s", location.getLatitude());
}
else{
Long = "error";
Lat = "error";
}
以下は完全なコードです。
public class UpdaterService extends Service {
private static final String TAG = UpdaterService.class.getSimpleName();
private Updater updater;
private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds
protected LocationManager locationManager;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
updater = new Updater();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MINIMUM_TIME_BETWEEN_UPDATES,
MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
new MyLocationListener()
);
Log.d(TAG, "onCreate'd");
}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location location) {
}
public void onStatusChanged(String s, int i, Bundle b) {
}
public void onProviderDisabled(String s) {
}
public void onProviderEnabled(String s) {
}
}
@Override
public synchronized void onStart(Intent intent, int startId) {
// Start the updater
if (!updater.isRunning()) {
updater.start();
}
Log.d(TAG, "onStart'd");
}
@Override
public synchronized void onDestroy() {
super.onDestroy();
// Stop the updater
if (updater.isRunning()) {
updater.interrupt();
}
updater = null;
Log.d(TAG, "onDestroy'd");
}
// ///// Updater Thread
class Updater extends Thread {
private static final long DELAY = 10000; // one minute
private boolean isRunning = false;
public Updater() {
super("Updater");
}
@Override
public void run() {
isRunning = true;
while (isRunning) {
try {
Log.d(TAG, "Updater run'ing");
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.mydomain.com/save.php");
try {
// Add your data
Log.d(TAG, "Working..");
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
String Long = null;
String Lat = null;
if (location != null) {
Long = String.format("%1$s",location.getLongitude());
Lat = String.format("%1$s", location.getLatitude());
}
else{
Long = "error";
Lat = "error";
}
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
nameValuePairs.add(new BasicNameValuePair("lid", "1"));
nameValuePairs.add(new BasicNameValuePair("lat",Lat));
nameValuePairs.add(new BasicNameValuePair("long", Long));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
// Sleep
Thread.sleep(DELAY);
} catch (InterruptedException e) {
// Interrupted
isRunning = false;
}
} // while
}
public boolean isRunning() {
return this.isRunning;
}
}
}
以下は主なアクティビティです。
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStop() {
super.onStop();
}
// /////// Menu Stuff
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.itemPrefs:
// startService(new Intent(this, UpdaterService.class));
break;
case R.id.itemServiceStart:
startService(new Intent(this, UpdaterService.class));
break;
case R.id.itemServiceStop:
stopService(new Intent(this, UpdaterService.class));
break;
}
return true;
}
}