高德地图的使用之自动定位和marker的点击显示自定义PopupWindow

来源:互联网 发布:易企秀一样的软件 编辑:程序博客网 时间:2024/06/04 17:54

最近项目需要集成高德地图,并实现自动定位上传和marker的点击显示PopupWindow,然后再对PopupWindow中的控件进行点击实现跳转功能,大概了解了需求之后,我就进入高德地图Api开放平台 申请应用的key,申请Key的步骤在高德开发文档中有,如图所示:

获取应用的key是需要应用签名 SHA1,获取它的方法有好多,我给大家推荐下面的方法,个人认为最好用,

在Activity中的进入是时执行并打印出,即可获得SHA1;

 @Override    protected void onCreate(Bundle savedInstanceState) {
String sha1=getSHA1(getApplicationContext());
Log.e("this is sha1",sha1);
}

public static String getSHA1(Context context) {        try {            PackageInfo info = context.getPackageManager().getPackageInfo(                    context.getPackageName(), PackageManager.GET_SIGNATURES);            byte[] cert = info.signatures[0].toByteArray();            MessageDigest md = MessageDigest.getInstance("SHA1");            byte[] publicKey = md.digest(cert);            StringBuffer hexString = new StringBuffer();            for (int i = 0; i < publicKey.length; i++) {                String appendString = Integer.toHexString(0xFF & publicKey[i])                        .toUpperCase(Locale.US);                if (appendString.length() == 1)                    hexString.append("0");                hexString.append(appendString);                hexString.append(":");            }            String result = hexString.toString();            return result.substring(0, result.length()-1);        } catch (PackageManager.NameNotFoundException e) {            e.printStackTrace();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        return null;    }

获取key后需要在AndroidManifest.xml中声明使用,同时添加一些权限

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.administrator.gaodemodel">    <!--用于进行网络定位-->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    <!--用于访问GPS定位-->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    <!--用于访问网络,网络定位需要上网-->    <uses-permission android:name="android.permission.INTERNET" />    <!--用于读取手机当前的状态-->    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!--用于写入缓存数据到扩展存储卡-->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!--用于申请调用A-GPS模块-->    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />    <!--用于申请获取蓝牙信息进行室内定位-->    <uses-permission android:name="android.permission.BLUETOOTH" />    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />    <application        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">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <!--高德地图-->        <meta-data            android:name="com.amap.api.v2.apikey"            android:value="28546683d437233513dd4a7989e956ed" />        <service android:name="com.amap.api.location.APSService"/>        <activity android:name=".XiangqingActiviy"/>    </application></manifest>

下面我贴出MainActivity.java的内容,大家可以祥观一下,

1)自动定位

public AMapLocationListener mapLocationListener = new AMapLocationListener() {        @Override        public void onLocationChanged(AMapLocation aMapLocation) {            if (aMapLocation != null) {                if (aMapLocation.getErrorCode() == 0) {                    //定位成功                    double lat;                    double lon;                    aMapLocation.getLocationType();// 获取当前定位结果来源,如网络定位结果,详见定位类型表                    lat = aMapLocation.getLatitude();//纬度                    lon = aMapLocation.getLongitude();// 经度                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                    String date = df.format(new Date());                    // 设置当前地图显示为当前位置                    aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 19));                    MarkerOptions markerOptions = new MarkerOptions();                    //                    markerOptions.position(new LatLng(lat, lon));                    markerOptions.title("当前位置");                    markerOptions.snippet("hdfeuf");                    markerOptions.visible(true);                    // 设置自定义marker//                    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.doctor));//                    markerOptions.icon(bitmapDescriptor);                    aMap.addMarker(markerOptions);                    marker2 = aMap.addMarker(markerOptions);                    //进入地图就显示pop//                    marker2.showInfoWindow();                    Log.e("经纬度", "纬度::" + lat + "-----经度::" + lon + "===时间:" + date);                } else {                    //显示错误信息ErrCode是错误码errInfo是错误信息,详见错误码表。                    Log.e("AmapError", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo());                }            }        }    };
/** * 设置一些amap的属性 */private void setUpMap() {    // 如果要设置定位的默认状态,可以在此处进行设置    myLocationStyle = new MyLocationStyle();    //设置定位蓝点精度圆圈的边框颜色的方法。    myLocationStyle.strokeColor(R.color.blue);    //设置定位蓝点精度圆圈的填充颜色的方法    myLocationStyle.radiusFillColor(R.color.white);    //设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。    myLocationStyle.showMyLocation(true);    myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且将视角移动到地图中心点。    aMap.setMyLocationStyle(myLocationStyle);    aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示    aMap.setOnMarkerClickListener(this);// 设置点击marker事件监听器    aMap.setOnInfoWindowClickListener(this);// 设置点击infoWindow事件监听器    aMap.setInfoWindowAdapter(this);// 设置自定义InfoWindow样式    aMap.setOnMarkerClickListener(this);// 设置点击marker事件监听器}private void setMyLocation() {    mapLocationClient = new AMapLocationClient(getApplicationContext());    mapLocationClient.setLocationListener(mapLocationListener);    //初始化定位参数    mapLocationClientOption = new AMapLocationClientOption();    //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式    mapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);    //设置是否返回地址信息(默认返回地址信息)    mapLocationClientOption.setNeedAddress(true);    //设置是否只定位一次,默认为false mLocationOption.setOnceLocation(false);    //设置是否强制刷新WIFI,默认为强制刷新    mapLocationClientOption.setWifiActiveScan(true);    //设置是否允许模拟位置,默认为false,不允许模拟位置    mapLocationClientOption.setMockEnable(false);    //设置定位间隔,单位毫秒,默认为2000ms    mapLocationClientOption.setInterval(5000);    //给定位客户端对象设置定位参数    mapLocationClient.setLocationOption(mapLocationClientOption);    //启动定位    mapLocationClient.startLocation();}

2)自定义的PopupWindow的点击事件

@Overridepublic void onInfoWindowClick(Marker marker) {    titleUi.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Toast.makeText(v.getContext(), "你点击了文字", Toast.LENGTH_SHORT).show();        }    });    imageView.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Toast.makeText(v.getContext(), "你点击了图片", Toast.LENGTH_SHORT).show();        }    });}/** * 自定义infowinfow窗口 */public void render(Marker marker, View view) {    // 设置不同的图片内容    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),            R.mipmap.get1);    imageView = (ImageView) view.findViewById(R.id.badge);    imageView.setImageBitmap(ImageUtils            .getRoundCornerImage(bitmap, 30));    String title = marker.getTitle();    titleUi = ((TextView) view.findViewById(R.id.title));    if (title != null) {        SpannableString titleText = new SpannableString(title);        titleText.setSpan(new ForegroundColorSpan(Color.RED), 0,                titleText.length(), 0);        titleUi.setText(titleText);    } else {        titleUi.setText("");    }    String snippet = marker.getSnippet();    TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));    if (snippet != null) {        SpannableString snippetText = new SpannableString(snippet);        snippetText.setSpan(new ForegroundColorSpan(Color.GREEN), 0,                snippetText.length(), 0);        // snippetUi.setTextSize(20);        snippetUi.setText(snippetText);    } else {        snippetUi.setText("");    }}@Overridepublic boolean onMarkerClick(Marker marker) {    if (marker.equals(marker2)) {        if (aMap != null) {        }    }    return false;}
我写的demo的源码有需要的可以下下来看看,里面还有一个知点画线的功能。

阅读全文
0 0
原创粉丝点击