高德定位

依赖:    
    implementation 'com.amap.api:3dmap:6.9.2'
    implementation 'com.amap.api:location:4.7.0'
    implementation 'com.amap.api:search:6.5.0.1'


xml权限
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于进行网络定位 -->
<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" />

放到</receiver>下面
<service android:name="com.amap.api.location.APSService"/> 
        <meta-data
                android:name="com.amap.api.v2.apikey"
                android:value="你自己的key"/>

 

CheckPermissionsActivity
————————————————————————————————————————————————————————

public class CheckPermissionsActivity extends AppCompatActivity
      implements
         ActivityCompat.OnRequestPermissionsResultCallback {
   /**
    * 需要进行检测的权限数组
    */
   protected String[] needPermissions = {
         Manifest.permission.ACCESS_COARSE_LOCATION,
         Manifest.permission.ACCESS_FINE_LOCATION,
         Manifest.permission.WRITE_EXTERNAL_STORAGE,
         Manifest.permission.READ_EXTERNAL_STORAGE,
         Manifest.permission.READ_PHONE_STATE
         };
   
   private static final int PERMISSON_REQUESTCODE = 0;
   
   /**
    * 判断是否需要检测,防止不停的弹框
    */
   private boolean isNeedCheck = true;
   
   @Override
   protected void onResume() {
      super.onResume();
      if(isNeedCheck){
         checkPermissions(needPermissions);
      }
   }
   
   /**
    * 
    * @param
    * @since 2.5.0
    *
    */
   private void checkPermissions(String... permissions) {
      List<String> needRequestPermissonList = findDeniedPermissions(permissions);
      if (null != needRequestPermissonList
            && needRequestPermissonList.size() > 0) {
         ActivityCompat.requestPermissions(this,
               needRequestPermissonList.toArray(
                     new String[needRequestPermissonList.size()]),
               PERMISSON_REQUESTCODE);
      }
   }

   /**
    * 获取权限集中需要申请权限的列表
    * 
    * @param permissions
    * @return
    * @since 2.5.0
    *
    */
   private List<String> findDeniedPermissions(String[] permissions) {
      List<String> needRequestPermissonList = new ArrayList<String>();
      for (String perm : permissions) {
         if (ContextCompat.checkSelfPermission(this,
               perm) != PackageManager.PERMISSION_GRANTED
               || ActivityCompat.shouldShowRequestPermissionRationale(
                     this, perm)) {
            needRequestPermissonList.add(perm);
         } 
      }
      return needRequestPermissonList;
   }

   /**
    * 检测是否说有的权限都已经授权
    * @param grantResults
    * @return
    * @since 2.5.0
    *
    */
   private boolean verifyPermissions(int[] grantResults) {
      for (int result : grantResults) {
         if (result != PackageManager.PERMISSION_GRANTED) {
            return false;
         }
      }
      return true;
   }

   @Override
   public void onRequestPermissionsResult(int requestCode,
         String[] permissions, int[] paramArrayOfInt) {
      if (requestCode == PERMISSON_REQUESTCODE) {
         if (!verifyPermissions(paramArrayOfInt)) {
            showMissingPermissionDialog();
            isNeedCheck = false;
         }
      }
   }

   /**
    * 显示提示信息
    * 
    * @since 2.5.0
    *
    */
   private void showMissingPermissionDialog() {
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle(R.string.notifyTitle);
      builder.setMessage(R.string.notifyMsg);

      // 拒绝, 退出应用
      builder.setNegativeButton(R.string.cancel,
            new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {
                  finish();
               }
            });

      builder.setPositiveButton(R.string.setting,
            new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {
                  startAppSettings();
               }
            });

      builder.setCancelable(false);

      builder.show();
   }

   /**
    *  启动应用的设置
    * 
    * @since 2.5.0
    *
    */
   private void startAppSettings() {
      Intent intent = new Intent(
            Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
      intent.setData(Uri.parse("package:" + getPackageName()));
      startActivity(intent);
   }
   
   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event) {
      if(keyCode == KeyEvent.KEYCODE_BACK){
         this.finish();
         return true;
      }
      return super.onKeyDown(keyCode, event);
   }
      
}

————————————————————————————————————————————————————————

自己的Activity

public class Activity extends CheckPermissionsActivity implements
        AMap.OnMarkerClickListener,
        AMap.OnMapLoadedListener,
        AMap.OnMapClickListener,
        LocationSource,
        AMapLocationListener,
        GeocodeSearch.OnGeocodeSearchListener,
        AMap.OnCameraChangeListener{


    private MapView mMapView;
    private AMap                                     mAMap;
    private Marker                                   mGPSMarker;             //定位位置显示
    private AMapLocation                             location;
    private LocationSource.OnLocationChangedListener mListener;
    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明mLocationOption对象
    public AMapLocationClientOption mLocationOption = null;
    //你编码对象
    private GeocodeSearch                            geocoderSearch;

    private String                                   actualAddr;
    private Double                                   actualLon;
    private Double                                   actualLat;

    private MarkerOptions markOptions;
    private  LatLng  latLng;
    private String addressName;
    private TextView tv;

    LinearLayout fh;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cldw);
        mMapView = (MapView) findViewById(R.id.map);
        mMapView.onCreate(savedInstanceState);// 此方法必须重写

        fh=findViewById(R.id.fh);
        tv = findViewById(R.id.wz);


        initMap();

    }

    private void initMap() {

        fh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        geocoderSearch = new GeocodeSearch(this);
        mAMap = mMapView.getMap();
        // 设置定位监听
        mAMap.setOnMapLoadedListener(this);
        mAMap.setOnMarkerClickListener(this);
        mAMap.setOnMapClickListener(this);

        mAMap.setLocationSource(this);
        //设置地图拖动监听
        mAMap.setOnCameraChangeListener(this);
        geocoderSearch.setOnGeocodeSearchListener(this);
        MyLocationStyle myLocationStyle = new MyLocationStyle();
        //myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
        // myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
        // myLocationStyle.anchor(int,int)//设置小蓝点的锚点
        //myLocationStyle.strokeWidth(0f);// 设置圆形的边框粗细
        //myLocationStyle.anchor(0.5f, 0.7f);
        mAMap.setMyLocationStyle(myLocationStyle);

        mAMap.moveCamera(CameraUpdateFactory.zoomTo(15)); //缩放比例

        //添加一个圆
       /* CircleOptions circleOptions = new CircleOptions();
        circleOptions.radius(20.0f);
        mAMap.addCircle(circleOptions);*/

        //设置amap的属性
        UiSettings settings = mAMap.getUiSettings();
        settings.setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
        mAMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
    }

    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        location = aMapLocation;
        if (mListener != null && location != null)
        {
            if (location != null && location.getErrorCode() == 0)
            {
                mListener.onLocationChanged(location);// 显示系统箭头

                LatLng la = new LatLng(location.getLatitude(), location.getLongitude());

                setMarket(la, location.getCity(), location.getAddress());

                this.actualAddr = location.getAddress();
                this.actualLon = location.getLongitude();
                this.actualLat = location.getLatitude();

                mLocationClient.stopLocation();
                //                this.location = location;
                // 显示导航按钮
                //                btnNav.setVisibility(View.VISIBLE);
            }
        }

    }

    private void setMarket(LatLng latLng, String title, String content) {
        if (mGPSMarker != null)
        {
            mGPSMarker.remove();
        }
        //获取屏幕宽高
        WindowManager wm = this.getWindowManager();
        int width = (wm.getDefaultDisplay().getWidth()) / 2;
        int height = ((wm.getDefaultDisplay().getHeight()) / 2) - 80;
        markOptions = new MarkerOptions();
        markOptions.draggable(true);//设置Marker可拖动
        markOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.local))).anchor(0.5f, 0.7f);
        //设置一个角标
        mGPSMarker = mAMap.addMarker(markOptions);
        //设置marker在屏幕的像素坐标
        mGPSMarker.setPosition(latLng);
        // mGPSMarker.setTitle(title);
        tv.setText(content);
        //  mGPSMarker.setSnippet(content);
        //设置像素坐标
        mGPSMarker.setPositionByPixels(width, height);
        if (!TextUtils.isEmpty(content))
        {
            mGPSMarker.showInfoWindow();
        }
        mMapView.invalidate();
    }


    @Override
    public void onCameraChange(CameraPosition cameraPosition) {

    }

    @Override
    public void onCameraChangeFinish(CameraPosition cameraPosition) {
        latLng=cameraPosition.target;
        double latitude= latLng.latitude;
        double longitude= latLng.longitude;
        Log.e("latitude",latitude+"");
        Log.e("longitude",longitude+"");
        getAddress(latLng);
    }

    /**
     * 根据经纬度得到地址
     */
    public void getAddress(final LatLng latLonPoint) {
        // 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
        LatLonPoint latLonPoint1=new LatLonPoint(latLng.latitude,latLng.longitude);
        RegeocodeQuery query = new RegeocodeQuery(latLonPoint1, 500, GeocodeSearch.AMAP);
        geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
    }

    @Override
    public void onMapClick(LatLng latLng) {

    }

    @Override
    public void onMapLoaded() {

    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        if (marker.isInfoWindowShown()) {
            marker.hideInfoWindow();

        }
        else {
            marker.showInfoWindow();
        }
        return false;
    }

    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        mListener = onLocationChangedListener;
        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        //设置定位回调监听
        mLocationClient.setLocationListener(this);

        //初始化定位参数
        mLocationOption = new AMapLocationClientOption();
        //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.setNeedAddress(true);
        //设置是否只定位一次,默认为false
        mLocationOption.setOnceLocation(false);
        //设置是否强制刷新WIFI,默认为强制刷新
        mLocationOption.setWifiActiveScan(true);
        //设置是否允许模拟位置,默认为false,不允许模拟位置
        mLocationOption.setMockEnable(false);
        //设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(2000 * 10);
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //启动定位
        mLocationClient.startLocation();
    }

    @Override
    public void deactivate() {

    }

    @Override
    public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
        if (rCode == 1000) {
            if (result != null && result.getRegeocodeAddress() != null
                    && result.getRegeocodeAddress().getFormatAddress() != null) {

                addressName = result.getRegeocodeAddress().getFormatAddress(); // 逆转地里编码不是每次都可以得到对应地图上的opi

//              mAddressEntityFirst = new AddressSearchTextEntity(addressName, addressName, true, convertToLatLonPoint(mFinalChoosePosition));
                setMarket(latLng, location.getCity(), addressName);

            }
        }
    }

    @Override
    public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {

    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);
    }

    protected void onResume() {
        super.onResume();
        mMapView.onResume();
        // aMapEx.onRegister();
    }

    protected void onPause() {
        super.onPause();
        mMapView.onPause();
    }

    protected void onDestroy() {
        super.onDestroy();
        // 销毁定位
        if (mLocationClient != null)
        {
            mLocationClient.stopLocation();
            mLocationClient.onDestroy();
        }
        //        if (aMapEx != null) {
        //            aMapEx.onUnregister();
        //        }
        mMapView.onDestroy();
    }



}

————————————————————————————————————————————————————————

activyty_xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".cldw.CldwActivity">

    <LinearLayout
        android:layout_width="@dimen/dp_50"
        android:id="@+id/fh"
        android:layout_height="@dimen/dp_50">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/dp_15"
            android:layout_marginLeft="@dimen/dp_15"
            android:src="@mipmap/path" />

    </LinearLayout>

   <ImageView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:background="@mipmap/local_car_icon"
       android:layout_gravity="center"
       />

    <TextView
        android:id="@+id/wz"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#3b3b3b"
        android:textSize="@dimen/sp_16"
        android:text="车辆定位"
        android:layout_marginTop="@dimen/dp_15"
        android:layout_gravity="center"
        />



        <com.amap.api.maps.MapView
            android:layout_marginTop="@dimen/dp_10"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/map">
        </com.amap.api.maps.MapView>





</LinearLayout>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值