Android百度地图api调用

1.首先,准备工作。前往百度地图开放平台

  • 注册百度开发者账号,创建应用,获取API key
    地址:http://lbsyun.baidu.com/apiconsole/key
  • 创建应用需要应用的数字签名SHA1和包名
    SHA1可以通过双击gradle里面的signingReport

在这里插入图片描述
便会在在下方出现图示SHA1值
在这里插入图片描述
包名,直接打开AndroidManifest.xml文件复制package后面的值过去即可
在这里插入图片描述

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

  1. 抛出异常“error inflating class com.baidu.mapapi.map.mapview"
    解决办法:其实都是一个原因 就是 初始化
    在 onCreate()中加入SDKInitializer.initialize(getApplicationContext());即可
    //示例代码已经添加
    原链接:https://www.cnblogs.com/dubo-/p/8059460.html

猜你喜欢

转载自blog.csdn.net/police_1/article/details/85315091