最近項目要做一個範圍投放,這裏用到了高德地圖;
首先申請key,就不說了,基本都會申請,這裏注意一個點,就是填寫sha1值的時候一定注意,因爲本人把兩個sha1值全寫成測試版的了,結果打包出來運行就是白屏,測試版的就寫測試版的sha1值,發佈版的就寫發佈版的sha1值,別寫成一樣的了。
獲取測試版的sha1值
點擊studio右上角的Gradle,裏面有一個signingReport,雙擊,下面的就能看到測試版的sha1值
如果沒有,點擊左上角的/ab
獲取發佈版的sha1值
首先打包,打包成功後找到你打包設置生成的keystore文件,複製一下路徑
然後再studio黑窗口中執行命令行 keytool -list -v -keystore [你的keystore文件路徑],如圖
輸入你的密碼,就是你打包的密碼,緊接着下面就能看到發佈版的sha1值了
地圖開發:
項目涉及我用到了地圖2d,定位,勾選這倆就可以
我的是2d地圖,所以不需要so庫文件,3d的需要,文檔有說明。
獲取權限:
<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_LOCATION_EXTRA_COMMANDS" />
<!--允許程序打開網絡套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設置內置sd卡的寫權限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網絡狀態-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問WiFi網絡信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序讀寫手機狀態和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允許程序訪問CellID或WiFi熱點來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
添加key值
<meta-data android:name="com.amap.api.v2.apikey"
android:value="你的key">
</meta-data>
導入jar包就能開始了
佈局文件
<com.amap.api.maps2d.MapView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mapView"/>
代碼:
MapView mMapView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) getView().findViewById(R.id.mapView);
aMap = mMapView.getMap();
//這個一定要寫
mMapView.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),銷燬地圖
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView.onResume (),重新繪製加載地圖
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView.onPause (),暫停地圖的繪製
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),保存地圖當前的狀態
mMapView.onSaveInstanceState(outState);
}
以上就能顯示地圖,但是沒功能,因爲展示範圍所以畫個圓,畫圓要根據自己的位置來畫,所以先定位,獲取自己的經緯度
public void initMap() {
aMap.setMyLocationEnabled(true);
UiSettings uiSettings = aMap.getUiSettings();
//設置禁止縮放
//uiSettings.setZoomGesturesEnabled(false);
//頁面不顯示加號and減號
uiSettings.setZoomControlsEnabled(false);
//定位監聽
aMap.setOnMyLocationChangeListener(this);
initLocation();
getMediaList(SPUtil.getString(SysParam.TOKEN));
}
/**
* 初始化藍點,具體可以看官方文檔
*/
public void initLocation() {
myLocationStyle = new MyLocationStyle();//初始化定位藍點樣式類myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//連續定位、且將視角移動到地圖中心點,定位點依照設備方向旋轉,並且會跟隨設備移動。(1秒1次定位)如果不設置myLocationType,默認也會執行此種模式。
myLocationStyle.interval(5000); //設置連續定位模式下的定位間隔,只在連續定位模式下生效,單次定位模式下不會生效。單位爲毫秒。
aMap.setMyLocationStyle(myLocationStyle);//設置定位藍點的Style
aMap.setMyLocationEnabled(true);
//自己可以設置定位展示的圖標
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW);
//定位藍點精度框爲透明 myLocationStyle.strokeColor(Color.TRANSPARENT);
myLocationStyle.radiusFillColor(Color.TRANSPARENT);
//如果不想展示不顯示藍點,設置爲true就行,
myLocationStyle.showMyLocation(false);
}
//定位監聽實現的接口
@Override
public void onMyLocationChange(Location location) {
//拿到自己的經緯度
latLng = new LatLng(location.getLatitude(), location.getLongitude());
//在地圖上繪製圓
aMap.addCircle(new CircleOptions()
.center(latLng)//自己的位置爲中心
.radius(1000)//圓的半徑
.fillColor(Color.argb(60, 1, 1, 1))//圓內顏色及透明度
.strokeColor(Color.RED)//圓邊框顏色
.strokeWidth(1));//邊框寬度
//展示我當前的位置,如果不寫不會顯示自己當前在哪
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));//參數:1.自己的經緯度,2.地圖的縮放比例
}
運行起來就能看到以自己當前位置繪製的一個半徑1000的圓
下面在展示圓圈內的market,項目裏是讓展示20個紅包
因爲後臺沒有,老闆先讓展示20個紅包,所以就展示了20個假數據,如果真實數據需要自己判斷了
//20個有點多,就展示兩個吧,這裏需要自定義maerket
public void initDate() {
if (marker != null) {
marker.remove();
}
//自定義佈局,把view轉換成Bitmap
View markerView = View.inflate(getActivity(), R.layout.marker_iew, null);
TextView marker_tv = (TextView) markerView.findViewById(R.id.marker_tv);
marker_tv.setText("5");
Bitmap bitmap = convertViewToBitmap(markerView);
MarkerOptions options = new MarkerOptions();
LatLng markerLat = new LatLng(latLng.latitude + 0.000899, latLng.longitude + 0.001141);
options.position(markerLat);
options.title("0");
options.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
MarkerOptions options1 = new MarkerOptions();
LatLng markerLat1 = new LatLng(latLng.latitude - 0.000899 - 0.000899, latLng.longitude - 0.001141 + 0.001141);
options1.position(markerLat1);
options1.title("1");
options1.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
//添加到集合中
list.add(options);
list.add(options1);
checkLat(list);
}
public void checkLat(List<MarkerOptions> latList) {
for (int i = 0; i < latList.size(); i++) {
//因爲自己是假數據,先註釋了,如果是真的數據,就需要下面的判斷了,如果你要繪製的market點小於你圓的半徑就說明在圓裏,就去繪製market,這裏需要一個工具類,高德自帶的計算距離的,裏面傳入兩個點的經緯度就可以得到距離,在對比半徑就知道該不該繪製
// if (latLng != null) {
//判斷點是否在所繪製的圓內,如果一個點小於圓的半徑說明在該圓內
// float distance = AMapUtils.calculateLineDistance(latLng, markerLat);
// if (distance <= 1000) {
// }
marker = aMap.addMarker(latList.get(i));
//}
}
aMap.invalidate();
}
//view 轉bitmap 這裏碰到一個問題,因爲畫的market太大了,所以 view.layout(0, 0, 50, 68);我就寫死了,但是我的需求上是展示圖標,在圖標上還得顯示一個數字,我把寬高寫成50,68後
佈局裏的textview死活不顯示,如果寫成view.getMeasuredWidth(),view.getMeasuredHeight()圖標展示就太大了,很糾結,最後我說的實現不出來,公司說的不用加數字,有知道的告訴一聲,多謝!
public Bitmap convertViewToBitmap(View view) {
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, 50, 68);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
最後就是market的點擊事件,點擊後播放一個gif動圖,再跳轉視頻頁面播放
aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//返回true後需要執行自己的一些邏輯
//marker.showInfoWindow();
if (infoList.size() > 0) {
//title是我設置的標識,代表點擊的那個market,從集合取對應對象數據傳值給下個頁面
String title = marker.getTitle();
int position = Integer.parseInt(title);
VideoInfo video = infoList.get(position);
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("TITLE", video.getMediaName() + "-第" + video.getPeriods() + "期");
bundle.putString("URI", video.getMediaUrl());
bundle.putString("jumpUrl", video.getUrl());
bundle.putInt("decode_type", 1);
bundle.putLong("deliveryId", video.getDeliveryId());
bundle.putLong("mediaId", video.getMediaId());
bundle.putInt("tag", 1);
intent.putExtras(bundle);
intent.setClass(getActivity(), RedenvelopesActivity.class);
startActivity(intent);
}
//返回true,不讓marker移動重新定位
return true;
}
});
播放動圖用的一個第三方 android-gif-drawable,glide加載gif圖過大會卡住不能展示gif圖。
別忘了6.0手機權限
@TargetApi(Build.VERSION_CODES.M)
private void permission() {
List<String> permissionLists = new ArrayList<>();
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.ACCESS_WIFI_STATE);
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.READ_PHONE_STATE);
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS);
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.CHANGE_WIFI_STATE);
}
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(Manifest.permission.ACCESS_NETWORK_STATE);
}
if (!permissionLists.isEmpty()) {// 說明肯定有拒絕的權限
//我的是在fragment裏面請求的權限,所以這裏寫當前的fragment,千萬別寫ActivityCompat,這樣activity會攔截的,不會回調下面權限方法的。
VideoMapFragment.this.requestPermissions(permissionLists.toArray(new String[permissionLists.size()]),
PERMISSION_REQUESTCODE);
} else {
initMap();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_REQUESTCODE:
if (grantResults.length > 0) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
Common.showToast("某一個權限被拒絕了", true);
return;
}
}
initMap();
}
break;
default:
break;
}
}
以上就是全部代碼,做完收穫很多,權限,sha1值倆問題費了好長時間,原來的頁面用的Tabhost展示底部導航狼,裏面的子activity請求權限不回調的,整了好長時間也沒成功,最後我把頁面換成RadioGroup+Fragment才行的,如有知道activity嵌套activity權限申請失敗解決方案的告訴一聲啊,多謝!