android:label="@string/app_name"
android:name=".BaiduMapApplication" >
<activity
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name"
android:name=".BaiduMapMyLocationActivity"
android:screenOrientation="sensor" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:enabled="true"
android:name="com.baidu.location.f"
android:process=":remote" />
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<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.CALL_PHONE" >
</uses-permission>
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</permission>
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCES_MOCK_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="false"
android:resizeable="true"
android:smallScreens="true" />
初始化地图引擎对象,存放共享资源,继承自Application。
package com.easi.baidu.map;
import android.app.Application;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
/**
-
初始化地图引擎对象,存放共享资源。
-
需要在AndroidMinifest.xml文件中的application标签添加name属性。
-
{@link #}
-
@author android_ls
*/
public class BaiduMapApplication extends Application {
/**
* 申请的百度地图API Key密钥
*/
private static final String BAIDU_MAP_KEY = "8BB7F0E5C9C77BD6B9B655DB928B74B6E2D838FD";
/**
* Log打印标签
*/
private static final String TAG = "BaiduMapApplication";
/* package */BMapManager mMapManager;
/* package */Context mContext;
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "BaiduMapApplication onCreate()");
mContext = getApplicationContext();
mMapManager = new BMapManager(getApplicationContext());
initMapManager();
}
/**
* 初始化BMapManager对象
*
* @return boolean
*/
public void initMapManager() {
boolean result = mMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {
@Override
public void onGetNetworkState(int error) {
if (error == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(mContext, "您的网络出错啦!", Toast.LENGTH_LONG).show();
} else if (error == MKEvent.ERROR_NETWORK_DATA) {
Toast.makeText(mContext, "输入正确的检索条件!", Toast.LENGTH_LONG).show();
}
}
@Override
public void onGetPermissionState(int error) {
if (error == MKEvent.ERROR_PERMISSION_DENIED) {
// 授权Key错误:
Toast.makeText(mContext, "您的授权Key出错!", Toast.LENGTH_LONG).show();
}
}
});
if (!result) {
Toast.makeText(mContext, "初始化地图引擎失败!", Toast.LENGTH_LONG).show();
} else {
Log.i(TAG, "地图引擎初始化成功!");
}
}
@Override
public void onTerminate() {
Log.i(TAG, "BaiduMapApplication onTerminate()");
if (mMapManager != null) {
mMapManager.destroy();
mMapManager = null;
}
super.onTerminate();
}
}
需要用到百度地图的Activity基类,继承自Activity
package com.easi.baidu.map;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
/**
-
需要用到百度地图的Activity基类
-
#public class BaiduMapMyLocationActivity extends BaiduMapBaseActivity{}
-
@author android_ls
*/
public abstract class BaiduMapBaseActivity extends Activity {
/**
* Application对象的引用
*/
protected BaiduMapApplication mApplication;
/**
* 显示地图的View组件
*/
protected MapView mMapView;
/**
* MapView控制器对象的引用
*/
protected MapController mMapController;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApplication = (BaiduMapApplication) this.getApplication();
if (mApplication.mMapManager == null) {
Log.e("BaiduMapApplication", "BaiduMapBaseActivity mApplication.mMapManager is NULL!");
mApplication.mMapManager = new BMapManager(mApplication.mContext);
mApplication.initMapManager();
}
setContentView(getLayoutId());
mMapView = (MapView) this.findViewById(getMapViewId());
mMapController = mMapView.getController();
}
/**
* 获取代表布局文件的ID
* #setContentView(getLayoutId());
* @return int
*/
public abstract int getLayoutId();
/**
* 获取代表MapView对象的组件ID
* #(MapView) this.findViewById(getMapViewId());
* @return int
*/
public abstract int getMapViewId();
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
mMapView.destroy();
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
}
定位功能具体实现类,继承自BaiduMapBaseActivity
package com.easi.baidu.map;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint;
/**
-
提供通过GPS或者3G/2G网络(基站)定位,并将定位的结果(我当前的位置)标注在百度地图上。
-
当用户点击地图上代表“我的当前位置”的点时,显示当前我所在位置的详细信息。
-
注:当gps可用,而且获取了定位结果时,不再发起网络请求,直接返回给用户坐标。
-
如果gps不可用,再发起网络请求,进行定位。
-
@author android_ls
*/
public class BaiduMapMyLocationActivity extends BaiduMapBaseActivity {
/**
* Log打印标签
*/
private static final String TAG = "BaiduMapMyLocationActivity";
/**
* 定位SDK的核心类
*/
private LocationClient mLocationClient;
/**
* 显示定位结果详细信息的View
*/
private TextView tvLocationResult;
/**
* 标注我的位置的覆盖物
* # class LocationOverlay extends MyLocationOverlay{}
*/
private MyLocationOverlay mLocationOverlay;
/**
* 我的位置信息数据
*/
private LocationData locData;
/**
* 定位结果处理器
* # class MyLocationListener implements BDLocationListener{}
*/
private MyLocationListener mLocationListener;
/**
* 暂时缓存我的当前位置数据
*/
private BDLocation mBDLocation;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "BaiduMapMyLocationActivity onCreate()");
mMapController.setZoom(15);
mMapController.enableClick(true);
tvLocationResult = (TextView) this.findViewById(R.id.tv_location_result);
mLocationClient = new LocationClient(this.getApplicationContext());
mLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mLocationListener);
LocationClientOption locationOption = new LocationClientOption();
locationOption.setOpenGps(true);
locationOption.setCoorType("bd09ll");
locationOption.setPriority(LocationClientOption.GpsFirst);
locationOption.setAddrType("all");
locationOption.setProdName("通过GPS定位");
mLocationClient.setLocOption(locationOption);
Log.i(TAG, "BaiduMapMyLocationActivity 开启定位");
mLocationClient.start();
// 重新定位
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mLocationClient != null && mLocationClient.isStarted())
mLocationClient.requestLocation();
}
});
mLocationOverlay = new LocationOverlay(mMapView);
// 百度官方API文档解释:打开指南针,但是我试验觉得默认指南针就是打开的
// mLocationOverlay.enableCompass();
locData = new LocationData();
tvLocationResult.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tvLocationResult.setVisibility(View.GONE);
}
});
}
class LocationOverlay extends MyLocationOverlay {
public LocationOverlay(MapView mapView) {
super(mapView);
}
// 处理在“我的位置”坐标上的点击事件。
@Override
protected boolean dispatchTap() {
Log.i(TAG, "BaiduMapMyLocationActivity 处理在“我的位置”坐标上的点击事件 dispatchTap()");
if (mBDLocation != null) {
showLocation(mBDLocation);
}
return super.dispatchTap();
}
}
/**
* 显示我当前位置的详细信息
* @param location
*/
private void showLocation(BDLocation location) {
StringBuffer sb = new StringBuffer(256);
sb.append(" time : ");
sb.append(location.getTime());
sb.append("\n error code : ");
sb.append(location.getLocType());
sb.append("\n latitude : ");
sb.append(location.getLatitude());
sb.append("\n lontitude : ");
sb.append(location.getLongitude());
// 判断是否有定位精度半径
if (location.hasRadius()) {
// 获取定位精度半径,单位是米
float accuracy = location.getRadius();
Log.i(TAG, "accuracy = " + accuracy);
sb.append("\n radius : ");
sb.append(location.getRadius());
}
if (location.getLocType() == BDLocation.TypeGpsLocation) {
if (location.hasSpeed()) {
sb.append("\n speed : ");
sb.append(location.getSpeed());
}
if (location.hasSateNumber()) {
sb.append("\n satellite : ");
sb.append(location.getSatelliteNumber());
}
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。
if (location.hasAddr()) {
String address = location.getAddrStr();
Log.i(TAG, "address = " + address);
sb.append("\n addr : ");
sb.append(address);
}
}
tvLocationResult.setVisibility(View.VISIBLE);
tvLocationResult.setText(sb);
}
/**
* 在地图上标注定位得到我当前的位置
* @param location
*/
private void markLocation(BDLocation location) {
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
locData.direction = location.getDerect();
// 判断是否有定位精度半径
if (location.hasRadius()) {
// 获取定位精度半径,单位是米
locData.accuracy = location.getRadius();
}
mLocationOverlay.setData(locData);
mMapView.getOverlays().add(mLocationOverlay);
mMapView.refresh();
// 将我的当前位置移动到地图的中心点
mMapController.animateTo(new GeoPoint(
(int) (locData.latitude * 1e6),
(int) (locData.longitude * 1e6)));
}
class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null) {
return;
}
Log.i(TAG, "BaiduMapMyLocationActivity onReceiveLocation()");
// TODO 为方便测试查看
testLog(location);
// 在地图上标注定位得到我当前的位置
markLocation(location);
最后
由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。