AndroidStudio使用高德地图API获取手机定位

一、高德地图API申请

首先去高德注册开发者账号

下面这两个选项,也是我们项目成功的关键

1.1怎么获取SHA1指纹密码

①使用AS自带的签名文件

你的用户文件下面会有一个.android文件夹,进入文件夹,在这个路径下打开cmd

如果.android下面没有签名文件参考创建文章

输入: keytool -v -list -keystore debug.keystore(debug.keystore是你签名文件的名称)

1.2获取Packagename 报名

二、编写代码

2.1导入Jar包

下载高德地图API Android地图SDK下载

下载完成后

复制jar到项目的libs下面,右键Add As Library

2.2配置AndroidManifest.xml

第一处:<application>标签里面
html 复制代码
<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="你的key">
</meta-data>
<service android:name="com.amap.api.location.APSService" />
第二处:<manifest>标签里面
html 复制代码
    <!--允许应用读取设备的外部存储-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!--用于访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--允许应用程序控制设备的振动功能-->
    <uses-permission android:name="android.permission.VIBRATE" />
    <!--用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!--用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <!--用于申请获取蓝牙信息进行室内定位-->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

位置演示:

三、编写Activity代码(附带自动获取权限)

xml代码

html 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    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=".GDActivity">

    <Button
        android:layout_width="match_parent"
        android:text="高德定位"
        android:layout_height="wrap_content"
        android:id="@+id/btn_01"/>

    <TextView
        android:id="@+id/tv_site"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:layout_marginTop="10dp"
        android:textSize="15sp"/>

</LinearLayout>

Java代码

java 复制代码
package com.example.civilclass;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;

public class GDActivity extends AppCompatActivity implements View.OnClickListener {

    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明定位回调监听器
    public AMapLocationListener mLocationListener = new MyAMapLocationListener();
    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;
    private Button btn_01;
    private TextView tv_site;

    private static final int PERMISSION_REQUEST_LOCATION = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gdactivity);
        initView();

        // 检查定位权限
     if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            // 请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSION_REQUEST_LOCATION);
        } else {
            // 权限已被授予,可以直接使用定位服务
            useLocationServices();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull @org.jetbrains.annotations.NotNull String[] permissions, @NonNull @org.jetbrains.annotations.NotNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_LOCATION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被授予,可以使用定位服务
                useLocationServices();
            } else {
                // 权限被拒绝,显示提示信息
                showPermissionDeniedMessage();
            }
        }
    }

    private void useLocationServices() {
        // 使用定位服务的代码
//        init();
    }

    private void showPermissionDeniedMessage() {
        // 提示用户权限被拒绝的信息
    }

    private void init() {
        //初始化定位
        try {
            AMapLocationClient.updatePrivacyShow(this, true, true);
            AMapLocationClient.updatePrivacyAgree(this, true);
            mLocationClient = new AMapLocationClient(getApplicationContext());
        } catch (Exception e) {
            e.printStackTrace();
        }
        //设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);
        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //获取一次定位结果:
        //该方法默认为false。
        mLocationOption.setOnceLocation(false);

        //获取最近3s内精度最高的一次定位结果:
        //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
        mLocationOption.setOnceLocationLatest(true);
        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.setNeedAddress(true);
        //设置是否允许模拟位置,默认为false,不允许模拟位置
        mLocationOption.setMockEnable(false);
        //关闭缓存机制
        mLocationOption.setLocationCacheEnable(false);
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //启动定位
        mLocationClient.startLocation();

    }

    private void initView() {
        btn_01 = (Button) findViewById(R.id.btn_01);
        tv_site = (TextView) findViewById(R.id.tv_site);

        btn_01.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_01:
                init();
                break;
        }
    }

    private class MyAMapLocationListener implements AMapLocationListener {

        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    Log.e("位置:", aMapLocation.getAddress());
                    tv_site.setText(aMapLocation.getAddress());
                } else {
                    //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
        }
    }
}
相关推荐
咋吃都不胖lyh1 天前
SQL-多对多关系
android·mysql·数据分析
cyy2981 天前
android 屏幕适配
android
Digitally1 天前
如何通过 5 种有效方法同步 Android 和 Mac
android·macos
行墨1 天前
Jetpack Compose 深入浅出(二)——基础组件Text
android
IT森林里的程序猿1 天前
基于Hadoop的京东电商平台手机推荐系统的设计与实现
大数据·hadoop·智能手机
雨白1 天前
深入理解协程的运作机制 —— 调度、挂起与性能
android·kotlin
沐怡旸1 天前
【Android】Android系统体系结构
android
namehu1 天前
React Native 应用性能分析与优化不完全指南
android·react native·ios
xqlily1 天前
Kotlin:现代编程语言的革新者
android·开发语言·kotlin
HelloBan1 天前
如何正确去掉SeekBar的Thumb和按压效果
android