我正在研究Android软件中的一个问题,即在后台将设备的位置记录到日志文件中。代码是这样的:
package com.otpc.auto;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
public class LocationUpdate extends Service {
private String TAG = "LocationUpdate";
private LocationManager loc;
private class CustomLocationListener implements LocationListener {
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
public void onLocationChanged(Location location) {
writeLocationData(location);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Location Update service has been started", Toast.LENGTH_SHORT).show();
loc = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
loc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60 * 60 * 1000, 100,
new CustomLocationListener(),
Looper.myLooper());
loc.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60 * 60 * 1000, 100,
new CustomLocationListener(),
Looper.myLooper());
return Service.START_STICKY;
}
private void writeLocationData(Location location){
final double latitude = location.getLatitude();
final double lon = location.getLongitude();
new Thread(){
public void run() {
try {
FileOutputStream latitudeFile = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/latitude.txt");
latitudeFile.write(String.valueOf(latitude).getBytes());
latitudeFile.close();
FileOutputStream longitudeFile = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/longitude.txt");
longitudeFile.write(String.valueOf(lon).getBytes());
longitudeFile.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
}
将此注册为启动服务后,其他应用程序将无法再使用GPS服务。使用GPS测试仪应用程序测试GPS会产生结果,就像设备没有GPS一样。只有在我们从设备中删除此应用程序后,GPS才会恢复正常运行。
上述代码有什么问题。我不是Android的专家,但从我看来,我无法发现代码中的任何异常。
感谢。
答案 0 :(得分:0)
我不记得究竟是什么原因,但我之前遇到过这个问题。我认为问题在于所请求的更新频率比设备可以处理的更高(或者更低)。尝试使用您的请求中的数字,看看情况是否有所改善。
答案 1 :(得分:0)
在注册位置回调时尝试删除Looper.myLooper()
:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Location Update service has been started", Toast.LENGTH_SHORT).show();
loc = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
loc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60 * 60 * 1000, 100,
new CustomLocationListener());
loc.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60 * 60 * 1000, 100,
new CustomLocationListener());
return Service.START_STICKY;
}
如果您注册Looper.myLooper()
,那么您正在注册调用onStartCommand()
的系统线程,以使用其消息队列来实现回调机制,这可能会在后台引发问题。