Код Activity
Код: Выделить всё
public class GPSSampleActivity extends Activity implements OnClickListener {
private LocationManager myManager;
private Button btnOn;
private Button btnOff;
private Button btnLog;
private TextView tvLog;
private TextView tvServiceStatus;
private Location falseLocation;
private File fileName=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnOn = (Button) findViewById(R.id.btnOn);
btnOn.setOnClickListener(this);
btnOff = (Button) findViewById(R.id.btnOff);
btnOff.setOnClickListener(this);
btnLog = (Button) findViewById(R.id.btnLog);
btnLog.setOnClickListener(this);
tvLog = (TextView) findViewById(R.id.tvLog);
tvServiceStatus = (TextView) findViewById(R.id.tvServiceStatus);
createLogFile();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnOn:
startService(new Intent(GPSSampleActivity.this,GPSService.class));
tvServiceStatus.setText("Сервис запущен");
break;
case R.id.btnOff:
stopService(new Intent(GPSSampleActivity.this,GPSService.class));
tvServiceStatus.setText("Сервис остановлен");
break;
case R.id.btnLog:
try {
readLog();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
public void onStop() {
super.onStop();
stopService(new Intent(GPSSampleActivity.this,GPSService.class));
tvServiceStatus.setText("Сервис остановлен");
}
public void onDestroy() {
super.onDestroy();
stopService(new Intent(GPSSampleActivity.this,GPSService.class));
tvServiceStatus.setText("Сервис остановлен");
}
...
}
Код: Выделить всё
public class GPSService extends Service implements LocationListener {
private LocationManager locationManager;
private final int TIME_OUT_SEC = 10;
private File fileName=null;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this,"Сервис запущен.", Toast.LENGTH_LONG).show();
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 1, this);
}
@Override
public void onDestroy() {
Toast.makeText(this, "Сервис остановлен.", Toast.LENGTH_LONG).show();
locationManager.removeUpdates(this);
super.onDestroy();
}
@Override
public void onLocationChanged(Location location) {
if (location!=null) {
try {
postData(location);
} catch (FileNotFoundException e) {
writeData(" <FileNotFoundException in onLocationChanged()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
e.printStackTrace();
} catch (IOException e) {
writeData(" <IOException in onLocationChanged()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
e.printStackTrace();
}
}
}
public void postData(Location location) throws IOException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://example.ru/location/");
final HttpParams httpParameters = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, TIME_OUT_SEC * 1000);
HttpConnectionParams.setSoTimeout(httpParameters, TIME_OUT_SEC * 1000);
try {
httppost.setEntity(new UrlEncodedFormEntity(getPostData(location)));
HttpResponse response = httpclient.execute(httppost);
String sb = String.valueOf(response.getStatusLine().getStatusCode());
writeData(" <Code from server="+sb.toString()+ " "+ java.util.Calendar.getInstance ().getTime()+"/>");
} catch (ClientProtocolException e) {
writeData(" <ClientProtocolException in postData()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
e.printStackTrace();
} catch (IOException e) {
writeData(" <IOException in postData()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
e.printStackTrace();
}
}
private List<NameValuePair> getPostData(Location location) {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("latitude", String.valueOf(location.getLatitude())));
nameValuePairs.add(new BasicNameValuePair("longitude", String.valueOf(location.getLongitude())));
nameValuePairs.add(new BasicNameValuePair("speed", String.valueOf(location.getSpeed())));
return nameValuePairs;
}
private void writeData(String sData) {
fileName = null;
File directory = null;
String sdState = android.os.Environment.getExternalStorageState();
if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
File sdDir = android.os.Environment.getExternalStorageDirectory();
directory = new File(sdDir, "cache");
} else {
directory = this.getCacheDir();
}
if (!directory.exists()) directory.mkdirs();
fileName = new File(directory, "GpsDataLog.txt");
try {
FileWriter f = new FileWriter(fileName, true);
f.write("\n"+sData+"\n");
f.flush();
f.close();
} catch (Exception e) {
Toast.makeText(this, "Не удалось произвести запись в лог!", Toast.LENGTH_LONG).show();
Log.d("myLogs", fileName.toString() + " ошибка создания лога = " + e.getMessage());
}
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
}
}
1. Что я не так делаю, что программа падает в произвольный момент времени?
2. Как сделать логгирование данных при падении приложения, когда программа падает на реальном устройстве? В эмуляторе понятно, там на консоль выводится лог. А вот с реальным устройством никак не могу понять как узнать из-за чего приложение упало.
3. Как при падении приложения убивать сервис, чтобы он не оставался в системе работать?
Заранее спасибо.