“21 天好习惯”第一期-8

Posted 嘿,请叫我小哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“21 天好习惯”第一期-8相关的知识,希望对你有一定的参考价值。

来记录今天我学了些什么,尽管东碰西碰花了我许多时间,但我觉得还是挺有意思的,篇幅有点长

一.位置服务

1.获取LocationProvider(常用的LocationProvider有gps,network,passive)

看我项目结构

MainActivity代码如下(注释编号1,2,3分别是三种获取方式,运行结果分别对应(1)(2)(3))

import android.location.Criteria;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.WindowManager;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private TextView textView; //定义用于显示LocationProvider名称的TextView组件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);  //设置全屏显示
        textView = (TextView) findViewById(R.id.provider); //获取显示LocationProvider名称的TextView组件
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        //1.获取所有的LocationProvider
        /*List<String> providerNames = locationManager.getAllProviders();//获取所有的LocationProvider名称
        StringBuilder stringBuilder = new StringBuilder(); //字符串构建器
        for(Iterator<String> iterator = providerNames.iterator();iterator.hasNext();){
            stringBuilder.append(iterator.next()+"\\n");
        }
        textView.setText(stringBuilder.toString()); //显示获得的LocationProvider名称
*/
        //2.获取基于GPS的LocationProvider
        //LocationProvider locationProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER);//获取基于GPS的LocationProvider
        //textView.setText(locationProvider.getName()); //获取LocationProvider名称

        //3.获取最佳的LocationProvider
        Criteria criteria = new Criteria(); //创建一个过滤条件对象
        criteria.setCostAllowed(false); //不收费的
        criteria.setAccuracy(Criteria.ACCURACY_FINE); //使用精度最精确的
        criteria.setPowerRequirement(Criteria.POWER_LOW); //使用耗电量最低的
        String provider = locationManager.getBestProvider(criteria,true); //获取最佳的LocationProvider名称
        textView.setText(provider); //显示获取的最佳LocationProvider名称
    }
}

 MainActivity布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25dp"
        android:textStyle="bold"
        android:layout_above="@+id/provider"
        android:text="可用LocationProvider"
        android:layout_centerInParent="true"/>

    <TextView
        android:id="@+id/provider"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:textStyle="bold"
        android:layout_centerInParent="true"/>

</RelativeLayout>

 在AndroidManifest.xml的manifest中添加如下权限代码(注意:现在的android版本只在AndroidManifest.xml的manifest中添加权限代码是没用的,你还需要实现动态获取权限的,即用代码实现动态获取权限,如果你没有实现,那么就需要在设置手动打开相应的权限)                

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">

 运行结果(1)

 运行结果(2)

运行结果(3)

2.获取定位信息

步骤:

a.获取系统的LocationManager对象

b.设置监听器

c.获取最近的定位信息

看我项目结构

MainActivity代码如下


import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.WindowManager;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity {

    private TextView text; //定义用于显示LocationProvider的TextView组件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏显示
        text = (TextView) findViewById(R.id.provider);
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        //权限检查
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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;
        }
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, //指定GPS定位的提供者
                1000, //间隔时间
                1, //位置间隔1米
                new LocationListener() {
                    @Override
                    public void onLocationChanged(@NonNull Location location) {

                    }
                }
        );
        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); //获取最新的位置信息
        locationUpdates(location); //将最新的定位信息传递给locationUpdates()方法
    }
    public void locationUpdates(Location location){
        if(location!=null){
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("您现在的位置为:\\n");
            stringBuilder.append("经度:");
            stringBuilder.append(location.getLongitude());
            stringBuilder.append("\\n纬度");
            stringBuilder.append(location.getLatitude());
            text.setText(stringBuilder.toString()); //显示到页面上
        }else {
            text.setText("获取GPS信息失败");
        }
    }
}

MainActivity布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/provider"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="25dp"
        android:textStyle="bold" />

</LinearLayout>

在AndroidManifest.xml的manifest中添加如下权限代码(注意:现在的android版本只在AndroidManifest.xml的manifest中添加权限代码是没用的,你还需要实现动态获取权限的,即用代码实现动态获取权限,如果你没有实现,那么就需要在设置手动打开相应的权限。虽然一样的话重复了两遍,但我觉得没毛病,因为这个很容易被忘记)

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

运行结果

why?其实是模拟器的问题,你需要连接真机(自己的手机)来测试,运行结果如下

二.应用百度地图API开发地图APP

1.申请密钥(API Key)百度地图开放平台 | 百度地图API SDK | 地图开发 (baidu.com)

首页,往下滑

如果你没有百度账号就注册一个,这里是需要百度账号登录的

 登录成功后的界面,应用名称取决你自己,应用类型选择Android SDK

 往下滑,这里需要获取SHA值

获取SHA值

Android Studio中进入Terminal

cd .android (.android文件一般在你安装SDK的地方,如果你的.android 在其他文件夹下,请cd进入该文件),然后输入 keytool -list -v - keystore test. keystore

然后大部人都会遇到上面的报错问题,如何解决呢?其实很简单,既然找不到,那么我们就自己找keytool工具,然后再输入上面命令就行了,首先,我们需要找到自己的 jdk 所在的路径(一般安装在C盘),keytool就在该文件夹里面,如下图所示

 进入你的jdk目录下(你也可以把keytool路径设为系统环境变量,这里我就把keytool路径设为系统环境变量),然后输入: keytool -list -v -keystore G:\\APK\\MyApp.jks(MyApp.jks是在你打包时需要用到的,如果你没有,可以自己创建一个,创建方法很简单我就不讲了,有时间我会单独写一篇关于如何打包APK的文章)

 会发现证书链长度为0,这是因为你没有输入密钥口令,输入密钥口令(输入的时候它是不会显示你输入的值的,不要觉得奇怪,尽管输入),如果你忘记了,那就重新生成keystore,重新发布一个新的应用,这是最简单的方式,如果之前那个对你很重要的话那你只能尝试下载 jar 包并用官方提供的破解方法进行破解了,有点小麻烦

  对了说一下我经历的,就是如果你想利用cmd 命令窗口重新生成一个keystore 文件的话,那么如果你的 jdk 安装在C盘当中,那么我还是建议你把 keytool 路径设为系统环境变量,因为jdk安装在C盘当中,而C盘都是只读文件,在C盘当中生成 android.keystore 文件的话,是没有写入权限的。所以会报 keytool 错误: java.io.FileNotFoundException: android.keystore (拒绝访问。) 

把keytool路径设为系统环境变量,在G盘下生成 android.keystore 文件(只要不在C盘就可以),

然后在输入 keytool -list -v -keystore android.keystore

 到此就成功获得了SHA值,但是这里你还需要知道的是开发版SHA1和发布版SHA1的区别

开发版SHA1:调试用的,可以打包成APK,但是不能发布上线
发布版SHA1:测试或者发布用的,可以打包成APK,也可以正常发布上线

这里我们获取的是发布版SHA1,想了解如何获取开发版SHA1和发布版SHA1,请参考Android 平台签名证书生成 并获取SHA1 详解 - 简书 (jianshu.com)

接下来就是去获取百度地图密钥,将密钥填入,点击提交

 到此就成功获取到了密钥

2.下载百度LBS Android SDK 

 

把BaiduLBS_AndroidSDK_Lib_aar\\libs 文件里的jar包和文件夹分别复制到如下图所示

不要忘了,要把jar包添加到模块,就是按住Ctrl依次选中jar包,然后右键如下图所示

baiduapi模块下的build.gradle (仔细看里面的sourceSets和defaultConfig以及依赖包)

plugins {
    id 'com.android.application'
}

android {
    compileSdk 30

    defaultConfig {
        applicationId "com.example.baiduapi"
        minSdk 21
        targetSdk 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
    }

    defaultConfig {
        ndk {
            // 设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
            abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64"
        }
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    //以下是jar包添加到模块时Android Studio 自动添加的
    implementation files('libs\\\\javapoet-1.9.0.jar')        
    implementation files('libs\\\\protobuf-java-2.3.0-micro.jar')
    implementation files('libs\\\\protobuf_gens-map.jar')

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    //添加依赖包,有很多Baidu依赖包,根据自己需求来添加,这里我就添加一个
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.4.0'

}

 AndroidManifest.xml(仔细看申请的权限和注册的信息,其中value=“xxxx“里的xxxx表示你申请的百度地图密钥)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.baiduapi">

    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:name=".DemoApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication1">
        <!--填写之前申请的百度地图密钥-->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="xxxx" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 MainAtivity代码如下

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import com.baidu.mapapi.map.MapView;

public class MainActivity extends AppCompatActivity {

    private MapView mMapView = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }
}

 DemoApplication代码如下

import android.app.Application;

import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;

public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }
}

注意别忘了要在AndroidManifest.xml的application中加上下面一行代码

android:name=".DemoApplication"

MainActivity布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />

</LinearLayout>

运行结果展示(注意,如果不是动态获取权限,需要手动在设置里打开)

应用百度地图API开发地图APP

如果还有疑问,可以去官网查看详细信息:androidsdk | 百度地图API SDK (baidu.com)

 3.定位我的位置(在上面显示百度地图的基础上进行修改)

看我目录结构

baiduapi模块下的build.gradle(仔细看添加的依赖项)

plugins {
    id 'com.android.application'
}

android {
    compileSdk 30

    defaultConfig {
        applicationId "com.example.baiduapi"
        minSdk 21
        targetSdk 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    sourceSets {
        main {
            jniLibs.srcDir 'libs'
            jni.srcDirs = []    //disable automatic ndk-build
        }
    }

    defaultConfig {
        ndk {
            // 设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
            abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64"
        }
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation files('libs\\\\javapoet-1.9.0.jar')
    implementation files('libs\\\\protobuf-java-2.3.0-micro.jar')
    implementation files('libs\\\\protobuf_gens-map.jar')
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    //添加依赖包,有很多Baidu依赖包,根据自己需求来添加,这里我就添加两个
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.4.0'
    implementation 'com.baidu.lbsyun:BaiduMapSDK_Location_All:9.1.8'

}

AndroidManifest.xml(仔细看添加的权限,这里我把可能用到权限都添加了,其中value=“xxxx“里的xxxx表示你申请的百度地图密钥)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.baiduapi">

    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


    <!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    <application
        android:name=".DemoApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication1">
        <!--填写之前申请的百度地图密钥-->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="xxxx"/>

        <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity代码如下

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;

public class MainActivity extends AppCompatActivity {

    private MapView mMapView = null;
    BaiduMap mBaiduMap=null;
    LocationClient mLocationClient=null;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        //获取到地图
        mBaiduMap = mMapView.getMap();
        //设置地图放大的倍数
        init();
        //设置地图定位的一些参数,如定位图标,精度圈颜色等
        configure();
        //定位初始化
        init_location();

    }
    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();
    }

    @Override
    protected void onPause() {
        mMapView.onPause();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }
    /**
     * 继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView。
     */
    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //mapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null){
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
        }
    }

    /**
     *    设置地图放大的倍数
     */
    public  void init(){
        //设置地图放大的倍数
        MapStatus.Builder  builder=new MapStatus.Builder();
        builder.zoom(18f);
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
    }

    /**
     * 自定义内容:
     * 参数说明
     * (1)定位模式 地图SDK支持三种定位模式:NORMAL(普通态), FOLLOWING(跟随态), COMPASS(罗盘态)
     * (2)是否开启方向
     * (3)自定义定位图标 支持自定义定位图标样式,
     * (4)自定义精度圈填充颜色
     * (5)自定义精度圈边框颜色
     */
    public void configure(){
        mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING,true,
                BitmapDescriptorFactory.fromResource(R.drawable.dinwei),
                0xAAFFFF88,0xAA00FF00));
    }

    /**
     * 定位的初始化
     */
    public void init_location(){
        mBaiduMap.setMyLocationEnabled(true);
        mLocationClient = new LocationClient(MainActivity.this);
//通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
//设置locationClientOption
        mLocationClient.setLocOption(option);
//注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
        mLocationClient.start();
    }
}

 DemoApplication代码如下


import android.app.Application;

import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;

public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }
}

运行一下,发现报了错误信息

 再次运行(这里我采用的是Android Studio自带的模拟器运行的,你们可以用自己的手机测试,我用了一下显示的位置就是我所在的位置,挺有意思的),如果你还不会如何用手机调试,请看

(14条消息) “21 天好习惯”第一期-6_嘿,请叫我小哥的博客-CSDN博客

如果你把这篇文章看完了,并且亲自实践了一遍,那你就真的是太棒了,有成为大佬的潜质

如果觉得我写的不够详细或者还有其他疑问可以去官网查看或者百度,当然你要是觉得我还行的话,也可以给我留言,我不能保证帮你解决,当我一定会尽力而为。

官网链接: Android地图SDK | 百度地图API SDK (baidu.com)

以上是关于“21 天好习惯”第一期-8的主要内容,如果未能解决你的问题,请参考以下文章

“21天好习惯”第一期-1 飞机大战-4

“21天好习惯”第一期——16

“21天好习惯”第一期-1 JavaScript实现倒计时

云原生社区第一期直播预告

红帽Linux入门指南第一期:红帽 RHEL 8.0 操作系统安装步骤详解

《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片