android中使用百度定位sdk实时的计算移动距离,面试阿里P7岗

本文作者分享了自己在突然失业后求职的经历,特别是在Android开发中使用百度定位SDK实时计算移动距离的经验,以及面试阿里巴巴P7岗位的心得。文中详细介绍了如何在服务中实现定位并计算距离,还提到了数据库操作和面试技巧的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。公司开始第二波裁员,我决定主动拿赔偿走人。后续的面试过程我做了一些准备,基本都能走到hr面,后面我也顺利地拿到了offer,我给大家分享下我的求职体会,希望能给大家一些参考。

  1. import java.util.concurrent.Executors;

  2. import android.app.Service;

  3. import android.content.Intent;

  4. import android.os.IBinder;

  5. import app.db.DistanceInfoDao;

  6. import app.model.GpsLocation;

  7. import app.model.DistanceInfo;

  8. import app.ui.MyApplication;

  9. import app.utils.BDLocation2GpsUtil;

  10. import app.utils.FileUtils;

  11. import app.utils.LogUtil;

  12. import com.baidu.location.BDLocation;

  13. import com.baidu.location.BDLocationListener;

  14. import com.baidu.location.LocationClient;

  15. import com.baidu.location.LocationClientOption;

  16. import com.computedistance.DistanceComputeInterface;

  17. import com.computedistance.impl.DistanceComputeImpl;

  18. public class LocationService extends Service {

  19. public static final String FILE_NAME = “log.txt”;                       //日志

  20. LocationClient mLocClient;

  21. private Object lock = new Object();

  22. private volatile GpsLocation prevGpsLocation = new GpsLocation();       //定位数据

  23. private volatile GpsLocation currentGpsLocation = new GpsLocation();

  24. private MyLocationListenner myListener = new MyLocationListenner();

  25. private volatile int discard = 1;   //Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。

  26. private DistanceInfoDao mDistanceInfoDao;

  27. private ExecutorService executor = Executors.newSingleThreadExecutor();

  28. @Override

  29. public IBinder onBind(Intent intent) {

  30. return null;

  31. }

  32. @Override

  33. public void onCreate() {

  34. super.onCreate();

  35. mDistanceInfoDao = new DistanceInfoDao(this);   //初始化数据库

  36. //LogUtil.info(LocationService.class, “Thread id ----------->:” + Thread.currentThread().getId());

  37. mLocClient = new LocationClient(this);

  38. mLocClient.registerLocationListener(myListener);

  39. //定位参数设置

  40. LocationClientOption option = new LocationClientOption();

  41. option.setCoorType(“bd09ll”); //返回的定位结果是百度经纬度,默认值gcj02

  42. option.setAddrType(“all”);    //返回的定位结果包含地址信息

  43. option.setScanSpan(5000);     //设置发起定位请求的间隔时间为5000ms

  44. option.disableCache(true);    //禁止启用缓存定位

  45. option.setProdName(“app.ui.activity”);

  46. option.setOpenGps(true);

  47. option.setPriority(LocationClientOption.GpsFirst);  //设置GPS优先

  48. mLocClient.setLocOption(option);

  49. mLocClient.start();

  50. mLocClient.requestLocation();

  51. }

  52. @Override

  53. @Deprecated

  54. public void onStart(Intent intent, int startId) {

  55. super.onStart(intent, startId);

  56. }

  57. @Override

  58. public void onDestroy() {

  59. super.onDestroy();

  60. if (null != mLocClient) {

  61. mLocClient.stop();

  62. }

  63. startService(new Intent(this, LocationService.class));

  64. }

  65. private class Task implements Callable{

  66. private BDLocation location;

  67. public Task(BDLocation location){

  68. this.location = location;

  69. }

  70. /**

  71. * 检测是否在原地不动

  72. *

  73. * @param distance

  74. * @return

  75. */

  76. private boolean noMove(float distance){

  77. if (distance < 0.01) {

  78. return true;

  79. }

  80. return false;

  81. }

  82. /**

  83. * 检测是否在正确的移动

  84. *

  85. * @param distance

  86. * @return

  87. */

  88. private boolean checkProperMove(float distance){

  89. if(distance <= 0.1 * discard){

  90. return true;

  91. }else{

  92. return false;

  93. }

  94. }

  95. /**

  96. * 检测获取的数据是否是正常的

  97. *

  98. * @param location

  99. * @return

  100. */

  101. private boolean checkProperLocation(BDLocation location){

  102. if (location != null && location.getLatitude() != 0 && location.getLongitude() != 0){

  103. return true;

  104. }

  105. return false;

  106. }

  107. @Override

  108. public String call() throws Exception {

  109. synchronized (lock) {

  110. if (!checkProperLocation(location)){

  111. LogUtil.info(LocationService.class, “location data is null”);

  112. discard++;

  113. return null;

  114. }

  115. if (MyApplication.orderDealInfoId != -1) {

  116. DistanceInfo mDistanceInfo = mDistanceInfoDao.getById(MyApplication.orderDealInfoId);   //根据MainActivity中赋值的全局id查询数据库的值

  117. if(mDistanceInfo != null)       //不为空则说明车已经开始行使,并可以获得经纬度,计算移动距离

  118. {

  119. LogUtil.info(LocationService.class, “行驶中…”);

  120. GpsLocation tempGpsLocation = BDLocation2GpsUtil.convertWithBaiduAPI(location);     //位置转换

  121. if (tempGpsLocation != null) {

  122. currentGpsLocation = tempGpsLocation;

  123. }else{

  124. discard ++;

  125. }

  126. //日志

  127. String logMsg = “(plat:—>” + prevGpsLocation.lat + "  plgt:—>" + prevGpsLocation.lng +“)\n” +

  128. “(clat:—>” + currentGpsLocation.lat + "  clgt:—>" + currentGpsLocation.lng + “)”;

  129. LogUtil.info(LocationService.class, logMsg);

  130. /** 计算距离  */

  131. float distance = 0.0f;

  132. DistanceComputeInterface distanceComputeInterface = DistanceComputeImpl.getInstance();  //计算距离类对象

  133. distance = (float) distanceComputeInterface.getLongDistance(prevGpsLocation.lat,prevGpsLocation.lng,

  134. currentGpsLocation.lat,currentGpsLocation.lng);     //移动距离计算

  135. if (!noMove(distance)) {                //是否在移动

  136. if (checkProperMove(distance)) {    //合理的移动

  137. float drivedDistance = mDistanceInfo.getDistance();

  138. mDistanceInfo.setDistance(distance + drivedDistance); //拿到数据库原始距离值, 加上当前值

  139. mDistanceInfo.setLongitude(currentGpsLocation.lng);   //经度

  140. mDistanceInfo.setLatitude(currentGpsLocation.lat);    //纬度

  141. //日志记录

  142. FileUtils.saveToSDCard(FILE_NAME,“移动距离—>:”+distance+drivedDistance+“\n”+“数据库中保存的距离”+mDistanceInfo.getDistance());

  143. mDistanceInfoDao.updateDistance(mDistanceInfo);

  144. discard = 1;

  145. }

  146. }

  147. prevGpsLocation = currentGpsLocation;

  148. }

  149. }

  150. return null;

  151. }

  152. }

  153. }

  154. /**

  155. * 定位SDK监听函数

  156. */

  157. public class MyLocationListenner implements BDLocationListener {

  158. @Override

  159. public void onReceiveLocation(BDLocation location) {

  160. executor.submit(new Task(location));

  161. LogUtil.info(LocationService.class, “经度:”+location.getLongitude());

  162. LogUtil.info(LocationService.class, “纬度:”+location.getLatitude());

  163. //将经纬度保存于全局变量,在MainActivity中点击按钮时初始化数据库字段

  164. if(MyApplication.lng <=0 && MyApplication.lat <= 0)

  165. {

  166. MyApplication.lng = location.getLongitude();

  167. MyApplication.lat = location.getLatitude();

  168. }

  169. }

  170. public void onReceivePoi(BDLocation poiLocation) {

  171. if (poiLocation == null){

  172. return ;

  173. }

  174. }

  175. }

  176. }

以下是应用中需要使用的DBOpenHelper数据库类 DBOpenHelper.java

[java]  [view plain](() [copy](() [print](() [?](() [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLeD1lFO-1649750533997)(https://code.youkuaiyun.com/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zibunNDe-1649750533998)(https://code.youkuaiyun.com/assets/ico_fork.svg)]

  1. package app.db;

  2. import android.content.Context;

  3. import android.database.sqlite.SQLiteDatabase;

  4. import android.database.sqlite.SQLiteOpenHelper;

  5. public class DBOpenHelper extends SQLiteOpenHelper{

  6. private static final int VERSION = 1;                   //数据库版本号

  7. private static final String DB_NAME = “distance.db”;    //数据库名

  8. public DBOpenHelper(Context context){                   //创建数据库

  9. super(context, DB_NAME, null, VERSION);

  10. }

  11. @Override

  12. public void onCreate(SQLiteDatabase db) {               //创建数据表

  13. db.execSQL(“CREATE TABLE IF NOT EXISTS milestone(id INTEGER PRIMARY KEY AUTOINCREMENT, distance INTEGER,longitude DOUBLE, latitude DOUBLE )”);

  14. }

  15. @Override

  16. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  //版本号发生改变的时

  17. db.execSQL(“drop table milestone”);

  18. db.execSQL(“CREATE TABLE IF NOT EXISTS milestone(id INTEGER PRIMARY KEY AUTOINCREMENT, distance INTEGER,longitude FLOAT, latitude FLOAT )”);

  19. }

  20. }

以下是应用中需要使用的数据库业务逻辑封装类 DistanceInfoDao.java

[java]  [view plain](() [copy](() [print](() [?](() [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C1FZTG5p-1649750533998)(https://code.youkuaiyun.com/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8IHzXaSM-1649750533999)(https://code.youkuaiyun.com/assets/ico_fork.svg)]

  1. package app.db;

  2. import android.content.Context;

  3. import android.database.Cursor;

  4. import android.database.sqlite.SQLiteDatabase;

  5. import app.model.DistanceInfo;

  6. import app.utils.LogUtil;

  7. public class DistanceInfoDao {

  8. private DBOpenHelper helper;

  9. private SQLiteDatabase db;

  10. public DistanceInfoDao(Context context) {

  11. helper = new DBOpenHelper(context);

  12. }

  13. public void insert(DistanceInfo mDistanceInfo) {

  14. if (mDistanceInfo == null) {

  15. return;

  16. }

  17. db = helper.getWritableDatabase();

  18. String sql = “INSERT INTO milestone(distance,longitude,latitude) VALUES('”+ mDistanceInfo.getDistance() + “‘,’”+ mDistanceInfo.getLongitude() + “‘,’”+ mDistanceInfo.getLatitude() + “')”;

  19. LogUtil.info(DistanceInfoDao.class, sql);

  20. db.execSQL(sql);

  21. db.close();

  22. }

  23. public int getMaxId() {

  24. db = helper.getReadableDatabase();

  25. Cursor cursor = db.rawQuery(“SELECT MAX(id) as id from milestone”,null);

  26. if (cursor.moveToFirst()) {

  27. return cursor.getInt(cursor.getColumnIndex(“id”));

  28. }

  29. return -1;

  30. }

  31. /**

  32. * 添加数据

  33. * @param orderDealInfo

  34. * @return

  35. */

  36. public synchronized int insertAndGet(DistanceInfo mDistanceInfo) {

  37. int result = -1;

  38. insert(mDistanceInfo);

  39. result = getMaxId();

  40. return result;

  41. }

  42. /**

  43. * 根据id获取

  44. * @param id

  45. * @return

  46. */

  47. public DistanceInfo getById(int id) {

  48. db = helper.getReadableDatabase();

  49. Cursor cursor = db.rawQuery(“SELECT * from milestone WHERE id = ?”,new String[] { String.valueOf(id) });

  50. DistanceInfo mDistanceInfo = null;

  51. if (cursor.moveToFirst()) {

  52. mDistanceInfo = new DistanceInfo();

  53. mDistanceInfo.setId(cursor.getInt(cursor.getColumnIndex(“id”)));

  54. mDistanceInfo.setDistance(cursor.getFloat(cursor.getColumnIndex(“distance”)));

  55. mDistanceInfo.setLongitude(cursor.getFloat(cursor.getColumnIndex(“longitude”)));

  56. mDistanceInfo.setLatitude(cursor.getFloat(cursor.getColumnIndex(“latitude”)));

  57. }

  58. cursor.close();

  59. db.close();

  60. return mDistanceInfo;

  61. }

  62. /**

  63. * 更新距离

  64. * @param orderDealInfo

  65. */

  66. public void updateDistance(DistanceInfo mDistanceInfo) {

  67. if (mDistanceInfo == null) {

  68. return;

  69. }

  70. db = helper.getWritableDatabase();

  71. String sql = “update milestone set distance=”+ mDistanceInfo.getDistance() +“,longitude=”+mDistanceInfo.getLongitude()+“,latitude=”+mDistanceInfo.getLatitude()+" where id = "+ mDistanceInfo.getId();

  72. LogUtil.info(DistanceInfoDao.class, sql);

  73. db.execSQL(sql);

  74. db.close();

  75. }

  76. }

以下是需要使用到的实体类 DistanceInfo.java (set数据到对应变量,以实体类作为参数更新数据库)

[java]  [view plain](() [copy](() [print](() [?](() [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3oBu6AMv-1649750534000)(https://code.youkuaiyun.com/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PjJa8XaG-1649750534000)(https://code.youkuaiyun.com/assets/ico_fork.svg)]

  1. package app.model;

  2. public class DistanceInfo {

  3. private int id;

  4. private float distance;

  5. private double longitude;

  6. private double latitude;

  7. public int getId() {

  8. return id;

  9. }

  10. public void setId(int id) {

文末

那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。
Android希望=技能+面试

  • 技能
  • 面试技巧+面试题
  1. package app.model;

  2. public class DistanceInfo {

  3. private int id;

  4. private float distance;

  5. private double longitude;

  6. private double latitude;

  7. public int getId() {

  8. return id;

  9. }

  10. public void setId(int id) {

文末

那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。
Android希望=技能+面试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值