1.首先,准备工作。前往百度地图开放平台
- 注册百度开发者账号,创建应用,获取API key
地址:http://lbsyun.baidu.com/apiconsole/key - 创建应用需要应用的数字签名SHA1和包名
SHA1可以通过双击gradle里面的signingReport
便会在在下方出现图示SHA1值
包名,直接打开AndroidManifest.xml文件复制package后面的值过去即可
- 完成上面的操作之后会出现一下截图的反馈
证明你成功申请到AK - 下载SDK,点击自定义下载,根据需要下载相关资源。请把开发包和示例代码都下载下来。(不懂如何调用就多点看人家的demo代码)
http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
2. 标题下载完之后,把SDK解压,出现libs和readme
然后把libs的文件全部拷贝到Android工程的libs文件夹(没有就新建一个)
3.在app目录下的build.gradle文件里面添加一下代码
defaultConfig {
sourceSets{
main{
//说明so的路径为该libs路径,关联所有地图SDK的so文件,用于生成jniLibs文件夹
jniLibs.srcDirs = ['libs']
}
}
dependencies {
compile fileTree(dir: 'libs' , include: ['*.jar'])
compile files('libs/BaiduLBS_Android.jar')
}
当添加完jniLibs.srcDirs = [‘libs’]之后会自动生成jniLibs文件夹不过需要从project切换到android才能看到(注意:网上很多教程里面写到需要在res里面新建一个jniLibs文件夹把libs的复制过去,试过但是好像不起作用,所以建议添加上述代码自动生成)
4.在AndroidManifest.xml文件添加权限、注册后台service以及添加百度SDK(android:value里面的值要改为之前申请到的AK)
//百度地图权限申请
<!-- 这个权限用于进行网络定位-->
<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.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<application
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你之前申请到的AK"/>
<activity android:name=".ForegroundActivity"/>
//用于展示的Activity
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
</application>
5.新建一个Activity(此处采用百度地图提供的demo源码)
package com.example.a26792.myapplication;
import android.app.Activity;
/**
* Created by ${Saujyun} on 2018/12/23.
*/
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.DotOptions;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.example.a26792.myapplication.Toolkit.NotificationUtils;
/**
* 适配Android 8.0限制后台定位的功能,新增允许后台定位的接口,即开启一个前台定位服务
*/
public class ForegroundActivity extends Activity {
private LocationClient mClient;
private MyLocationListener myLocationListener = new MyLocationListener();
private MapView mMapView;
private BaiduMap mBaiduMap;
private Button mForegroundBtn;
private NotificationUtils mNotificationUtils;
private Notification notification;
private boolean isFirstLoc = true;
private boolean isEnableLocInForeground = false;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//SDK初始化,demo代码里面没有,测试之后添加
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.foreground);
initViews();
// 定位初始化
mClient = new LocationClient(this);
LocationClientOption mOption = new LocationClientOption();
mOption.setScanSpan(5000);
mOption.setCoorType("bd09ll");
mOption.setIsNeedAddress(true);
mOption.setOpenGps(true);
mClient.setLocOption(mOption);
mClient.registerLocationListener(myLocationListener);
mClient.start();
//设置后台定位
//android8.0及以上使用NotificationUtils
if (Build.VERSION.SDK_INT >= 26) {
mNotificationUtils = new NotificationUtils(this);
Notification.Builder builder2 = mNotificationUtils.getAndroidChannelNotification
("适配android 8限制后台定位功能", "正在后台定位");
notification = builder2.build();
} else {
//获取一个Notification构造器
Notification.Builder builder = new Notification.Builder(ForegroundActivity.this);
Intent nfIntent = new Intent(ForegroundActivity.this, ForegroundActivity.class);
builder.setContentIntent(PendingIntent.
getActivity(ForegroundActivity.this, 0, nfIntent, 0)) // 设置PendingIntent
.setContentTitle("适配android 8限制后台定位功能") // 设置下拉列表里的标题
.setSmallIcon(R.drawable.blue) // 设置状态栏内的小图标
.setContentText("正在后台定位") // 设置上下文内容
.setWhen(System.currentTimeMillis()); // 设置该通知发生的时间
notification = builder.build(); // 获取构建好的Notification
}
notification.defaults = Notification.DEFAULT_SOUND; //设置为默认的声音
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
mMapView = null;
mClient.disableLocInForeground(true);
mClient.unRegisterLocationListener(myLocationListener);
mClient.stop();
}
private void initViews(){
mForegroundBtn = (Button) findViewById(R.id.bt_foreground);
mForegroundBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isEnableLocInForeground){
//关闭后台定位(true:通知栏消失;false:通知栏可手动划除)
mClient.disableLocInForeground(true);
isEnableLocInForeground = false;
mForegroundBtn.setText(R.string.startforeground);
} else {
//开启后台定位
mClient.enableLocInForeground(1, notification);
isEnableLocInForeground = true;
mForegroundBtn.setText(R.string.stopforeground);
}
}
});
mMapView = (MapView) findViewById(R.id.mv_foreground);
mBaiduMap = mMapView.getMap();
mBaiduMap.setMyLocationEnabled(true);
}
class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
if (bdLocation == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder().accuracy(bdLocation.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
//地图SDK处理
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
LatLng point = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
OverlayOptions dotOption = new DotOptions().center(point).color(0xAAFF0000);
mBaiduMap.addOverlay(dotOption);
}
}
}
6.新建一个layout文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/bt_foreground"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="@string/startforeground" />
<com.baidu.mapapi.map.MapView
android:id="@+id/mv_foreground"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.baidu.mapapi.map.MapView>
</LinearLayout>
7.途中出现的问题集锦
1.抛出异常“ java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.smallvideo-1/lib/arm/libutility.so: has”
解决办法:在自己工程app目录下build.gradle加上一句话:
defaultConfig {
ndk{
abiFilters "armeabi"
//这句话意思是只加载32位的so文件,那么如果是64位系统的手机肯定也是可以兼容的。
}
}
原链接:https://blog.csdn.net/caonidayeheixiu8/article/details/78831244
- 抛出异常“error inflating class com.baidu.mapapi.map.mapview"
解决办法:其实都是一个原因 就是 初始化
在 onCreate()中加入SDKInitializer.initialize(getApplicationContext());即可
//示例代码已经添加
原链接:https://www.cnblogs.com/dubo-/p/8059460.html