前言
这个项目是老早时候做的了,今天突然想写博客记录一下。首先需要安装配置好Java开发环境,并选择任意一款Android开发工具进行编程,推荐下载安装Android Studio软件进行程序开发。在开始进行Android编程开发之前需要对Java基础知识有一定的了解和掌握。在开始之前,记得导入定位及地图的相关jar包,Android Studio用gradle管理依赖(当然maven仓库也是管理依赖的一个比较好的工具)。
一、要求
结合百度地图开放平台:百度地图开放平台 | 百度地图API SDK | 地图开发或者高德地图开放平台:高德开放平台 | 高德地图API实现Android地图开发功能小案例,需求如下(以百度地图开放平台开发为例):
1、通过添加View控件显示地图,能够显示出地图的默认位置、地图名称等信息。
2、实现切换地图类型的功能,对于地图SDK提供了3种主要的地图类型,即普通地图、卫星图和空白地图。用户通过点击对应的按钮,能够实现不同类型地图之间的相互切换功能。
二、申请AK密钥
1、首先找到一个地图开放平台,这里以百度地图开放平台为例,步骤如下:进入百度地图开放平台,拉到最底下,进行登录注册,然后进入应用管理,点击创建应用。
2、输入应用名称,可以自己随意编辑,比如输入:地图,然后选择应用类型:Android SDK。启用服务不用管,系统默认的就行,输入发布版的SHA1密钥。
3、获取SHA1密钥 。
(1) 运行进入控制台:运行 -> 输入cmd -> 确定
(2)在控制台内,定位到.android文件夹,输入cd .android
(3)输入keytool -list -v -keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android,如有申请过可以直接回车)
(4)最后输入你应用的包名,然后点击“提交”完成应用的配置工作,就会得到一个创建的AK密钥。
三、关键代码分析
1、首先获取各种权限,包括网络权限等,在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_SYNC_SETTINGS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
2、添加开发秘钥apikey,需要去百度地图开放平台申请,见步骤二
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你的秘钥"/>
3、初始化及获取地图控件引用 ,在使用SDK各组件之前初始化context信息,传入ApplicationContext,注意该方法要在setContentView方法之前实现
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 myMap = (MapView) findViewById(R.id.bmapView); mBaiduMap=myMap.getMap(); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); }
4、用分支语句实现地图样式的切换
public void setMapMode(View view) { boolean checked = ((RadioButton) view).isChecked(); switch (view.getId()) { case R.id.normal: if (checked) { mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); } break; case R.id.statellite: if (checked) { mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); } break; case R.id.blank: if (checked) { mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE); } break; default: break; } }
5、地图生命周期的管理
onResume():是在启动activity启动之后才能执行的,也就是恢复执行。
onPause():当Activity进入后台并且该Activity并未被销毁时,该方法会被调用。
onDestroy():生命周期的销毁操作。
@Override protected void onResume() { super.onResume(); //在activity执行onResume时执行myMap.onResume(),实现地图生命周期管理 myMap.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行myMap.onPause(),实现地图生命周期管理 myMap.onPause(); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行myMap.onDestroy(),实现地图生命周期管理 myMap.onDestroy(); }
四、全部代码
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout 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" android:fitsSystemWindows="true" tools:context="com.android.mybd.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="#000" app:popupTheme="@style/AppTheme.PopupOverlay" app:titleTextColor="#FDFCFC"/> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" /> </android.support.design.widget.CoordinatorLayout>
content_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" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.android.mybd.MainActivity" tools:showIn="@layout/activity_main"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <RadioGroup android:id="@+id/RadioGroup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="2" android:background="#2E2A2A" android:orientation="horizontal"> <RadioButton android:id="@+id/normal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:onClick="setMapMode" android:text="普通图" android:layout_marginLeft="5dp" android:textColor="#FFF" tools:ignore="OnClick" /> <RadioButton android:id="@+id/statellite" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:onClick="setMapMode" android:text="卫星图" android:textColor="#FFF" tools:ignore="OnClick" /> <RadioButton android:id="@+id/blank" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:onClick="setMapMode" android:text="空白地图" android:textColor="#FFF" tools:ignore="OnClick" /> </RadioGroup> <Button android:id="@+id/btn_01" android:layout_width="80dp" android:layout_height="match_parent" android:background="#131313" android:gravity="center" android:text="清除缓存" android:textColor="#FFF" /> </LinearLayout> </RelativeLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.android.mybd"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="秘钥"/> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
MainActivity.java:
package com.android.mybd; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.RadioButton; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapView; public class MainActivity extends AppCompatActivity { private MapView myMap = null; private BaiduMap mBaiduMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 myMap = (MapView) findViewById(R.id.bmapView); mBaiduMap=myMap.getMap(); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行myMap.onResume(),实现地图生命周期管理 myMap.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行myMap.onPause(),实现地图生命周期管理 myMap.onPause(); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行myMap.onDestroy(),实现地图生命周期管理 myMap.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void setMapMode(View view) { boolean checked = ((RadioButton) view).isChecked(); switch (view.getId()) { case R.id.normal: if (checked) { mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); } break; case R.id.statellite: if (checked) { mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); } break; case R.id.blank: if (checked) { mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE); } break; default: break; } } }
五、结果
1、主界面图,默认勾选普通图:
2、卫星图展示:
3、空白地图展示: