Android基於高德地圖實時定位服務
Service功能有:實時定位(後臺進行)
Service不會,去百度谷歌
功能有
實時定位(30秒間隔)
判斷是否在規定的時間段內
判斷距離是否大於規定的距離
判斷服務是否在開啟的狀態
服務程式碼:LocationService(Android Studio 2.3環境下)
實時定位(30秒間隔)
判斷是否在規定的時間段內
判斷距離是否大於規定的距離
這三個功能我都寫在了一個裡面,具體可以分類,看自己選擇了
package zph.zhjx.com.chat.service;
import android.app.Notification;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.text.format.Time;
import android.util.Log;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMapUtils;
import com.amap.api.maps2d.model.LatLng;
import java.util.Timer;
import java.util.TimerTask;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import zph.zhjx.com.chat.bean.Message_01;
import zph.zhjx.com.chat.contact.Contact;
import zph.zhjx.com.chat.imp.BeanImp;
import zph.zhjx.com.chat.util.DBUtil;
public class LocationService extends Service {
public final String TAG="LocationService";
private AMapLocationClient locationClient = null;
private AMapLocationClientOption locationOption = new AMapLocationClientOption();
private Timer mTimer;
private LatLng last_latlng;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Notification noti = new Notification();
noti.flags = Notification.FLAG_NO_CLEAR|Notification.FLAG_ONGOING_EVENT;
startForeground(1, noti);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mTimer = new Timer();
TimerTask task = new TimerTask(){
@Override
public void run() {
initLocation();
locationClient.startLocation();
}};
mTimer.scheduleAtFixedRate(task, 0, 30*1000);
// flags = START_STICKY;
return START_STICKY;
}
@Override
public void onDestroy() {
// Toast.makeText(getApplicationContext(), "onDestroy", 0).show();
if(locationClient!=null){
locationClient.stopLocation();
destroyLocation();
}
if(null!=mTimer){
mTimer.cancel();
}
super.onDestroy();
}
private void initLocation(){
if(locationClient==null){
//初始化client
locationClient = new AMapLocationClient(this.getApplicationContext());
}
//初始化定位引數
initLocationOption();
//設定定位引數
locationClient.setLocationOption(locationOption);
// 設定定位監聽
locationClient.setLocationListener(locationListener);
}
private void initLocationOption() {
if (null == locationOption) {
locationOption = new AMapLocationClientOption();
}
//定位精度:高精度模式
locationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//設定定位快取策略
locationOption.setLocationCacheEnable(false);
//gps定位優先
locationOption.setGpsFirst(false);
//設定定位間隔
// locationOption.setInterval(3000);
locationOption.setNeedAddress(true);//可選,設定是否返回逆地理地址資訊。預設是ture
locationOption.setOnceLocation(true);//可選,設定是否單次定位。預設是false
locationOption.setOnceLocationLatest(true);//true表示獲取最近3s內精度最高的一次定位結果;false表示使用預設的連續定位策略。
locationOption.setOnceLocationLatest(false);//可選,設定是否等待wifi重新整理,預設為false.如果設定為true,會自動變為單次定位,持續定位時不要使用
//AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);//可選, 設定網路請求的協議。可選HTTP或者HTTPS。預設為HTTP
}
/**
* 定位監聽
*/
AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation loc) {
if (null != loc) {//定位成功
// Toast.makeText(getApplicationContext(), loc.getLatitude()+"---"+loc.getLongitude(),0).show();
Log.i(TAG,"定位成功");
Log.i(TAG,"定位的經度位置是:"+loc.getLatitude());
Log.i(TAG,"定位的維度位置是:"+loc.getLongitude());
Log.i(TAG,"使用者是:"+ DBUtil.getUserMessage().getPhone());
if(isCurrentInTimeScope()) {
UpDate(loc);
}
} else {//定位失敗
Log.i(TAG,"定位失敗");
}
locationClient.stopLocation();
destroyLocation();
}
};
/**上傳更新*/
private void UpDate(AMapLocation loc) {
final LatLng newlatlng=new LatLng(loc.getLatitude(),loc.getLongitude());
BeanImp repo1;
Retrofit retrofit1 = new Retrofit.Builder()
.baseUrl(Contact.Track_Interface)
.addConverterFactory(GsonConverterFactory.create())
.build();
repo1=retrofit1.create(BeanImp.class);
String user_phone= DBUtil.getUserMessage().getPhone();
if(user_phone!=null ||last_latlng==null) {
if(IsDistanceMoreOneMile(last_latlng,newlatlng)) {
Call<Message_01> call = repo1.AddMapTrackInToFuWuQi(user_phone, String.valueOf(loc.getLatitude()), String.valueOf(loc.getLongitude()));
call.enqueue(new Callback<Message_01>() {
@Override
public void onResponse(Call<Message_01> call, Response<Message_01> response) {
Message_01 message = response.body();
if (message != null)
Log.i(TAG, message.toString());
last_latlng = newlatlng;
}
@Override
public void onFailure(Call<Message_01> call, Throwable t) {
}
});
}
}
}
private void destroyLocation(){
if (null != locationClient) {
/**
* 如果AMapLocationClient是在當前Activity例項化的,
* 在Activity的onDestroy中一定要執行AMapLocationClient的onDestroy
*/
locationClient.onDestroy();
locationClient = null;
locationOption = null;
}
}
/**
* 判斷兩個點之間的距離大於規定的距離
* */
private boolean IsDistanceMoreOneMile(LatLng last,LatLng news){
if(last==null){
Log.i(TAG,"第一次為空");
return true;
}
float mi=AMapUtils.calculateLineDistance(last, news);
Log.i(TAG,"兩次的間隔為:"+mi);
if(mi>2.0f){
return true;
}
else
return false;
}
/***
* 判斷當前時間是否在規定的時間段範圍內
* */
public static boolean isCurrentInTimeScope() {
int beginHour=5;
int beginMin=0;
int endHour=23;
int endMin=0;
boolean result = false;
final long aDayInMillis = 1000 * 60 * 60 * 24;
final long currentTimeMillis = System.currentTimeMillis();
Time now = new Time();
now.set(currentTimeMillis);
Time startTime = new Time();
startTime.set(currentTimeMillis);
startTime.hour = beginHour;
startTime.minute = beginMin;
Time endTime = new Time();
endTime.set(currentTimeMillis);
endTime.hour = endHour;
endTime.minute = endMin;
if (!startTime.before(endTime)) {
// 跨天的特殊情況(比如22:00-8:00)
startTime.set(startTime.toMillis(true) - aDayInMillis);
result = !now.before(startTime) && !now.after(endTime); // startTime <= now <= endTime
Time startTimeInThisDay = new Time();
startTimeInThisDay.set(startTime.toMillis(true) + aDayInMillis);
if (!now.before(startTimeInThisDay)) {
result = true;
}
} else {
// 普通情況(比如 8:00 - 14:00)
result = !now.before(startTime) && !now.after(endTime); // startTime <= now <= endTime
}
Log.i("LocationService","是否在時間間隔中"+result);
return result;
}
}
判斷服務是否在開啟狀態
判斷服務狀態
GPS狀態
開啟GPS
public class ServiceUtil {
/**
* 用來判斷某個服務是否開啟
* */
public static boolean isServiceRunning(Context mContext, String className) {
boolean isRunning = false;
ActivityManager activityManager = (ActivityManager)
mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> serviceList
= activityManager.getRunningServices(30);
if (!(serviceList.size()>0)) {
return false;
}
for (int i=0; i<serviceList.size(); i++) {
if (serviceList.get(i).service.getClassName().equals(className) == true) {
isRunning = true;
break;
}
}
return isRunning;
}
/**
* 判斷GPS是否開啟,GPS或者AGPS開啟一個就認為是開啟的
* @param context
* @return true 表示開啟
*/
public static final boolean isOPen(final Context context) {
LocationManager locationManager
= (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
// 通過GPS衛星定位,定位級別可以精確到街(通過24顆衛星定位,在室外和空曠的地方定位準確、速度快)
boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// 通過WLAN或行動網路(3G/2G)確定的位置(也稱作AGPS,輔助GPS定位。主要用於在室內或遮蓋物(建築群或茂密的深林等)密集的地方定位)
boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (gps || network) {
return true;
}
return false;
}
/**
* 強制幫使用者開啟GPS
* @param context
*/
public static final void openGPS(Context context) {
Intent GPSIntent = new Intent();
GPSIntent.setClassName("com.android.settings",
"com.android.settings.widget.SettingsAppWidgetProvider");
GPSIntent.addCategory("android.intent.category.ALTERNATIVE");
GPSIntent.setData(Uri.parse("custom:3"));
try {
PendingIntent.getBroadcast(context, 0, GPSIntent, 0).send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
}
使用:
boolean Flag= ServiceUtil.isServiceRunning(this,"zph.zhjx.com.chat.service.LocationService");
服務的開啟和關閉
Intent intet1 = new Intent(SettingActivity.this, LocationService.class);
//開啟
startService(intet1);
//關閉
stopService(intet1);
相關推薦
Android基於高德地圖實時定位服務
Service功能有:實時定位(後臺進行) Service不會,去百度谷歌 功能有 實時定位(30秒間隔) 判斷是否在規定的時間段內 判斷距離是否大於規定的距離 判斷服務是否在開啟的狀態 服務程式碼:LocationService(Android
最新基於高德地圖的android進階開發(4)GPS定位之POI(Point of interesting)興趣點原始碼簡介
1.跑了一下高德提供的POI的原始碼,感覺還是比較簡單的,沒有達到想要的效果,還有改進的空間,後面會繼續更新。 2.下面直接上程式碼,已經註釋好了 main.java package com.dragon.arnav.basicFuction.
Unity與Android交互-Unity接入高德地圖實現定位以及搜索周邊的功能(使用Android Studio)詳細操作
nac mcc 以及 分享 pack create lis red 效果 剛進公司給安排的任務就是Unity接入高德地圖,算是踩了不少坑總算做出來了,抽點時間寫個博客記錄一下 廢話不多說 先上效果圖 獲取定位並根據手機朝向顯示周邊信息 使用的Unity
Android Studio之高德地圖實現定位和3D地圖顯示
tor uil track width 博客 5.0 eight ext wid 在應用開發中,地圖開發是常常須要使用的“組件”,國內比較出名的是就是百度地圖和高德地
Android實現高德地圖定位詳細流程
要實現高德地圖定位呢,首先需要做好以下幾步準備: 如果你嫌筆者寫的不好或者懶得看,只需要程式碼的話,請選擇: github:點選開啟連結,此連線可能和文章內容有所出入,因
基於高德地圖的android開發
首先:接入高德地圖第三方SDK——如何獲取API Key 一:登入---高德開發平臺 二:控制檯--》應用管理--》建立新的應用: 獲取除錯版SHA1安全碼 : 首先這不先別去看文件 看完之後你會更懵 找到build--》 點選creat new--》在
基於高德地圖實現移動網際網路地圖定位自動檢索系統
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>移動網際網路地圖定位自動檢索系統-熊盼</title> <
android studio實現高德地圖api定位
簡單的demo:https://my.oschina.net/zhangqie/blog/845488 SHA1值的獲取:參考高德官網:http://lbs.amap.com/faq/top/hot-questions/253/ publicstatic String sH
Android之高德地圖定位
最近在寫天氣預報的app,寫完以後會將原始碼開源,今天先寫app中用到的定位問題,現在定位的SDK有很多高德地圖、百度地圖、騰訊地圖等,騰訊地圖沒有用過不予評價,高德地圖和百度地圖對比我覺得從開發平臺的給的demo來說,高德地圖給的demo中的程式碼可讀性更強,
Android高德地圖 實現定位 周邊熱點 POI搜尋 BottomSheetBehavior 動態獲取許可權demo
首先我們先看下效果 demo中包含了兩種不同風格的地圖定位效果展示,一種仿IOS的蘋果地圖實現的介面 地圖抽屜欄展示 通過手勢滑動可以實現底部欄的BottomSheetBehavior 可以通過上下拖拽 隱藏或者全屏效果 專案地址:https://github.com/xi
Android 高德地圖的定位功能,以及動態開啟許可權
配置工程 配置AndroidManifest.xml 1、許可權 <!--用於進行網路定位--> <uses-permission android:name="android.permission.ACCESS_CO
最新基於高德地圖的android進階開發(1)獲取 Map API Key
1.本應用是基於高德地圖的開發為了是能呼叫MAP服務,後面的開發中會公開github原始碼地址。 2.為了應用程式中呼叫第三方Map服務,必須獲取第三方的Map服務的API Key,所以首先在高德官網上註冊賬號,並建立應用如下圖中所示 3.在建立
最新基於高德地圖的android進階開發(5)地圖的基本操作、事件監聽、使用者UI、圖層選擇等
1.高德地圖的基本操作:最簡單的莫過於第一次載入地圖 佈局檔案:basic_map.xml,在下面的操作中,未作特別說明都採用此佈局檔案。 <?xml version="1.0" encoding="utf-8"?> <com.am
高德地圖瀏覽器定位
nta utf button 調用 視野 web 成功 contain 成功率 <!doctype html> <html> <head> <meta charset="utf-8"> <meta ht
基於高德地圖的描點操作,監聽地圖縮放,展示合理數量的marker
angle lease div href 函數 其中 如果 pla java 原文:基於高德地圖的描點操作,監聽地圖縮放,展示合理數量的marker 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.cs
高德地圖 ——獲取定位資訊
上一篇文章已經講解了如何整合高德地圖SDK:跳轉連結 如何你想獲取附近位置資訊 關鍵字檢索poi:跳轉這兒 下面我們介紹下定位功能: 配置AndroidManifest檔案 上一篇文章已經講解清單檔案配置: 對應的許可權,服務和key值 注意:
高德地圖03---定位本地位置
首先匯入高德地圖依賴的jar檔案,並新增許可權 1 xml佈局檔案中新增地圖 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com
(四)高德地圖之定位的幾種模式
這一節主要實現的功能是地圖定位的幾種模式,包括展示、定位、追隨、旋轉、旋轉位置、跟隨不移動中心點、旋轉不移動中心點、旋轉位置不移動到中心點,我們根據實際需要來選擇用那種模式。下面還是主要從程式碼中來體現,主要部分有註釋。 還是先新建佈局檔案:activity_locationmodesour
html高德地圖ip定位之後拖動自定義定位地址
前面貌似寫過關於地圖中心點繪製矩形的文章 下面直接貼程式碼就是組裝高德的兩個demo變成一個我想應該對於大多數還是挺有用的吧 <!doctype html> <html lang="zh-CN"> <head> <!-- 原始地址
【Android】高德地圖根據2個座標智慧縮放地圖
需求: 在地圖上給定2個座標點,然後將2個座標點通過縮放都能顯示出來。 實現: 通過查閱高德地圖接入文件和API能找到縮放的API高德地圖文件,看到以下說明 限制地圖的顯示範圍 從地圖 SDK V4.1.0 起新增了設定地圖顯示範圍的方法,手機螢幕僅顯示設定的地圖