在手机应用的实现中经常会遇到需要语言切换用于满足用户环境的多样性。可以根据所处地理位置信息进行经纬度及国家/城市/地区的获取,可以根据此内容进行多语言情况的推荐及切换。
完成上述的想法需要进行几个功能的开发:

  • 需要通过手机进行地理位置信息获取
  • 需要根据地理位置信息进行多语言内容的推荐
  • 需要将应用内的多语言进行切换

1. 进行地理位置信息获取及地理位置上传至后台

地理位置信息获取包含了以下几个功能:

  • 进行GPS权限的获取,此操作需要在初始进行应用时进行请求。避免无法请求地理位置信息导致无法获取地理位置信息(initPermission方法)。
    获取权限分为了两个部分,分别为检查是否已经获取了权限,以及第二部分的权限获取。若当前未获得对应权限则需要进行权限申请。在mainActivity中初始化时进行权限申请,进入主页面后会弹出以下申请:

  • 进行地理位置信息获取,在代码中可以设置进行地理位置获取的时间阈值和地理距离阈值,从而调整获取地理位置信息的频率。(updateLocationData方法)。
    可以通过以下两个参数进行获取地理位置信息频率的调整,根据自身应用的情况进行地理位置的获取,但是一般不允许均设置为0,实时获取可能会涉及代码合规问题

  • 进行地理位置信息的上传,客户端编写地理位置信息处理逻辑,之后再将语言推荐信息以回调的形式返回本地客户端(upLoadLocationData方法)。
    采用retrofit进行网络交互,根据是否存在回调(callback)进行消息上传后的逻辑处理。

 class UpdateLocationData(val mainActivity: BaseActivity) {private val tvLocation: TextView? = nullvar tvAddress: String? = nullvar locationCity: String? = nullprivate var geocoder: Geocoder? = nullprivate var addressList: ArrayList<Address>? = nullprivate val TAG = "FragmentActivity"var mlocation  = LocationInfo()//初始化经纬度,用于返回地理位置信息var latitude: Double = 0.0var longitude: Double = 0.0// 1 获取位置管理者对象private var lm: LocationManager =mainActivity.getSystemService(Context.LOCATION_SERVICE) as LocationManagerfun initPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//检查权限if (ActivityCompat.checkSelfPermission(mainActivity,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED|| ActivityCompat.checkSelfPermission(mainActivity,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {//请求权限ActivityCompat.requestPermissions(mainActivity,arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION),1)}}}fun updateLocationData() {// 获取经纬度坐标// 2 通过lm获得经纬调度坐标// (参数: provider(定位方式 提供者 通过 LocationManager静态调用),// minTime(获取经纬度间隔的最小时间 时时刻刻获得传参数0),// minDistance(移动的最小间距 时时刻刻传0),LocationListener(监听))if (ActivityCompat.checkSelfPermission(mainActivity,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mainActivity,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return}lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,10000,10f,object : LocationListener {override fun onLocationChanged(location: Location) {// 获取经纬度主要方法latitude = location.getLatitude()longitude = location.getLongitude()Log.d(TAG, "onLocationChanged:latitude: $latitude  longitude: $longitude ")tvLocation?.text = "latitude$latitude  longitude$longitude"geocoder = Geocoder(mainActivity)try {// 返回集合对象泛型addressaddressList =geocoder?.getFromLocation(latitude, longitude, 1) as ArrayList<Address>?Log.d(TAG, "onLocationChanged: addressList:${addressList.toString()}")val address: Address = addressList!![0]tvAddress = address.getAddressLine(0) //周边地址locationCity = address.localityval loginViewModel: AddressViewModel =ViewModelProvider(mainActivity).get(AddressViewModel::class.java)mlocation?.latitude = latitude.toFloat()mlocation?.longitude = longitude.toFloat()mlocation?.location_info = (tvAddress).toString()loginViewModel.currentName.value = mlocationLog.d(TAG, "onLocationChanged: tvAddress${tvAddress}")Log.d(TAG, "onLocationChanged: locationCity${locationCity}")} catch (e: IOException) {e.printStackTrace()}//上传location数据upLoadLocationData()}override fun onStatusChanged(s: String, i: Int, bundle: Bundle) {//状态发生改变监听}override fun onProviderEnabled(s: String) {// ProviderEnabled}override fun onProviderDisabled(s: String) {// ProviderDisabled}})}fun upLoadLocationData() {val root = JSONObject()val requestData = JSONObject()try {root.put("user_id", "3501307940846471")requestData.put("longitude", "$latitude")requestData.put("latitude", "$longitude")requestData.put("location_info", tvAddress)root.put("user_geography_info", requestData)root.put("choice_language", "H212")} catch (e: JSONException) {e.printStackTrace()}val requestBody =RequestBody.create(MediaType.parse("application/json"), root.toString())val service = Retrofit.Builder().baseUrl("http://******").addConverterFactory(GsonConverterFactory.create()).build().create(AppService::class.java);Log.d(TAG, "upLoadLocationData: 完成数据上传")service.upLoadLocationData(requestBody).enqueue(object : Callback<LocationData>{override fun onResponse(call: Call<LocationData>, response: Response<LocationData>) {Log.d(TAG, "upLoadLocationData: success")}override fun onFailure(call: Call<LocationData>, t: Throwable) {Log.d(TAG, "upLoadLocationData: fail")}})}}

根据地理位置多语言切换(1)- 获取地理位置信息相关推荐

  1. C语言下,获取文件信息 http://qimo601.iteye.com/blog/1517413

    http://qimo601.iteye.com/blog/1517413 C语言下,获取文件信息 博客分类: C/C++ C语言文件信息文件大小  C语言下,如何获取文件的生成时间,日期和文件大小等 ...

  2. php根据地理位置签到,微信小程序获取地理位置实现定位签到功能

    为了保证签到定位的精确性,要求开启GPS定位.小程序成功精确获取地理位置打卡签到,需要三步授权验证: 地理位置的系统开关(系统GPS开关是否打开) --系统级 允许微信使用定位的开关 (微信是否有获取 ...

  3. C语言下,获取文件信息

    C语言下,如何获取文件的生成时间,日期和文件大小等文件信息. 1.标准库函数并未提供对应的实现,这个Linux上GCC中struct stat的资料 struct stat {dev_t st_dev ...

  4. aix c语言根据pid获取内存信息,如何通过C语言编程获取AIX的CPU,内存使用率

    回复 1# sigou     如果你AIX上安装了bos.perf.libperfstat这个包的话,会有示例程序.root@testhost:/proc/sys/fs/jfs2 #lslpp -f ...

  5. Django博客来访人员地域分布大数据可视化---echarts绘图、geoip2获取地理位置

    文章目录 Django博客来访人员地域分布大数据可视化---echarts绘图.geoip2获取地理位置 效果 echarts作图 geoip2获取地理位置 api接口开发 ajax前后端动态交互 D ...

  6. c语言api获取百度地图,H5调用百度地图API获取地理位置

    //获取当前位置 var geolocation = new BMap.Geolocation(); geolocation.getCurrentPosition(function(r){ alert ...

  7. php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)

    php调用新浪接口查询ip获取地理位置(ip归属地查询) 发布于 2014-11-17 08:35:58 | 115 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...

  8. html5实现获取地理位置信息并定位

    html5实现获取地理位置信息并定位 一.总结 一句话总结:获取地理位置是分两步:获取经纬度和根据经纬度获取地址信息 a.HTML5的Geolocation(地理位置功能(Geolocation AP ...

  9. reactnative 获取定位_react native 获取地理位置的方法示例

    react native 官网介绍了这个 api Geolocation 但是这个api只能返回 经纬度 所以要把经纬度 通过逆地理位置转义 http://recode.ditu.aliyun.com ...

最新文章

  1. Discuz!常用函数解析(续)
  2. php 比较,PHP类型比较
  3. python标准输入_Python 处理标准输入
  4. c语言sizeof(test),解析C语言中的sizeof
  5. 【TWVRP】基于matlab节约算法求解带时间窗的车辆路径规划问题【含Matlab源码 156期】
  6. linux的c文件报错for,安装Ubuntu时报错 Failed to load ldlinux.c32
  7. windows安装adb工具
  8. python qq群管理_Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码...
  9. 多元回归分析python实战-----对我国财政收入的多因素进行分析
  10. 傅里叶变换与希尔伯特变换
  11. 电信光猫超级密码破解
  12. 处理:TF卡突然变成8M,格式化提示写保护
  13. linux工作区切换到桌面,linux切换桌面环境 gnome kde
  14. 数据中台与数据湖概念认知
  15. 动力工程及工程热物理推免真题(凭个人记忆整理)
  16. 最新Uniapp开发的多端影视APP+对接苹果CMS
  17. 【EXPDP】11g版本EXPDP 的COMPRESSION参数压缩比堪比“gzip -9”
  18. http——基础知识
  19. 通过Python分析2020年全年微博热搜数据
  20. 何海涛算法面试题感悟之二:设计包…

热门文章

  1. Linux下面如何运行.sh文件?
  2. vue 项目修改网页 title 和 图标
  3. Java 之 数据库
  4. # 电脑端的应用无法上传附件,点击没有反应怎么办?
  5. Map根据Key值进行排序(升序加降序)
  6. BSV斯洛文尼亚商业区块链活动精彩回顾
  7. Ubuntu Server 18.04安装后vi命令解决键盘错乱方法和wifi连接之后不能上网
  8. 飞漫魏永明:从MiniGUI看嵌入式十年得与失
  9. 浅析静态规划和动态规划
  10. 2020天池 “数字人体”视觉挑战赛_VNNI赛道_冠军_方案分享