最近项目要做一个范围投放,这里用到了高德地图;
首先申请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权限申请失败解决方案的告诉一声啊,多谢!