Manifest文件添加权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
主要代码:
GPSUtils.java
package com.cxyzy.demo;import android.annotation.SuppressLint;import android.content.Context;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.util.Log;public class GPSUtils { private static String TAG = GPSUtils.class.getSimpleName(); private static GPSUtils mInstance; private Context mContext; private static LocationListener mLocationListener = new LocationListener() { // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.d(TAG, "onStatusChanged"); } // Provider被enable时触发此函数,比如GPS被打开 @Override public void onProviderEnabled(String provider) { Log.d(TAG, "onProviderEnabled"); } // Provider被disable时触发此函数,比如GPS被关闭 @Override public void onProviderDisabled(String provider) { Log.d(TAG, "onProviderDisabled"); } //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 @Override public void onLocationChanged(Location location) { } }; private GPSUtils(Context context) { this.mContext = context; } public static GPSUtils getInstance(Context context) { if (mInstance == null) { mInstance = new GPSUtils(context.getApplicationContext()); } return mInstance; } /** * 获取地理位置,先根据GPS获取,再根据网络获取 * * @return */ @SuppressLint("MissingPermission") public Location getLocation() { Location location = null; try { if (mContext == null) { return null; } LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); if (locationManager == null) { return null; } if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { //从gps获取经纬度 location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location == null) {//当GPS信号弱没获取到位置的时候再从网络获取 location = getLocationByNetwork(); } } else { //从网络获取经纬度 location = getLocationByNetwork(); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } return location; } /** * 判断是否开启了GPS或网络定位开关 * * @return */ public boolean isLocationProviderEnabled() { boolean result = false; LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); if (locationManager == null) { return result; } if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { result = true; } return result; } /** * 获取地理位置,先根据GPS获取,再根据网络获取 * * @return */ @SuppressLint("MissingPermission") private Location getLocationByNetwork() { Location location = null; LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); try { if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, mLocationListener); location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } return location; } }
调用样例(Kotlin):
package com.cxyzy.demoimport android.app.AlertDialogimport android.content.Intentimport android.os.Bundleimport android.provider.Settingsimport android.widget.Toastimport androidx.appcompat.app.AppCompatActivityimport com.blankj.utilcode.constant.PermissionConstantsimport com.blankj.utilcode.util.PermissionUtilsimport kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() { private val REQUEST_LOCATION_PERMISSION_CODE = 100 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) getLocationBtn.setOnClickListener { showLocation() } } private fun showLocation() { PermissionUtils.permission(PermissionConstants.LOCATION) .callback(object : PermissionUtils.FullCallback { override fun onGranted(permissionsGranted: List<String>) { if (GPSUtils.getInstance(this@MainActivity).isLocationProviderEnabled) { showLocationWithToast() } else { requestLocation() } } override fun onDenied(permissionsDeniedForever: List<String>, permissionsDenied: List<String>) { Toast.makeText(this@MainActivity, "未获得地理位置权限", Toast.LENGTH_LONG).show() } }) .request() } private fun showLocationWithToast() { val location = GPSUtils.getInstance(this@MainActivity).location Toast.makeText( this@MainActivity, "地理位置:lon:${location.longitude};lat:${location.latitude}", Toast.LENGTH_LONG ).show() } /** * 检查地理位置开关是否打开,如果未打开,则提示用户打开地理位置开关。 * 如果已打开,则显示地理位置;如果被拒绝,直接关闭窗口。 */ private fun requestLocation() { val message = "本应用需要获取地理位置,请打开获取位置的开关" val alertDialog = AlertDialog.Builder(this).setMessage(message).setCancelable(false) .setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() gotoSysLocationSettingsPage() } .setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() } .create() alertDialog.show() } private fun gotoSysLocationSettingsPage() { val intent = Intent() intent.action = Settings.ACTION_LOCATION_SOURCE_SETTINGS startActivityForResult(intent, REQUEST_LOCATION_PERMISSION_CODE) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQUEST_LOCATION_PERMISSION_CODE -> showLocation() else -> { } } } }
备注:调用样例使用了第三方库,需要提前添加依赖:implementation 'com.blankj:utilcode:1.22.10'
效果图:
作者:程序园中猿
链接:https://www.jianshu.com/p/a4f0f0508ede
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦