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);
    }

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

相关文章
|
4月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
4月前
|
存储 编解码 网络协议
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
前几年,我们在做Android平台GB28181设备接入模块的时候,第一个使用场景想到的就是用在公检法应急指挥等场景下的执法记录仪,本篇blog,我们主要围绕Android平台GB28181执法记录仪的硬件选型、设备接入、音视频流配置、流媒体传输、存储和管理、控制与控制中心等方面进行设计,探讨下Android平台GB28181设备接入模块在执法记录仪行业的应用。
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
|
4月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
4月前
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
|
4月前
|
编解码 数据可视化 定位技术
Android平台GB28181记录仪在铁路可视化巡检应用
GB28181记录仪在铁路可视化巡检中,集成实时音视频采集、位置上报、语音通信与无线传输技术,确保巡检高效准确。它能实时记录巡检细节,支持高清画质,并通过北斗/GPS实现精确位置追踪。记录仪兼容多种视频与音频格式,具备音量调节与编码参数配置功能,支持横竖屏及后台服务推流。此外,它还能添加动态水印,确保数据完整性,并允许指挥中心远程下载与回放历史视频,全面满足铁路巡检需求。
|
4月前
|
编解码 开发工具 Android开发
Android平台GB28181设备接入侧如何实现GB28181-2022实时快照
GB/T28181-2022标准中明确了快照的具体要求,包括图像抓拍配置命令的发送与接收流程。源设备需向目标设备发送包含传输路径和会话ID等信息的命令,目标设备完成图像传输后,通过IETF RFC 3428中的MESSAGE方法发送图像抓拍传输完成的通知。图像格式推荐使用JPEG,且分辨率应与主码流相同。技术实现上,如使用大牛直播SDK在Android平台上,可通过创建`SnapShotImpl`类并调用`capture()`方法实现快照功能,之后将JPEG格式的快照文件上传至国标平台。
|
4月前
|
监控 Java 开发工具
如何快速对接Android平台GB28181接入模块(SmartGBD)
大牛直播SDK推出的Android平台GB28181接入SDK(SmartGBD),可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景,可能是业内为数不多功能齐全性能优异的商业级水准GB28181接入SDK。
|
4月前
|
监控 Java 开发工具
### 绝招揭秘!Android平台GB28181设备接入端如何实现资源占用和性能消耗的极限瘦身?
【8月更文挑战第14天】本文介绍在Android平台优化GB28181标准下设备接入的性能方法,涵盖环境搭建、SDK集成与初始化。重点讲解内存管理技巧如软引用、按需加载资源,以及通过硬件加速解码视频数据和图像缩放来减轻CPU与GPU负担。同时采用线程池异步处理视频流,确保UI流畅性。这些策略有助于提高应用效率和用户体验。
56 0
|
4月前
|
编解码 监控 API
惊艳登场!揭秘如何在Android平台上轻松玩转GB28181标准,实现多视频通道接入的超实用指南!
【8月更文挑战第14天】GB28181是公共安全视频监控联网的技术标准。本文介绍如何在Android平台上实现该标准下的多视频通道接入。首先准备开发环境,接着引入GB28181 SDK依赖并初始化SDK。实现设备注册与登录后,通过指定不同通道号请求多路视频流。最后,处理接收到的数据并显示给用户。此过程涉及视频解码,需确保应用稳定及良好的用户体验。
101 0
|
4月前
|
存储 编解码 监控
Android平台GB28181记录仪在电网巡检抢修中的应用和技术实现
GB28181记录仪在电网巡检中利用其实时音视频采集与传输功能,增强巡检效率与安全性。通过Android平台设备,巡检人员能实时上传视频至指挥中心,后者可远程监控并即时响应。记录仪内置定位模块确保准确追踪人员位置,支持语音广播与对讲功能促进有效沟通。设备还具备本地录像与历史数据回放功能,便于数据分析。此方案显著提升了电网巡检的工作效能与安全性。