萌新剛剛入門 Android ,想用百度地圖做一個應用,但是屢屢碰壁,請教大佬。。
我已經認真閱讀相關的開發檔案,代碼與示例相差無幾,但是依舊實作不了
總是顯示在北京的默認坐標,讓人摸不著頭腦
本人在校學生,請多多包涵
代碼附在下面,僅僅實作定位顯示功能,請大佬們指教
import android.app.Application;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(getApplicationContext()); // 初始化BaiduSDK庫
SDKInitializer.setCoordType(CoordType.BD09LL); // 設定經緯坐標型別 BD09LL
}
}
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
public class MainActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
private LocationClient mLocationClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView = findViewById(R.id.bmapView); // 獲取地圖控制元件參考
mBaiduMap = mMapView.getMap();
//普通地圖 ,mBaiduMap是地圖控制器物件
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMyLocationEnabled(true);
//定位初始化
mLocationClient = new LocationClient(getApplicationContext());
//通過LocationClientOption設定LocationClient相關引數
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打開gps
option.setCoorType("bd09ll"); // 設定坐標型別
option.setScanSpan(1000);
//設定locationClientOption
mLocationClient.setLocOption(option);
//注冊LocationListener監聽器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
//開啟地圖定位圖層
mLocationClient.start();
mLocationClient.requestLocation();
}
@Override
protected void onResume() {
//在activity執行onResume時執行mMapView. onResume (),實作地圖生命周期管理
mMapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
//在activity執行onPause時執行mMapView. onPause (),實作地圖生命周期管理
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mLocationClient.stop();
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// 銷毀后不在處理新接收的位置
if (location == null || mMapView == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設定開發者獲取到的方向資訊,順時針0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
}
}
}
密鑰用 XXXXXX 替代
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.chd.ecod">
<!-- 訪問網路,進行地圖相關業務資料請求,包括地圖資料,路線規劃,POI檢索等 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 獲取網路狀態,根據網路狀態切換進行資料請求網路轉換 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 讀取外置存盤。如果開發者使用了so動態加載功能并且把so檔案放在了外置存盤區域,則需要申請該權限,否則不需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 寫外置存盤。如果開發者使用了離線地圖,并且資料寫在外置存盤區域,則需要申請該權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 這個權限用于進行網路定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 這個權限用于訪問GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:name=".MyDApplication"
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="https://bbs.csdn.net/topics/XXXXXX" >
</meta-data>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
</service>
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context=".MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</android.support.constraint.ConstraintLayout>
uj5u.com熱心網友回復:
那個android:name=".MyDApplication"
D是多打的,源代碼里沒有D,復制粘貼的時候手誤
uj5u.com熱心網友回復:
有沒有動態申請權限uj5u.com熱心網友回復:
是不是少寫了什么,之前寫過Demo,供你參考public class Map1Fragment extends BaseFragment {
private MapView mapView;
private BaiduMap map;
private LocationClient locationClient;
private Point centerPoint;
private boolean isFirstLoc = true;
//地理編碼
private GeoCoder geoCoder;
//當前經緯度
private double lantitude;
private double longtitude;
//Poi串列
private List<PoiInfo> poiList = new ArrayList<>();
private PoiAdapter poiAdapter;
public static Map1Fragment newInstance() {
return new Map1Fragment();
}
@Override
public int getLayoutRes() {
return R.layout.fragment_map1;
}
@Override
public void initView(Bundle savedInstanceState) {
RecyclerView recyclerView = findView(R.id.rlv_fragment_map1);
recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
poiAdapter = new PoiAdapter(null);
recyclerView.setAdapter(poiAdapter);
mapView = findView(R.id.bmapView);
map = mapView.getMap();
//地理編碼
geoCoder = GeoCoder.newInstance();
}
@Override
public void initListener() {
//地圖狀態改變
map.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
}
@Override
public void onMapStatusChangeStart(MapStatus mapStatus, int i) {
}
@Override
public void onMapStatusChange(MapStatus mapStatus) {
}
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
}
});
//點擊監聽
map.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
//長按
map.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
}
});
//點擊覆寫物
map.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
return false;
}
});
//觸摸地圖
map.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
@Override
public void onTouch(MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
// 獲取當前MapView中心螢屏坐標相應的地理坐標
LatLng currentLatLng;
currentLatLng = map.getProjection().fromScreenLocation(
centerPoint);
// 發起反地理編碼檢索
geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
.location(currentLatLng));
}
}
});
//地圖加載完成
map.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
}
});
//地圖定位圖示點擊事件監聽介面
map.setOnMyLocationClickListener(new BaiduMap.OnMyLocationClickListener() {
@Override
public boolean onMyLocationClick() {
return false;
}
});
//地理編碼監聽
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//沒有檢索到結果
return;
} else {
double latitude = geoCodeResult.getLocation().latitude;
double longitude = geoCodeResult.getLocation().longitude;
}
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//沒有找到檢索結果
return;
} else {
//當前
PoiInfo currentPoiInfo = new PoiInfo();
currentPoiInfo.address = reverseGeoCodeResult.getAddress();
currentPoiInfo.location = reverseGeoCodeResult.getLocation();
currentPoiInfo.name = "[位置]";
//重繪頁面
poiList.clear();
poiList.add(currentPoiInfo);
poiList.addAll(reverseGeoCodeResult.getPoiList());
poiAdapter.setNewData(poiList);
}
}
});
poiAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
click(position);
}
});
}
@Override
public void initData() {
//定位
initLocationClient();
setLocationConfig();
//map可以設定三種地圖型別,以及路況,這里忽略
setMapConfig();
//開啟地圖定位圖層
map.setMyLocationEnabled(true);
//中心坐標
centerPoint = map.getMapStatus().targetScreen;
locationClient.start();//開始定位
}
@Override
public void onResume() {
mapView.onResume();
super.onResume();
}
@Override
public void onPause() {
mapView.onPause();
super.onPause();
}
@Override
public void onDestroy() {
locationClient.stop();
mapView.onDestroy();
geoCoder.destroy();
super.onDestroy();
}
private void setMapConfig() {
MyLocationConfiguration config = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.FOLLOWING, false,
null, 0xAAFFFF88, 0xAA00FF00
);
map.setMyLocationConfiguration(config);
MapStatus.Builder builder = new MapStatus.Builder();
builder.zoom(18.0f);
map.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
private void initLocationClient() {
locationClient = new LocationClient(Global.mContext);
locationClient.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//mapView 銷毀后不在處理新接收的位置
if (bdLocation == null || map == null) {
return;
}
Logger.d("gxh", bdLocation.getAddrStr());
MyLocationData locData = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
// 此處設定開發者獲取到的方向資訊,順時針0-360
.direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
map.setMyLocationData(locData);
lantitude = bdLocation.getLatitude();
longtitude = bdLocation.getLongitude();
LatLng currentLatLng = new LatLng(lantitude, longtitude);
// 是否第一次定位
if (isFirstLoc) {
isFirstLoc = false;
// 實作影片跳轉
MapStatusUpdate u = MapStatusUpdateFactory
.newLatLng(currentLatLng);
map.animateMapStatus(u);
geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
.location(currentLatLng));
return;
}
}
});
}
private void setLocationConfig() {
LocationClientOption option = new LocationClientOption();
//定位模式:高精度、低功耗、僅用設備
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//設定回傳經緯度坐標
option.setCoorType("bd09ll");
//設定發起定位請求的間隔
option.setScanSpan(0);
option.setOpenGps(true);
//需要位置資訊,回傳省市縣街道等
option.setIsNeedAddress(true);
//位置描述
option.setIsNeedLocationDescribe(true);
//獲取周邊POI資訊 需要聯網
option.setIsNeedLocationPoiList(true);
locationClient.setLocOption(option);
}
private void click(int position) {
PoiInfo poiInfo = poiAdapter.getData().get(position);
map.clear();
//影片跳轉
MapStatusUpdate u=MapStatusUpdateFactory.newLatLng(poiInfo.getLocation());
map.animateMapStatus(u);
//加入覆寫物
BitmapDescriptor selectPic= BitmapDescriptorFactory.fromResource(R.drawable.circle);
OverlayOptions oo=new MarkerOptions().position(poiInfo.getLocation())
.icon(selectPic).anchor(0.5f,0.5f);
map.addOverlay(oo);
//發起地理編碼
geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
.location(poiInfo.getLocation()));
}
}
uj5u.com熱心網友回復:
onReceiveLocation 這個方法里面debug 一下,看回傳什么錯誤資訊,對照百度常見問題一下就出來了,我感覺你是真機對應的 .so沒加全uj5u.com熱心網友回復:
我覺得你有兩個問題點需求確認一下:①:你的代碼debug時,是否是正常作業狀態的 , 有沒有一步一步的查看代碼 有無exception出現?
②: 你的權限有沒有動態進行申請? 現在的真機 很多都是Android 7.0 以上的了 更多的是8.0 甚至9.0的系統 這個是需要動態處理權限申請的問題的 不是原來一樣 在AndroidManifest.xml 里申明一下某個權限就可以了 當然 這一步AndroidManifest.xml申明權限也不要落下
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/88453.html
標籤:Android
上一篇:intel mpi 并行問題
