Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度

简介: 我们在做Android平台GB28181的时候,其中实时位置(MobilePosition)订阅和上报这块,涉及到实时经纬度的获取,特别是执法记录、车载系统的那个等场景,几乎就是标配。

我们在做Android平台GB28181的时候,其中实时位置(MobilePosition)订阅和上报这块,涉及到实时经纬度的获取,特别是执法记录、车载系统的那个等场景,几乎就是标配。


今天主要是分享一段实时获取位置的代码:

/*
     * CameraPublishActivity.java
     * CameraPublishActivity
     *
     * Github: https://github.com/daniulive/SmarterStreaming
     */
     private void getLocation(Context context) {
        try {
            if ( context == null )
                return;
            //1.获取位置管理器
            if ( mLocationManager == null )
                mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            if (mLocationManager == null)
                return;
            //2.获取位置提供器,GPS或是NetWork
            List<String> providers = mLocationManager.getProviders(true);
            if ( providers != null ) {
                if (providers.contains(LocationManager.NETWORK_PROVIDER)){
                    //如果是网络定位
                    mLocationProvider = LocationManager.NETWORK_PROVIDER;
                }else if (providers.contains(LocationManager.GPS_PROVIDER)){
                    //如果是GPS定位
                    mLocationProvider = LocationManager.GPS_PROVIDER;
                }else {
                    Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
                    return;
                }
            }
            if (mLocationProvider == null )
                return;
            mLocationManager.removeUpdates(mLocationListener);
            mLocationManager.requestLocationUpdates(mLocationProvider, 500, 1.0f, mLocationListener);
            //3.获取上次的位置,一般第一次运行,此值为null
            Location location = mLocationManager.getLastKnownLocation(mLocationProvider);
            if (location!=null) {
                updateLocation(location);
            }
        }catch (Exception e) {
            Log.e(TAG, "getLocation exception:" + e.getMessage());
            e.printStackTrace();
        }
    }
    private void updateLocation(Location location){
        //long utc_time = location.getTime();
        //long local_time = utc_time + TimeZone.getDefault().getOffset(utc_time);
        //Date date = new Date(location.getTime());
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String time_str = dateFormat.format(date);
       // String address = "纬度:"+location.getLatitude()+" 经度:"+location.getLongitude() + " 时间:" + time_str;
        //Log.i(TAG, "位置信息: " + address);
        mLocationTime = time_str;
        mLatitude   = String.valueOf(location.getLatitude());
        mLongitude  = String.valueOf(location.getLongitude());
    }
    LocationListener mLocationListener = new LocationListener() {
        @Override
        public void onStatusChanged(String provider, int {
        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
        // 如果位置发生变化,重新显示
        @Override
        public void onLocationChanged(Location location)

国标平台开启位置订阅后,Android平台GB28181接入端根据平台侧发过来的时间间隔要求,周期性的更新实时位置信息,相关流程如下:

503b6200a6794a6cb7cebbc7fb59a11a.png

其中,SUBSCRIBE请求XML描述如下,除了常规信息外,还提供了Interval,供接入端使用。

<?xml versinotallow="1.0" encoding="GB2312"
<Query>
<CmdType>MobilePosition</CmdType>
<SN>55674</SN>
<DeviceID>31011500991320000099</DeviceID>
<Interval>5</Interval>
</Query>

Android国标接入端上报NOTIFY请求示例,请求体XML示例如下:

<?xml versinotallow="1.0" encoding="GB2312"
<Notify>
<CmdType>MobilePosition</CmdType>
<SN>71339</SN>
<TargetID>31011500991320000099</TargetID>
<Time>2022-03-19T12:22:20</Time>
<Longitude>143.507222</Longitude>
<Latitude>33.99011311</Latitude>
</Notify>

当底层有DevicePosition处理诉求时,可参考如下实现:

@Override
    public void ntsOnDevicePositionRequest(String deviceId, int {
        handler_.postDelayed(new Runnable() {
            @Override
            public void run() {
                getLocation(context_);
                Log.v(TAG, "ntsOnDevicePositionRequest, deviceId:" + this.device_id_ + ", Longitude:" + mLongitude
                        + ", Latitude:" + mLatitude + ", Time:" + mLocationTime);
                if (mLongitude != null && mLatitude != null) {
                    com.gb.ntsignalling.DevicePosition device_pos = new com.gb.ntsignalling.DevicePosition();
                    device_pos.setTime(mLocationTime);
                    device_pos.setLongitude(mLongitude);
                    device_pos.setLatitude(mLatitude);
                    if (gb28181_agent_ != null ) {
                        gb28181_agent_.updateDevicePosition(device_id_, device_pos);
                    }
                }
            }
            private String device_id_;
            private int interval_;
            public Runnable set(String device_id, int {
                this.device_id_ = device_id;
                this.interval_ = interval;
                return this;
            }
        }.set(deviceId, interval),0);
    }

以下是大概的流程,感兴趣的开发者,可以酌情参考。

相关文章
|
7月前
|
数据采集 前端开发 Android开发
Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?
我们在做Android平台RTMP推送和GB28181设备对接的时候,遇到这样的问题,有的设备,麦克风采集出来的audio,音量过高或过低,特别是有些设备,采集到的麦克风声音过低,导致播放端听不清前端采集的audio,这时候,就需要针对采集到的audio,做音量放大处理。
|
7月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入端如何支持跨网段语音对讲
如果你是音视频开发者亦或寻求这块技术方案的公司,在探讨这个问题之前,你可能网上看了太多关于语音广播和语音对讲相关的资料,大多文章认为语音对讲和语音广播无本质区别,实现思路也大同小异。
|
3月前
|
编解码 测试技术 开发工具
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
|
3月前
|
开发工具 Android开发
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
|
6月前
|
XML 网络协议 开发工具
Android平台GB28181设备接入侧如何实现SIP校时
Android平台GB28181设备接入侧如何实现SIP校时
|
7月前
|
编解码 监控 网络协议
Android平台GB28181设备接入侧如何实现按需打开视音频采集传输
Android平台GB28181设备接入侧如何实现按需打开视音频采集传输
121 2
|
7月前
|
网络协议 开发工具 Android开发
​​Android平台GB28181历史视音频文件下载规范探讨及技术实现
​​Android平台GB28181历史视音频文件下载规范探讨及技术实现
110 1
|
7月前
|
开发工具 Android开发 开发者
Android平台GB28181历史视音频文件检索规范探讨及技术实现
Android平台GB28181历史视音频文件检索规范探讨及技术实现
|
7月前
|
编解码 监控 开发工具
Android平台GB28181接入模块技术接入说明
今天,我们主要讲讲Android平台GB28181接入模块的技术对接,Android平台GB28181接入模块设计的目的,可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。
|
7月前
|
编解码 监控 前端开发
Android平台GB28181设备接入模块相关博客概览
Android平台GB28181设备接入模块,可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。