资讯详情

13.Android学习之传感器与定位服务(四)

5.百度地图服务

5-1.获得地图API密钥

5-2.下载SDK 开发包

5-3.创建和使用百度地图API的项目

5-4.定位到我的位置


本文5-3和5-4节的代码部分转载自(112条消息) 第一行代码 百度地图 报错 not agree privacyMode, please invoke SDKInitializer.setAgreePrivacy(Context, boolean)_Fly1562的博客-CSDN博客

5.百度地图服务

百度地图服务是目前常用的地图服务。为了便于Android开发者使用百度地图,百度提供百度地图Android SDK。它是一套基于Android 2.1及以上版本设备的应用接口适用于Android地图应用开发系统移动设备。调用地图SDK接口可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图应用。

5-1.获得地图API密钥

使用百度地图Android SDK首先,你需要申请密钥(API Key)。如果没有API密钥不会返回任何地图块到应用程序(map tile)。由于密钥与百度账号相关,也与创建过程名称有关,因此在申请密钥之前,必须先注册百度账号。获取地图API密钥的具体步骤如下:

(1)在浏览器的地址栏中输入密钥申请地址:登录百度账户。百度账户注册后,输入账户和密码登录百度账户。如果您不注册为百度开发人员,您还需要注册为百度开发人员。此时,页面将自动跳转到百度地图开放平台开发人员激活页面。

(2)百度地图开放平台开发者激活后,单击申请密钥按钮,进入下图所示的创建应用页面。

输入的包名必须与创建的应用包名一致!

安全码的组成规则如下:Android 签名证书的SHA1值 “;” packagename (即:数字签名 英语状态下的分号 包名)。在安全码的组成规则中,需要获得以下两部分:

◆获取Android签名证书的SHA1值

cmd进入控制台,执行以下操作:

◆获取包名

包名是在AndroidManifest.xml中,通过package如图所示:

(3)单击提交按钮,返回到如图所示的应用列表页面,新创建的应用的应用程序。

5-2.下载SDK 开发包

要开发百度地图应用,需要下载百度地图SDK开发包可以去百度地图API具体下载步骤如下:

(1)在浏览器地址栏输入网站:(112条消息) 第一行代码 百度地图 报错 not agree privacyMode, please invoke SDKInitializer.setAgreePrivacy(Context, boolean)_Fly1562的博客-CSDN博客,进入百度地图API点击主页Android地图SDK单击页面左侧的产品下载超链接进入下载页面。

(2)单击自定义下载按钮,输入如图所示的页面,并根据自己的项目需要在页面中检查相应的功能。

(3)选择如图所示的资源,单击开发包按钮开始下载(开发包格式为JAR)。下载后,您将获得一个名称 文件。这就是所需要的。SDK开发包。

5-3.创建和使用百度地图API的项目

具体步骤如下:

(1)将工程结构类型切换为Project,再次压缩下载BaiduLBS_ AndroidSDK_Lib.zip文件,其中之一libs目录下的.jar文件复制到Android Studio中该Module的libs 文件夹中,如图所示。

(2)选中.jar文件,单击右键,选择弹出快捷菜单Add As Library...菜单项,添加百度类库。

(3)在src\main在目录中新建目录jnilibs,并将lib复制目录下的所有文件夹jnilibs目录中。

(4)在AndroidManifest.xml文件的<application>标记中添加<meta-data>用于指定密钥的子标记开发。

<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="MXrarkfRCGLaHGVEGNpRqTxH8es005pr"/>

其中,value该值为百度地图上申请的密钥值。

(5)在AndroidManifest.xml所需权限添加到文件中。

   ///获取设备网络状态,禁用后无法获得网络状态   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    //网络权限,禁用后无法检索等相关业务   <uses-permission android:name=
        
         "android.permission.INTERNET"
         />
    //读取设备硬件信息,统计数据
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    //读取系统信息,包含系统版本等信息,用作统计
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    //获取设备的网络状态,鉴权所需网络代理
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    //允许sd卡写权限,需写入地图数据,禁用后无法显示地图
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    //这个权限用于进行网络定位
    <uses-permission android:name="android.permission.WRITE_SETTINGS"        tools:ignore="ProtectedPermissions" />
    //这个权限用于访问GPS定位
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    //获取统计数据
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    //使用步行AR导航,配置Camera权限
    <uses-permission android:name="android.permission.CAMERA" />
    //程序在手机屏幕关闭后后台进程仍然运行
    <uses-permission android:name="android.permission.WAKE_LOCK" />

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

package com.example.baidumap;
​
import android.app.Application;
​
import com.baidu.location.LocationClient;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
​
/** * Created by lyr * on 2022/7/26 */
public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.setAgreePrivacy(getApplicationContext(),true);
        SDKInitializer.initialize(getApplicationContext());
        SDKInitializer.setCoordType(CoordType.BD09LL);
        LocationClient.setAgreePrivacy(true);
    }
}

在AndroidManifest.xml文件的application节点下添加:

android:name=".DemoApplication"

package com.example.baidumap;
​
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.MapView;
​
public class MainActivity extends AppCompatActivity {
    private MapView mMapView;//声明地图组件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());//初始化地图SDK,一定要放在setContentView之前
        setContentView(R.layout.activity_main);
        mMapView = (MapView) findViewById(R.id.bmapView);
​
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();
    }
​
    @Override
    protected void onResume() {
        super.onResume();
        mMapView.onResume();
        mMapView = null;
    }
​
    @Override
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }
​
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }
}

在运行使用百度地图API的程序时,需要连接互联网。

需要在权限管理中把需要使用的权限打开。

运行效果图:

 

5-4.定位到我的位置

在实现定位到我的位置时,首先要开启定位图层,可以使用com.baidu.mapapi.map.BaiduMap对象的setMyLocationEnabled()方法实现。该方法的语法格式如下:

public final void set MyLocationEnabled(boolean enabled)

其中,enabled 参数用于指定是否允许定位图层,值为true时表示允许,否则为不允许。开启定位图层的代码如下:

mBaiduMap.setMyLocationEnabled(true);

然后创建MyLocationData对象,用于构造定位数据,包括GPS定位时方向角度、纬度坐标、经度坐标、定位精度和时速等。例如,构造定位数据,指定GPS定位时方向角度为100、坐标位置为当前位置,可以使用下面的代码。

MyLocationData locData = new MyLocationData.Builder()
    .accuracy(location.getAccuracy())  //设置精度
    .direction(100)  //此处设置开发者获取到的方向信息,顺时针0~360度
    .latitude(location.getLatitude())  //设置纬度坐标
    .longitude(location.getLongitude())  //设置经度坐标
    .build();

此处代码将使用Android 原有定位方法。

再设置定位数据,并配置定位图层的一些信息。 代码如下:

mBaiduMap.setMyLocationData(locData);
//设置自定义定位图标
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
    .fromResource(R.drawable.icon_geo);
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;   //设置定位模式
//位置构造方式,将定位模式,定义图标添加其中
MyLocationConfiguration config = new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker);
mBaiduMap.setMyLocationConfiguration(config);  //地图显示定位图标

最后,在不需要定位图层时关闭定位图层。代码如下:

mBaiduMap.setMyLocationEnabled(false);  //关闭定位图层

例:

 

该实例在5-3中的项目的基础上进行修改。

package com.example.mylocation;
​
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
​
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.util.Log;
import android.widget.Toast;
​
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
​
public class MainActivity extends AppCompatActivity {
    private MapView mMapView;//百度地图组件
    private BaiduMap mBaiduMap;//定义百度地图对象
    private boolean isFirstLoc=true;//记录是否是第一次定位
    private MyLocationConfiguration.LocationMode locationMode;//当前定位模式
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());//初始化地图SDK
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();
​
        mMapView = findViewById(R.id.mapView);
        mBaiduMap = mMapView.getMap();
        //获取系统的LocationManager对象
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
​
        //设置每一秒获取一次location信息
        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,
                1000,//更新数据时间为1秒
                1,//位置间隔为1米
                //位置监听7器
                new LocationListener() {
     
       //GPS定位信息发生改变时触发,用于更新位置信息
                    @Override
                    public void onLocationChanged(@NonNull Location location) {
                        locationUpdates(location);
                    }
                });
        //从GPS获取最新的定位信息
        Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        locationUpdates(location);//将最新的定位信息传递给创建的locationUpdates方法中
    }
​
    //获取指定的查询信息
    public void locationUpdates(Location location) {
        if (location != null) {
            //获取用户当前经纬度
            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            Log.i("location", "纬度:" + location.getLatitude() + " | 经度:" + location.getLongitude());
            if(isFirstLoc){
                //更新坐标位置
                MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(latLng);
                mBaiduMap.animateMapStatus(update);//设置地图位置
                isFirstLoc=false;//取消第一次定位
            }
            //构造定位数据
            MyLocationData locationData=new MyLocationData.Builder().accuracy(location.getAccuracy())
                    .direction(100)//设置方向信息
            .latitude(location.getLatitude())//设置纬度坐标
            .longitude(location.getLongitude())//设置经度坐标
            .build();
            mBaiduMap.setMyLocationData(locationData);//设置定位数据
            //设置自定义图标
            BitmapDescriptor bitmapDescriptor= BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
            locationMode=MyLocationConfiguration.LocationMode.NORMAL;//设置定位模式
            //设置构造方式
            MyLocationConfiguration configuration=new MyLocationConfiguration(locationMode,true,bitmapDescriptor);
            mBaiduMap.setMyLocationConfiguration(configuration);//显示定位图标
        } else {
            Log.i("location", "没有获取到GPS信息");
        }
    }
​
    @Override
    protected void onStart() {
        super.onStart();
        mBaiduMap.setMyLocationEnabled(true);//开启定位图层
    }
​
    @Override
    protected void onStop() {
        super.onStop();
        mBaiduMap.setMyLocationEnabled(false);//停止定位图层
    }
​
    @Override
    protected void onResume() {
        super.onResume();
        mMapView.onResume();
        mMapView = null;
    }
​
    @Override
    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }
​
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }
}

package com.example.mylocation;
​
import android.app.Application;
​
import com.baidu.location.LocationClient;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
​
/** * Created by lyr * on 2022/7/26 */
public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.setAgreePrivacy(getApplicationContext(),true);
        SDKInitializer.initialize(getApplicationContext());
        SDKInitializer.setCoordType(CoordType.BD09LL);
        LocationClient.setAgreePrivacy(true);
    }
}

需要在权限管理中把需要用到的权限打开。

标签: 传感器pr9268201fly传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台