在手机应用的实现中经常会遇到需要语言切换用于满足用户环境的多样性。可以根据所处地理位置信息进行经纬度及国家/城市/地区的获取,可以根据此内容进行多语言情况的推荐及切换。
完成上述的想法需要进行几个功能的开发:
- 需要通过手机进行地理位置信息获取
- 需要根据地理位置信息进行多语言内容的推荐
- 需要将应用内的多语言进行切换
1. 进行地理位置信息获取及地理位置上传至后台
地理位置信息获取包含了以下几个功能:
-
进行GPS权限的获取,此操作需要在初始进行应用时进行请求。避免无法请求地理位置信息导致无法获取地理位置信息(initPermission方法)。
获取权限分为了两个部分,分别为检查是否已经获取了权限,以及第二部分的权限获取。若当前未获得对应权限则需要进行权限申请。在mainActivity中初始化时进行权限申请,进入主页面后会弹出以下申请:
-
进行地理位置信息获取,在代码中可以设置进行地理位置获取的时间阈值和地理距离阈值,从而调整获取地理位置信息的频率。(updateLocationData方法)。
可以通过以下两个参数进行获取地理位置信息频率的调整,根据自身应用的情况进行地理位置的获取,但是一般不允许均设置为0,实时获取可能会涉及代码合规问题:
-
进行地理位置信息的上传,客户端编写地理位置信息处理逻辑,之后再将语言推荐信息以回调的形式返回本地客户端(upLoadLocationData方法)。
采用retrofit进行网络交互,根据是否存在回调(callback)进行消息上传后的逻辑处理。
class UpdateLocationData(val mainActivity: BaseActivity) {
private val tvLocation: TextView? = null
var tvAddress: String? = null
var locationCity: String? = null
private var geocoder: Geocoder? = null
private var addressList: ArrayList<Address>? = null
private val TAG = "FragmentActivity"
var mlocation = LocationInfo()
//初始化经纬度,用于返回地理位置信息
var latitude: Double = 0.0
var longitude: Double = 0.0
// 1 获取位置管理者对象
private var lm: LocationManager =
mainActivity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
fun 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 {
// 返回集合对象泛型address
addressList =
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.locality
val loginViewModel: AddressViewModel =
ViewModelProvider(mainActivity).get(
AddressViewModel::class.java
)
mlocation?.latitude = latitude.toFloat()
mlocation?.longitude = longitude.toFloat()
mlocation?.location_info = (tvAddress).toString()
loginViewModel.currentName.value = mlocation
Log.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")
}
})
}
}