作者:郭霖
书名:第一行代码Android第2版
出版社:人民邮电出版社
感谢此书籍原创者,如有侵犯您的知识产权和版权问题,请通知本人,本人会即时做出处理并删除文章
Email:[email protected]
感谢您阅读我的文章,未经本人许可,文章不得用于商业用途。转载请注明出处,否则属于侵权行为。
首先需要注册百度账号,登陆百度账号,打开网址 http://developer.baidu.com/user/info 填写注册信息并提交,然后去自己的邮箱通过验证,就完成注册了。
接着访问 https://lbsyun.baidu.com/apiconsole/key 会看到下面这个界面
点击 创建应用 申请 API Key, 应用名称可以随便填,这里填 LBSTest,应用类型选择 Android SDK,启用服务保持沉默即可,如下图所示
发布版 SHA1 是打包程序时所用的签名文件的 SHA1 指纹,可以通过 Android 查看,新建一个 Android Studio 项目,如图(开发版 SHA1 我们等下再说)
接下来,一路 Next,就可以了。
点击右侧 Gradle,然后点击标红的 Sync 按钮,
然后会出现下图
点击 :app --> Task --> android -->
双击 signingReport, 我们即可得到 发布版SHA1 指纹
把 SHA1: 后面的字符复制到创建百度地图应用界面的对应位置,
开发版的 SHA1 我们需要创建一个正式的签名文件,点击 Android Studio 顶部工具栏中的 Build --> Generate Signed APK,弹出如下窗口
点击 Create new… 弹出如下窗口
点击第一行的三个点,弹出如下窗口,选择签名文件保存的路径,并填写签名文件名称,并点击 OK
填写密码和名字
点击 OK,会回到如下界面,然后关闭这个窗口
然后按 win + r 输入 cmd 输入如下命令,
keytool -list -v -keystore <签名文件路径>
比如我创建的签名文件路径为 D:\miyao.jks\LBSTest.jks ,如图
输入你刚才设置的密码,如图
把 SHA1:后的字符复制到创建百度地图应用界面的对应位置。
包名这里我们填 com.example.a83445.lbstest (包名在我们创建 Android project 的界面中已经设置了)
点击提交,应用就创建成功了
上图中 OmVEuKl1IxomNQ1jq1qlGnePFpwsIdq6 就是我们申请到的 API Key。
建议在手机上运行调试
在开始编码之前,我们需要下载百度 LBS 开放平台的 SDK,下载地址为 http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar 选择 基础定位 和 基础地图 然后点击 开发包 下载按钮
解压下载的文件,在下载文件中 libs 目录下的内容分为两部分,如图,BaiduLBS_Android.jar 是 Java 层要使用的,其他子目录下的 so 文件时 Native 层要用到的。so 文件是用 C/C++ 语言编写的,然后再用 NDK 编译出来的。 我们这里不需要编写 C/C++ 的代码,因为百度都已经做好了封装, 但是我们需要将 libs 目录下的每一个文件都放到正确的位置。
观察一下当前的项目结构, app 模块下有一个 libs 目录,这里就是用来存放所有 Jar 包的,我们将 BaiduLBS_Android.jar 复制到这个目录下,如下图所示
接下来,展开 src/main 目录,鼠标右键点击该目录–>New–>Directory, 创建一个名为 jniLibs 的目录,这个目录是专门用来存放 so 文件的,然后把压缩包里的其他所有目录直接复制到这里,如图
为了让项目引用到 Jar 包中提供的接口,我们需要点击一下 Android Studio 顶部工具栏的 Sync 按钮(就是我前面圈出来那个按钮)
点击 Sync 之后,libs 目录下的 jar 文件就会多出一个向右的箭头,表示项目已经能引用到这些 jar 包
这样我们就把 LBS 的 SDK 都准备好了,接下来就可以开始编码了
MainActivity.java 代码如下
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationClient;
private MapView mapView;
private BaiduMap baiduMap;
private boolean isFirstLocate = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
SDKInitializer.initialize(getApplicationContext());//初始化
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);//用于显示我的位置
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()){
String[] permissions = permissionList.toArray(new String[permissionList.
size()]);
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
}else {
requestLocation();
}
}
//用于首次定位让地图移动到当前位置
private void navigateTo(BDLocation location){
if(isFirstLocate){
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());//用于存放经纬度
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);//缩放级别
baiduMap.animateMapStatus(update);
isFirstLocate = false;
}
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(location.getLatitude());
locationBuilder.longitude(location.getLongitude());
MyLocationData locationData = locationBuilder.build();
baiduMap.setMyLocationData(locationData);
}
private void requestLocation() {
initLocation();
mLocationClient.start();//start方法开始定位
}
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);//5秒更新一次位置信息
option.setIsNeedAddress(true);//启用详细位置
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//使用GPS定位
mLocationClient.setLocOption(option);
}
@Override
protected void onResume(){
super.onResume();
mapView.onResume();
}
@Override
protected void onPause(){
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy(){
super.onDestroy();
mLocationClient.stop();//活动销毁
mapView.onDestroy();
baiduMap.setMyLocationEnabled(false);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "必须同意所有权限才能使用本程序",
Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
}else{
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(final BDLocation location){
if(location.getLocType() == BDLocation.TypeGpsLocation
|| location.getLocType() == BDLocation.TypeNetWorkLocation){
navigateTo(location);
}
}
}
}
activity_main.xml 布局文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
//地图控件使其占满整个屏幕
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
LinearLayout>
权限文件 AndroidManifest.xml 代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a83445.lbstest">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<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"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
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/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="OmVEuKl1IxomNQ1jq1qlGnePFpwsIdq6" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
//注册百度 LBS SDK 服务
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
service>
application>
至此,Android 百度地图初步开发完成