• android studio高德地图的显示于定位(附带逆地理编码围栏)


    首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息

    网站:http://lbs.amap.com/api/android-sdk/guide/create-project/get-key        

    途中包含了发布版的SHA1安全码和测试版SHA1安全码,两者的值可以看  

    照做就一定会获取的。

    这里我讲发布版和调试版都用的relase版本的sha1

    之后再去下载相应的Jar包,这里我用的是

    3D地图的jar包

    注意:2D地图的jar包,与3D地图的jar包因为接口有一样的,导致冲突无法使用。

    在jnilibs下放入一下文件

    因为有些人的android studio无法显示,但又不报错(我就这样)。你就需要将以上红圈类容放入libs,才能显示

    之后在

    将导入的jar包添加到类包;

    选择,找到于自己名字一样的Jar,添加就可以了。之后检查在build.gradle 是否添加了以下类容

    compile files('libs/AMap3DMap_5.1.0_AMapSearch_5.1.0_AMapLocation_3.4.0_20170518.jar')
        compile 'com.android.support:appcompat-v7:24.2.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'

    并且设置jar包的位置为libs

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })

    在androidManifest.xml中添加自己的添加权限

    <!-- 用于进行网络定位 -->
        <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" />
    

      添加自己的key

    <meta-data
                    android:name="com.amap.api.v2.apikey"
                    android:value="你的key" />
    

      添加定位方法

    <service android:name="com.amap.api.location.APSService" />
    

      

    在Activity_main.xml中添加

    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/text1"/>
    <com.amap.api.maps.MapView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/map">
            </com.amap.api.maps.MapView>
    

    在MainActivty的主代码

    public class MainActivity extends AppCompatActivity implements AMapLocationListener,GeocodeSearch.OnGeocodeSearchListener {
    
        private Button button;
        private AMapLocationClient locationClient = null;
        private AMapLocationClientOption locationOption = null;
        private TextView textView;
        private String[] strMsg;
        private com.amap.api.maps.AMap aMap;
        private MapView mapView;
        private GeocodeSearch geocoderSearch;
        private Marker geoMarker;
        private static LatLonPoint latLonPoint;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = (TextView)findViewById(R.id.text1);
            textView = (TextView)findViewById(R.id.textView2);
            button=(Button)findViewById(R.id.button);
            mapView = (MapView) findViewById(R.id.map);
            mapView.onCreate(savedInstanceState);// 此方法必须重写
            Location();
            final Intent intent=new Intent();
            intent.setAction("Utils");
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Bundle data =new Bundle();
                    data.putString("msg","签到成功");
                    intent.putExtra("data",data);
                    sendBroadcast(intent);
    
    
                }
            });
        }
    
    
    
    
        private void initMap(){
    
            if (aMap == null) {
                aMap = mapView.getMap();
    
                //用高德默认图标
                geoMarker= aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
                //自定义图标
               //geoMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)
               //   .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.punch_dw))));
            }
            geocoderSearch = new GeocodeSearch(this);
            geocoderSearch.setOnGeocodeSearchListener(this);
            getAddress(latLonPoint);
        }
    
    
        @Override
        public void onLocationChanged(AMapLocation loc) {
            if (null != loc) {
                Message msg = mHandler.obtainMessage();
                msg.obj = loc;
                msg.what = Utils.MSG_LOCATION_FINISH;
                mHandler.sendMessage(msg);
            }
    
        }
    
        Handler mHandler = new Handler() {
            public void dispatchMessage(android.os.Message msg) {
                switch (msg.what) {
                    //定位完成
                    case Utils.MSG_LOCATION_FINISH:
                        String result = "";
                        try {
                            AMapLocation loc = (AMapLocation) msg.obj;
                            result = Utils.getLocationStr(loc, 1);
                            strMsg = result.split(",");
                            Toast.makeText(MainActivity.this, "定位成功", Toast.LENGTH_LONG).show();
                            textView.setText("地址:" + strMsg[0] + "
    " + "经    度:" + strMsg[1] + "
    " + "纬    度:" + strMsg[2]+"
    ");
                            latLonPoint= new LatLonPoint(Double.valueOf(strMsg[2]), Double.valueOf(strMsg[1]));
                            initMap();
                        } catch (Exception e) {
                            Toast.makeText(MainActivity.this, "定位失败", Toast.LENGTH_LONG).show();
                        }
                        break;
                    default:
                        break;
                }
            };
    
        };
    
    
        public void Location() {
            // TODO Auto-generated method stub
            try {
                locationClient = new AMapLocationClient(this);
                locationOption = new AMapLocationClientOption();
                // 设置定位模式为低功耗模式
                locationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
                // 设置定位监听
                locationClient.setLocationListener(this);
                locationOption.setOnceLocation(true);//设置为单次定位
                locationClient.setLocationOption(locationOption);// 设置定位参数
                // 启动定位
                locationClient.startLocation();
                mHandler.sendEmptyMessage(Utils.MSG_LOCATION_START);
            } catch (Exception e) {
                Toast.makeText(MainActivity.this, "定位失败", Toast.LENGTH_LONG).show();
            }
        }
    
    
        /**
         * 响应逆地理编码围栏
         */
        public void getAddress(final LatLonPoint latLonPoint) {
            RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 100,
                    GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是网络   坐标系还是GPS原生坐标系
            geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
        }
    
        /**
         * 地理编码查询回调
         */
        @Override
        public void onGeocodeSearched(GeocodeResult result, int rCode) {
    
        }
    
    
        /**
         * 逆地理编码回调
         */
        @Override
        public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
            if (rCode == 1000) {
                if (result != null && result.getRegeocodeAddress() != null
                        && result.getRegeocodeAddress().getFormatAddress() != null) {
    
                    Toast.makeText(MainActivity.this,result.getRegeocodeAddress().getFormatAddress()
                            + "附近",Toast.LENGTH_LONG).show();
                    aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                            AMapUtil.convertToLatLng(latLonPoint), 15));
                    geoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));
                } else {
    
                }
            } else {
            }
        }
    
    
        
        @Override
        public void onResume() {
            super.onResume();
            mapView.onResume();
        }
    
        /**
         * 方法必须重写
         */
        @Override
        public void onPause() {
            super.onPause();
            mapView.onPause();
        }
    
        
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            mapView.onSaveInstanceState(outState);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            mapView.onDestroy();
        }
    }
    

    在同级的文件下建立自己的类方法,调用到主代码中

    AMapUtil代码为:

    public class AMapUtil {
        /**
         * 判断edittext是否null
         */
        public static String checkEditText(EditText editText) {
            if (editText != null && editText.getText() != null
                    && !(editText.getText().toString().trim().equals(""))) {
                return editText.getText().toString().trim();
            } else {
                return "";
            }
        }
    
        public static Spanned stringToSpan(String src) {
            return src == null ? null : Html.fromHtml(src.replace("
    ", "<br />"));
        }
    
        public static String colorFont(String src, String color) {
            StringBuffer strBuf = new StringBuffer();
    
            strBuf.append("<font color=").append(color).append(">").append(src)
                    .append("</font>");
            return strBuf.toString();
        }
    
        public static String makeHtmlNewLine() {
            return "<br />";
        }
    
        public static String makeHtmlSpace(int number) {
            final String space = " ";
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < number; i++) {
                result.append(space);
            }
            return result.toString();
        }
    
        public static String getFriendlyLength(int lenMeter) {
            if (lenMeter > 10000) // 10 km
            {
                int dis = lenMeter / 1000;
                return dis + "";
            }
    
            if (lenMeter > 1000) {
                float dis = (float) lenMeter / 1000;
                DecimalFormat fnum = new DecimalFormat("##0.0");
                String dstr = fnum.format(dis);
                return dstr;
            }
    
            if (lenMeter > 100) {
                int dis = lenMeter / 50 * 50;
                return dis + "";
            }
    
            int dis = lenMeter / 10 * 10;
            if (dis == 0) {
                dis = 10;
            }
    
            return dis + "";
        }
    
        public static boolean IsEmptyOrNullString(String s) {
            return (s == null) || (s.trim().length() == 0);
        }
    
        /**
         * 把LatLng对象转化为LatLonPoint对象
         */
        public static LatLonPoint convertToLatLonPoint(LatLng latlon) {
            return new LatLonPoint(latlon.latitude, latlon.longitude);
        }
    
        /**
         * 把LatLonPoint对象转化为LatLon对象
         */
        public static LatLng convertToLatLng(LatLonPoint latLonPoint) {
            return new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude());
        }
    
        /**
         * 把集合体的LatLonPoint转化为集合体的LatLng
         */
        public static ArrayList<LatLng> convertArrList(List<LatLonPoint> shapes) {
            ArrayList<LatLng> lineShapes = new ArrayList<LatLng>();
            for (LatLonPoint point : shapes) {
                LatLng latLngTemp = AMapUtil.convertToLatLng(point);
                lineShapes.add(latLngTemp);
            }
            return lineShapes;
        }
    
        /**
         * long类型时间格式化
         */
        public static String convertToTime(long time) {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date(time);
            return df.format(date);
        }
    
        public static final String HtmlBlack = "#000000";
        public static final String HtmlGray = "#808080";
    
        public static String getFriendlyTime(int second) {
            if (second > 3600) {
                int hour = second / 3600;
                int miniate = (second % 3600) / 60;
                return hour + "小时" + miniate + "分钟";
            }
            if (second >= 60) {
                int miniate = second / 60;
                return miniate + "分钟";
            }
            return second + "秒";
        }
    
    
        public static String getBusPathTitle(BusPath busPath) {
            if (busPath == null) {
                return String.valueOf("");
            }
            List<BusStep> busSetps = busPath.getSteps();
            if (busSetps == null) {
                return String.valueOf("");
            }
            StringBuffer sb = new StringBuffer();
            for (BusStep busStep : busSetps) {
                if (busStep.getBusLines().size() > 0) {
                    RouteBusLineItem busline = busStep.getBusLines().get(0);
                    if (busline == null) {
                        continue;
                    }
                    String buslineName = getSimpleBusLineName(busline.getBusLineName());
                    sb.append(buslineName);
                    sb.append(" > ");
                }
                if (busStep.getRailway() != null) {
                    RouteRailwayItem railway = busStep.getRailway();
                    sb.append(railway.getTrip() + "(" + railway.getDeparturestop().getName()
                            + " - " + railway.getArrivalstop().getName() + ")");
                    sb.append(" > ");
                }
            }
            return sb.substring(0, sb.length() - 3);
        }
    
        public static String getBusPathDes(BusPath busPath) {
            if (busPath == null) {
                return String.valueOf("");
            }
            long second = busPath.getDuration();
            String time = getFriendlyTime((int) second);
            float subDistance = busPath.getDistance();
            String subDis = getFriendlyLength((int) subDistance);
            float walkDistance = busPath.getWalkDistance();
            String walkDis = getFriendlyLength((int) walkDistance);
            return String.valueOf(time + " | " + subDis + " | 步行" + walkDis);
        }
    
        public static String getSimpleBusLineName(String busLineName) {
            if (busLineName == null) {
                return String.valueOf("");
            }
            return busLineName.replaceAll("\(.*?\)", "");
        }
    
    
    }
    

      

    Utils的主代码为:

    public class Utils {
    
    
        /**
         * 开始定位
         */
        public final static int MSG_LOCATION_START = 0;
        /**
         * 定位完成
         */
        public final static int MSG_LOCATION_FINISH = 1;
        /**
         * 停止定位
         */
    
        /**
         * 根据定位结果返回定位信息的字符串
         *
         * @return
         */
        public synchronized static String getLocationStr(AMapLocation location, final int index) {
            if (null == location) {
                return null;
            }
            StringBuffer sb = new StringBuffer();
            //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
            if (location.getErrorCode() == 0) {
                sb.append("定位成功" + "
    ");
                sb.append("定位类型: " + location.getLocationType() + "
    ");
                sb.append("经    度    : " + location.getLongitude() + "
    ");
                sb.append("纬    度    : " + location.getLatitude() + "
    ");
                sb.append("精    度    : " + location.getAccuracy() + "米" + "
    ");
                sb.append("提供者    : " + location.getProvider() + "
    ");
    
    
    
    
                if (location.getProvider().equalsIgnoreCase(
                        android.location.LocationManager.GPS_PROVIDER)) {
                    // 以下信息只有提供者是GPS时才会有
                    sb.append("速    度    : " + location.getSpeed() + "米/秒" + "
    ");
                    sb.append("角    度    : " + location.getBearing() + "
    ");
                    // 获取当前提供定位服务的卫星个数
                    sb.append("星    数    : "
                            + location.getSatellites() + "
    ");
                } else {
                    // 提供者是GPS时是没有以下信息的
                    sb.append("国    家    : " + location.getCountry() + "
    ");
                    sb.append("省            : " + location.getProvince() + "
    ");
                    sb.append("市            : " + location.getCity() + "
    ");
                    sb.append("城市编码 : " + location.getCityCode() + "
    ");
                    sb.append("区            : " + location.getDistrict() + "
    ");
                    sb.append("区域 码   : " + location.getAdCode() + "
    ");
                    sb.append("地    址    : " + location.getAddress() + "
    ");
                    sb.append("兴趣点    : " + location.getPoiName() + "
    ");
                    return (location.getAddress() + "," + location.getLongitude() + "," + location.getLatitude());
                }
    //这个方法可以进行反向的地理围栏圈定          
      //if(location.getLatitude()==“纬度”||location.getLongitude()==“经度”){
                //    sb.append("可以签到"+"
    ");
                  //  return sb.toString();
    
              //  }
              //  else {
               //     sb.append("不可签到"+"
    ");
    
            //    }
    
        //    }
    
            else {
                //定位失败
                sb.append("定位失败" + "
    ");
                sb.append("错误码:" + location.getErrorCode() + "
    ");
                sb.append("错误信息:" + location.getErrorInfo() + "
    ");
                sb.append("错误描述:" + location.getLocationDetail() + "
    ");
                return sb.toString();
            }
            return sb.toString();
    
        }
    
    
    
    }
    

      如果要使用那个逆地理的编码围栏,你需要自己设定button控件的响应事件,通过返回值来控制button是否开启

  • 相关阅读:
    Python调用ansible API系列(三)带有callback的执行adhoc和playbook
    Python调用ansible API系列(二)执行adhoc和playbook
    Python调用ansible API系列(一)获取资产信息
    kube-proxy的功能
    Kubernetes集群部署史上最详细(二)Prometheus监控Kubernetes集群
    Kubernetes集群部署史上最详细(一)Kubernetes集群安装
    Celery异步调度框架(二)与Django结合使用
    【WPF on .NET Core 3.0】 Stylet演示项目
    [译]基于ASP.NET Core 3.0的ABP v0.21已发布
    .NET Conf 2019日程(北京时间)
  • 原文地址:https://www.cnblogs.com/LiangPF/p/6932501.html
Copyright © 2020-2023  润新知