1. 程式人生 > >Android基於高德地圖實時定位服務

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 起新增了設定地圖顯示範圍的方法,手機螢幕僅顯示設定的地圖