Android开发获取当前经纬度和详细位置信息(原生代码实现)简单案例

Android定位(经纬度+当前位置信息)

我相信大家在Android开发中应该都有遇到过需要获取经纬度和当前位置信息的情况!

本人目前也还处于学习Android阶段,想做一下关于Android定位的笔记。

以下是本人通过一个下午的时间找到最新可以获取定位信息的方法。希望对大家也有帮助。

申请权限

	<!-- 网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

LocationManage位置管理器

通过LocatioManage去获取到当前的位置管理器

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

使用locationManager.requestLocationUpdates()方法注意

在方法中使用方法头部带上@SuppressLint("MissingPermission")
    
    或者放在判断是否有使用定位的权限语句的后面
     if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
     {
         
     }
	 locationManager.requestLocationUpdates(
	   		选中定位模式, 
	   		多久获取一次(毫秒为单位), 
	   		移动距离多远获取一次(米为单位), 
	   		传一个LocationListener监听
	   		);

	
// 表示移除LocationManage(位置管理器)
locationManager.removeUpdates(传入实现过LocationListener的类); 

完整代码

MainActivity类的代码

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity implements LocationListener {

    // 定义TextView
    private TextView nowAddress;
    private TextView lat;
    private TextView lon;
    // 定义双精度类型的经纬度
    private Double longitude,latitude;
    // 定义位置管理器
    private LocationManager locationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 得到对应视图ID
        nowAddress = findViewById(R.id.tv_nowAddress);
        lat = findViewById(R.id.tv_latitude);
        lon = findViewById(R.id.tv_longitude);

        // 判断当前是否拥有使用GPS的权限
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        {
            // 申请权限
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 100);
        }
        getLocation();
        /*
        或者这样子也是可以的
        // 获取当前位置管理器
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // 启动位置请求
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, MainActivity.this);
        */
    }

    @SuppressLint("MissingPermission")
    private void getLocation() {
        // 获取当前位置管理器
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // 启动位置请求
        // LocationManager.GPS_PROVIDER GPS定位
        // LocationManager.NETWORK_PROVIDER 网络定位
        // LocationManager.PASSIVE_PROVIDER 被动接受定位信息
        locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, MainActivity.this);
    }

    // 当位置改变时执行,除了移动设置距离为 0时
    @Override
    public void onLocationChanged(@NonNull Location location) {

        // 获取当前纬度
        latitude = location.getLatitude();
        // 获取当前经度
        longitude = location.getLongitude();
        lat.setText("纬度:" + latitude);
        lon.setText("经度:" + longitude);
        // 定义位置解析
        Geocoder geocoder = new Geocoder(MainActivity.this, Locale.getDefault());
        try {
            // 获取经纬度对于的位置
            // getFromLocation(纬度, 经度, 最多获取的位置数量)
            List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
            // 得到第一个经纬度位置解析信息
            Address address = addresses.get(0);
            // 获取到详细的当前位置
            // Address里面还有很多方法你们可以自行实现去尝试。比如具体省的名称、市的名称...
            String info = address.getAddressLine(0) + // 获取国家名称
                    address.getAddressLine(1) + // 获取省市县(区)
                    address.getAddressLine(2);  // 获取镇号(地址名称)
            // 赋值
            nowAddress.setText(info);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 移除位置管理器
        // 需要一直获取位置信息可以去掉这个
        locationManager.removeUpdates(this);
    }

    // 当前定位提供者状态
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        Log.e("onStatusChanged", provider);
    }

    // 任意定位提高者启动执行
    @Override
    public void onProviderEnabled(@NonNull String provider) {
        Log.e("onProviderEnabled", provider);
    }

    // 任意定位提高者关闭执行
    @Override
    public void onProviderDisabled(@NonNull String provider) {
        Log.e("onProviderDisabled", provider);
    }
}

Layout布局的代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_latitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="纬度"
        app:layout_constraintBottom_toTopOf="@+id/tv_longitude"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/tv_longitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="经度"
        app:layout_constraintBottom_toTopOf="@+id/tv_nowAddress"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_latitude" />

    <TextView
        android:id="@+id/tv_nowAddress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="当前位置"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  • 10
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
这是一个简单获取经纬度代码样例: ``` public class MainActivity extends AppCompatActivity implements LocationListener { private LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取位置管理器 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 检查是否有权限获取位置信息 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // 请求位置更新 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); } else { // 请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 处理权限请求结果 if (requestCode == 1) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 请求位置更新 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); } else { // 权限被拒绝 } } } @Override public void onLocationChanged(Location location) { // 获取经纬度信息 double latitude = location.getLatitude(); double longitude = location.getLongitude(); // TODO: 处理经纬度信息 } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } } ``` 这个代码通过获取位置管理器,检查是否有权限获取位置信息,请求权限,请求位置更新等步骤获取经纬度信息。在 `onLocationChanged` 方法中,可以获取到最新的经纬度信息,可以在其中进行后续的处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是鱼染哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值