当前位置: 首页 > news >正文

宁波网站推广方式定制公司厦门正规网站建设多少

宁波网站推广方式定制公司,厦门正规网站建设多少,wamp 设置多个网站,wordpress建两个网站目前#xff0c;移动端大致通过三种方式来进行设备定位#xff1a;GPS、基站、wifi。本文就详细的讲解一下这几种定位方式和实现方法。 前言 android中我们一般使用LocationManager来获取位置信息#xff0c;这里面有四中provider#xff1a; public static final Strin…目前移动端大致通过三种方式来进行设备定位GPS、基站、wifi。本文就详细的讲解一下这几种定位方式和实现方法。 前言 android中我们一般使用LocationManager来获取位置信息这里面有四中provider public static final String NETWORK_PROVIDER network; public static final String GPS_PROVIDER gps; public static final String PASSIVE_PROVIDER passive; public static final String FUSED_PROVIDER fused; 其中fused已经被废弃了其它三种区别如下 1GPS_PROVIDER通过 GPS 来获取地理位置的经纬度信息优点获取地理位置信息精确度高缺点只能在户外使用获取经纬度信息耗时耗电 2NETWORK_PROVIDER通过移动网络的基站或者 Wi-Fi 来获取地理位置优点只要有网络就可以快速定位室内室外都可缺点精确度不高 3PASSIVE_PROVIDER被动接收更新地理位置信息而不用自己请求地理位置信息。 PASSIVE_PROVIDER 返回的位置是通过其他 providers 产生的可以查询 getProvider() 方法决定位置更新的由来需要 ACCESS_FINE_LOCATION 权限但是如果未启用 GPS则此provider 可能只返回粗略位置匹配 我们通常使用gps和network这两种方式。但是我们还可以通过其它方式获取位置信息这篇文章就详细的讲解一下在android中几种获取定位的方式。 一、GPS定位 这个用的最普遍可以获取上次定位也可以监听变化代码如下 先定义需要的权限 uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/ uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION/ 调用代码 var locManager getSystemService(Context.LOCATION_SERVICE) as LocationManager var loc locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) if(loc ! null){Log.e(gpslocation, loc.toString())toast(loc.toString()) } locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0F, object : LocationListener{override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}override fun onProviderEnabled(provider: String?) {}override fun onProviderDisabled(provider: String?) {}override fun onLocationChanged(location: Location?) {Log.e(gpslocation, location.toString())toast(location.toString())} }) 二、NETWORK定位 与gps定位代码基本一致只不过将provider改成LocationManager.NETWORK_PROVIDER 三、AGPS定位 实际上是将上面两种定位结合起来具体原理如下 AGPS手机首先将本身的基站地址通过网络传输到位置服务器 位置服务器根据该手机的大概位置传输与该位置相关的GPS辅助信息包含GPS的星历和方位俯仰角等到手机 该手机的AGPS模块根据辅助信息以提升GPS信号的第一锁定时间TTFF能力接收GPS原始信号 手机在接收到GPS原始信号后解调信号计算手机到卫星的伪距伪距为受各种GPS误差影响的距离并将有关信息通过网络传输到位置服务器 位置服务器根据传来的GPS伪距信息和来自其他定位设备如差分GPS基准站等的辅助信息完成对GPS信息的处理并估算该手机的位置; 位置服务器将该手机的位置通过网络传输到定位网关或应用平台。 我的理解就是通过网络位置和位置服务器判断出最佳的卫星减少了获取卫星信号的时间。因为网络位置获取很快所以可以减少整体的定位时间。 AGPS并不是一种定位方式只是一种优化方案代码与GPS一样只不过在设置中将定位模式设成AGPS。 上面是android自带的定位方式我们还可以获取一些原始信息比如基站信息、wifi信息通过公开的接口来获取位置信息。下面几种方式就是使用原始信息通过API来获取位置信息。 四、基站定位 通过TelephonyManager我们可以拿到基站信息再通过相关的api接口就能得到经纬度但是基站定位精度很差。 基站信息包含如下 MCCMobile Country Code移动国家代码中国的为460MNCMobile Network Code移动网络号码中国移动为00中国联通为01LACLocation Area Code位置区域码CIDCell Identity基站编号是个16位的数据范围是0到65535。 拿到这个信息后我们可以通过一些公开的api服务拿到经纬度如下 http://www.google.com/loc/json google的post请求好像停用了 http://www.cellocation.com/interfac/目前可用是免费的 实例 http://api.cellocation.com:81/cell/?mcc460mnc1lac4301ci20986outputjson 返回 {errcode:0, lat:40.00598145, lon:116.48539734, radius:937, address:北京市朝阳区来广营地区东湖渠;溪阳东路与屏翠东路路口东70米} 接口参数 名称 类型 必填 说明 mcc int 是 mcc国家代码中国代码 460 mnc int 是 mnc网络类型0移动1联通(电信对应sid)十进制 lac int 是 lac(电信对应nid)十进制 ci int 是 cellid(电信对应bid)十进制 coord string 否 坐标类型(wgs84/gcj02/bd09)默认wgs84 output string 否 返回格式(csv/json/xml)默认csv 另外还有很多提供这种接口和数据的平台自己搜索即可 代码如下需要权限 uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/ uses-permission android:nameandroid.permission.ACCESS_CARSE_LOCATION/ 基站定位这里只实现了GSM的CDMA的有些许不同 val telManager getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager if(telManager.cellLocation is GsmCellLocation) {val cellLoc telManager.cellLocation as GsmCellLocationif (cellLoc ! null) {val operator telManager.networkOperatorval mcc operator.substring(0, 3).toInt()val mnc operator.substring(3).toInt()val cid cellLoc.cidval lac cellLoc.lacvar sb StringBuilder(http://api.cellocation.com:81/cell/?)sb.append(mcc)sb.append(mcc)sb.append(mnc)sb.append(mnc)sb.append(lac)sb.append(lac)sb.append(ci)sb.append(cid)sb.append(outputjson)Log.e(tellocation, sb.toString())doAsync {val result URL(sb.toString()).readText()Log.e(tellocation, result)}} } 五、WIFI定位 wifi定位是通过WifiManager拿到wifi的信息主要是wifi的BSSID即mac地址。然后通过一些api查询经纬度比如 http://www.cellocation.com/interfac/ 实例 http://api.cellocation.com:81/wifi/?mac00:87:36:05:5d:eaoutputjson 返回 {errcode:0, lat:39.950008, lon:116.230049, radius:222, address:北京市海淀区四季青镇益园文创基地c区9号楼;南平庄中路与西平庄路路口西北561米} 接口参数 名称 类型 必填 说明 mac int 是 WIFI热点的MAC地址(BSSID) coord string 否 坐标类型(wgs84/gcj02/bd09)默认wgs84 output string 否 返回格式(csv/json/xml)默认csv 代码如下需要权限 uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE/ wifi定位 val wifiManager applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager if(wifiManager.isWifiEnabled) {var mac wifiManager.connectionInfo.bssidif(TextUtils.isEmpty(mac)) {/*** 当未链接wifi时可以使用扫描到的wifi列表中找一个信号强度最好的。这里没进行比较直接使用第一个了* ScanReuslt有三个字段比较重要SSID是wifi名称BSSID是wifi的maclevel则是信号强度负数* 注意结果中同一个SSID可能会有多个如果需要链接wifi可以通过信号强度过滤出最好的来链接*/val scanlist wifiManager.scanResultsfor(info in scanlist){Log.e(wifiinfo, info.toString())}if(scanlist.size 0) {mac wifiManager.scanResults[0].BSSID}}if(!TextUtils.isEmpty(mac)) {var sb StringBuilder(http://api.cellocation.com:81/wifi/?)sb.append(mac)sb.append(mac)sb.append(outputjson)Log.e(wifilocation, sb.toString())doAsync {val result URL(sb.toString()).readText()Log.e(wifilocation, result)}} } 六、混合定位 混合定位就是获取附近的wifi列表信息包括信号强度和附近的基站列表信息包括信号强度通过一些api获取经纬度。 这种方式相对于单一的基站和wifi定位要更精确一些。 获取附近的wifi列表在WIFI定位已经提到过了通过WifiManager的getScanResults函数获取扫描到的wifi列表其中level就是信号强度可能需要做一下去重。 获取附近的基站列表则有些问题。 官方提供了一个方式通过TelephonyManager的getNeighboringCellInfo函数获得其中mRssi就是信号强度。 需要权限 uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION/ 获取附近基站信息 val telManager getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager val neighborCells telManager.neighboringCellInfo for(cell in neighborCells){//这里将rssi转化为dBmval level -131 2 * cell.rssiLog.e(neighboringCellInfo, cid:${cell.cid} lac:${cell.lac} rssi:$level) } 但是实际使用时发现cid和lac都是-1。 检查NeighboringCellInfo的构造方法如下 public NeighboringCellInfo(int rssi, String location, int radioType) {// set default valuemRssi rssi;mNetworkType NETWORK_TYPE_UNKNOWN;mPsc UNKNOWN_CID;mLac UNKNOWN_CID;mCid UNKNOWN_CID;// pad location string with leading 0int l location.length();if (l 8) return;if (l 8) {for (int i 0; i (8-l); i) {location 0 location;}}// TODO - handle LTE and eHRPD (or find they cant be supported)try {// set LAC/CID or PSC based on radioTypeswitch (radioType) {case NETWORK_TYPE_GPRS:case NETWORK_TYPE_EDGE:mNetworkType radioType;// check if 0xFFFFFFFF for UNKNOWN_CIDif (!location.equalsIgnoreCase(FFFFFFFF)) {mCid Integer.parseInt(location.substring(4), 16);mLac Integer.parseInt(location.substring(0, 4), 16);}break;case NETWORK_TYPE_UMTS:case NETWORK_TYPE_HSDPA:case NETWORK_TYPE_HSUPA:case NETWORK_TYPE_HSPA:mNetworkType radioType;mPsc Integer.parseInt(location, 16);break;}} catch (NumberFormatException e) {// parsing location errormPsc UNKNOWN_CID;mLac UNKNOWN_CID;mCid UNKNOWN_CID;mNetworkType NETWORK_TYPE_UNKNOWN;}} 可以看到只对GPRS和EDGE网络进行了处理而3G、4G网络都是UNKNOWN_CID即-1。说明这种方法不支持已经过时。 官方还有另外一个方式通过TelephonyManager的getAllCellInfo函数获得。这个函数要求minsdkverison必须在17及以上 需要权限 uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION/ 获取基站信息这里只处理了LTE网络的 val telManager getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager val cells telManager.allCellInfo for(cell in cells){if(cell is CellInfoLte) {Log.e(celllist, cid:${cell.cellIdentity.ci} lac:${cell.cellIdentity.tac} dbm:${cell.cellSignalStrength.dbm} isRegistered:${cell.isRegistered})} } 得到的信息如下 E/celllist: cid:3912981 lac:4154 dbm:-87 isRegistered:true E/celllist: cid:2147483647 lac:2147483647 dbm:-101 isRegistered:false E/celllist: cid:2147483647 lac:2147483647 dbm:-102 isRegistered:false E/celllist: cid:2147483647 lac:2147483647 dbm:-108 isRegistered:false E/celllist: cid:2147483647 lac:2147483647 dbm:-101 isRegistered:false 其中第一个是我们正在使用的基站可以看到正常的返回了信息而其余的则返回默认的信息Integer.MAX_VALUE 说明这个方法也只能拿到当前使用的基站信息。而且据网上的说法当使用2G网络getAllCellInfo得到的是NULL。 这样目前没有更好的方式获取多个基站信息了。 当我们拿到附近的基站信息和wifi信息可以通过http://www.cellocation.com/interfac/提供的混合定位接口查询位置信息与上面类似这里不细说了。 总结 一般情况下我们使用系统提供的LocationManager即可获取位置信息方便简单。如果我们有自己的基站或wifi信息库也可以获取相关源信息通过接口来实现个性化服务。
http://www.dnsts.com.cn/news/67688.html

相关文章:

  • 网站开发系统流程图wordpress 移动端 主题
  • 沈阳网站开发培训价格如何在公众号里做网站
  • 大连制作网站企业太原网站开发团队
  • 做面包的网站设计网站排行
  • 帆布网站做哪个上海有哪些外贸进出口公司
  • 服务器做网站上传快好还是下载快好描述网站开发的流程
  • 好看的网站排版陕西建设厅执业注册中心网站
  • 天津做系统集成的公司网站神马seo教程
  • 爱奇艺会员做任务送十天网站手机建设网站目的
  • 辽宁省网站制作东莞保安公司在哪里
  • python工程打包供网站开发调用谷德设计网官网首页入口
  • 专门做it招聘的网站wordpress模板商业用
  • 网站源码下载哪个网站好专业群建设 网站
  • 总结网站推广策划思路的内容专注宜昌网站建设
  • 郑州建材网站建设莘县做网站
  • 企业网站建设属于什么科目微信公众号直接链接网站怎么做
  • 怎么做带后台的网站wordpress外链图床插件
  • 鹤壁建设网站推广公司奇米网怎么做网站
  • 有个电商网站模板国内十大游戏公司排名
  • 网站建设质量保证wordpress视频主题汉化
  • 网站建设询价文件哈密地网站建设
  • 犀牛云做网站怎么这么贵商务网站规划与建设的目的
  • 餐饮公司网站模板下载企业门户网站建设公司
  • 微门户网站建设公司建网站有何意义
  • 网站备案号如何查询wordpress全站源码
  • 网站添加百度搜索2022年全球3月解封
  • 天津建设工程交易中心网站建设公关型的企业网站有哪些
  • 网站运营职业分析优秀的网页设计案例
  • 怎样用阿里云服务器做网站企业网站设计解决方案
  • 学院网站建设管理制度微信公众号运营策划