最新在做Android开发,项目需求很简单,不需要任何界面,在后台定时定位,将定位数据发送到指定的服务内,进行存储。 好久不做Android开发,对代码了解也减退了不少,通过度娘、Google等查找了些代码,使用Android自带的GPS定位,总是获取到NULL,始终获取不到具体的经纬度信息,通过Q群内的朋友了解到,建议用百度定位包(定位开发包下载,官方定位示例代码)。
废话不多说,直接进入正题: 首先新建工程,设置默认的启动页面Activity,最新版Android SDK默认必须有Activity,我们在Activity中进行启动服务,然后将页面关闭。 在onCreate方法内添加如下代码
[java]Intent startIntent = new Intent(MainActivity.this, services.class);
startService(startIntent);
finish();
[/java]
在新建一个类集成Service,用来做后台服务,我这里用了一个定时器,每隔一个小时定位一次位置 使用TimerTask() 启动服务时,会调用Service内的 onCreate - >onStartCommand,所以在onCreate内预先定义百度定位数据配置
[java] locationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
locationClient.registerLocationListener(myListener); // 注册监听函数
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
option.setPriority(LocationClientOption.NetWorkFirst); // 设置定位优先级
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
locationClient.setLocOption(option);
[/java]
在onStartCommand内进行启动定时器
[java]if (!isStop) {
//Log.i("K", "开始服务");
startTimer();
}
[/java]
在服务被销毁时(onDestroy)停止定时器
[java]locationClient.stop();
super.onDestroy();
// 停止定时器
if (isStop) {
Log.i("T", "服务停止");
stopTimer();
}
[/java]
定时方法代码如下:
[java]private void startTimer() {
if (mTimer == null) {
mTimer = new Timer();
}
//Log.i(TAG, "count: " + String.valueOf(count++));
isStop = true;
if (mTimerTask == null) {
mTimerTask = new TimerTask() {
@Override
public void run() {
//Log.i(TAG, "count: " + String.valueOf(count++));
do {
try {
locationClient.start();
if (locationClient != null
&& locationClient.isStarted())
locationClient.requestLocation();
else
//Log.d("LocSDK3","locClient is null or not started");
Thread.sleep(10000*60*60);//暂停1小时
} catch (InterruptedException e) {
}
} while (isStop);
}
};
}
if (mTimer != null && mTimerTask != null)
mTimer.schedule(mTimerTask, delay, period);
}
[/java]
其他的代码 请下载源码包查看,其实很简单,但是很容易犯错误,这里我把我所遇到的问题讲解下,希望对大家有帮助
1、使用百度定位SDK一定不要忘记注册监听器"locationClient.registerLocationListener(myListener); // 注册监听函数"
2、记得在Activity内启动你写的服务"startService(startIntent);
3、向AndroidManifest.xml中注册Service服务和响应的权限"<service android:name="com.ruanman.sfdw.services"></service>"
4、这是我犯的错误,搞了2天才找到问题,就是还要启动百度定位服务"locationClient.start();"
剩下的问题大家在遇到时可以回复本贴,一起讨论,老鸟请无视飘过
源码包下载地址:http://pan.baidu.com/s/1ntHOQwT