Android GPS定位与高德地图的使用

  • 1.GPS定位:android 的三种定位方式
  • 2.GPS定位代码
  • 使用高德地图

1.GPS定位:android 的三种定位方式

1.GPS定位:需要GPS硬件支持,直接和卫星交互来获取当前经纬度。
  优点:速度快、精度高、可在无网络情况下使用。
  缺点:首次连接时间长、只能在户外已经开阔地使用,设备上方有遮挡物就不行了、比较耗电。
2.Network定位:又细分为WIFI定位和基站定位
(1)基站定位:一般手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标
a.优点:受环境的影响情况较小,不管在室内还是人烟稀少的地方都能用,只要有基站。
b.缺点:首先需要消耗流量、其实精度没有GPS那么准确,大概在十几米到几十米之间
(2)WIFI定位:
a.优点:和基站定位一样,它的优势在于收环境影响较小,只要有Wifi的地方可以使用。
b.缺点:需要有wifi、精度不准
3.AGPS定位:AssistedGPS(辅助全球卫星定位系统),是结合GSM或GPRS与传统卫星定位

2.GPS定位代码

清单文件权限

   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

代码

public class MainActivity extends AppCompatActivity {    LocationManager manager;    String[] permissions;    boolean hasnoPermission=false;    boolean isOk=true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //要申请的权限列表        permissions=new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION};        manager = (LocationManager) getSystemService(LOCATION_SERVICE);//获得定位的管理类        initPermission();        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return;        }        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);    }    public void initPermission(){        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){            for(String per: permissions){                if(checkSelfPermission(per)!=PackageManager.PERMISSION_GRANTED){                    hasnoPermission=true;                    break;                }            }            if(hasnoPermission){               requestPermissions(permissions,100);            }        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if(requestCode==100){            for(int resule:grantResults){                        if(resule!=PackageManager.PERMISSION_GRANTED){                            isOk=true;                            break;                }            }            if(isOk){                Log.d("aaaa", "onRequestPermissionsResult: 权限没有申请成功");            }        }    }    LocationListener locationListener = new LocationListener() {        @Override        public void onLocationChanged(Location location) {            Log.d("aaaa", "onLocationChanged: 经度"+location.getLatitude());            Log.d("aaaa", "onLocationChanged: 纬度"+location.getLongitude());            Log.d("aaaa", "onLocationChanged: 海拔"+location.getAltitude());        }        @Override        public void onStatusChanged(String provider, int status, Bundle extras) {        }        @Override        public void onProviderEnabled(String provider) {        }        @Override        public void onProviderDisabled(String provider) {        }    };}

使用高德地图

添加依赖:implementation ‘com.amap.api:map2d:5.2.0’

xml布局

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <com.amap.api.maps2d.MapView        android:id="@+id/map"        android:layout_width="fill_parent"        android:layout_height="fill_parent" />LinearLayout>

Java代码

public class Main2Activity extends AppCompatActivity implements AMapLocationListener , LocationSource {    TextView mLocation;    MapView mapView;    AMap aMap;    OnLocationChangedListener mListener;    AMapLocationClient client;    AMapLocationClientOption op;    @RequiresApi(api = Build.VERSION_CODES.M)    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        checkPermisson();        mapView=findViewById(R.id.map);        mapView.onCreate(savedInstanceState);        if(aMap==null){            aMap=mapView.getMap();            init();        }    }    private void init() {        MyLocationStyle myLocationStyle=new MyLocationStyle();        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher_round));        myLocationStyle.radiusFillColor(Color.argb(100,0,0,180));        myLocationStyle.strokeWidth(1.0f);        aMap.setMyLocationStyle(myLocationStyle);        aMap.setLocationSource(this);        aMap.setMyLocationEnabled(true);    }    private void initLocation() {        client=new AMapLocationClient(getApplicationContext());        op=new AMapLocationClientOption();        client.setLocationListener(this);        op.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);        op.setInterval(1000);        op.setNeedAddress(true);        op.setMockEnable(true);        client.setLocationOption(op);        client.startLocation();    }    @Override    protected void onDestroy() {        super.onDestroy();        mapView.onDestroy();    }    @Override    protected void onPause() {        super.onPause();        mapView.onPause();    }    @Override    protected void onResume() {        super.onResume();        mapView.onResume();    }    @Override    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {        super.onSaveInstanceState(outState, outPersistentState);        mapView.onSaveInstanceState(outState);    }    @Override    public void onLocationChanged(AMapLocation aMapLocation) {//        Log.e("ZXY","errorCode"+aMapLocation.getErrorCode());//        Log.e("ZXY","errorInfo"+aMapLocation.getErrorInfo());//        Log.e("ZXY","地址:"+aMapLocation.getAddress());//        Log.e("ZXY","纬度:"+aMapLocation.getLatitude());//        Log.e("ZXY","经度:"+aMapLocation.getLongitude());          if(aMapLocation.getErrorCode()==0)             mListener.onLocationChanged(aMapLocation);    }    String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};    @RequiresApi(api = Build.VERSION_CODES.M)    public void checkPermisson(){        boolean flag=true;//默认全部被申请过        for(int i=0;i<permissions.length;i++){//只要有一个没有申请成功            if(!(ActivityCompat.checkSelfPermission(this,permissions[i])== PackageManager.PERMISSION_GRANTED)){                flag=false;            }        }        if(!flag){            //动态申请权限            requestPermissions(permissions,100);        }    }    @Override    public void activate(OnLocationChangedListener onLocationChangedListener) {        mListener=onLocationChangedListener;        if(client==null){             client=new AMapLocationClient(getApplicationContext());             op=new AMapLocationClientOption();             client.setLocationListener(this);             op.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);             client.setLocationOption(op);             client.startLocation();        }    }    @Override    public void deactivate() {        mListener=null;        if(client!=null){            client.stopLocation();            client.onDestroy();        }        client=null;    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if(requestCode==100){            boolean flag=true;            for(int i=0;i<grantResults.length;i++){                if(grantResults[i]!=PackageManager.PERMISSION_GRANTED){                    flag=false;                }            }            if(flag){                Toast.makeText(this, "ok ", Toast.LENGTH_SHORT).show();            }else{                Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();            }        }    }}

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Android(安卓)情景模式设置
  3. Android网络请求的几种方式(HttpUrlConnection、HttpClient、Voll
  4. cocos2d-x 跨平台特性之ios向android移植
  5. Android(安卓)基于Netty的消息推送方案之概念和工作原理(二)
  6. Android(安卓)Activity接收Service发送的广播
  7. 关于pdfbox在android平台中运行出错的原因分析
  8. android实时录制视频h263编码通过rtp打包udp发送到服务器
  9. Android(安卓)操作系统获取Root权限 原理详细解析

随机推荐

  1. sqlserver 存储过程动态参数调用实现代码
  2. 小议sqlserver数据库主键选取策略
  3. sqlserver自动增长列引起的问题解决方法
  4. SQL语句 一个简单的字符串分割函数
  5. sqlserver 数据库连接字符串中的可选项收
  6. sqlserver 文件数据库和关系数据库的比较
  7. sqlserver数据库迁移后,孤立账号解决办法
  8. SQL语句练习实例之一——找出最近的两次
  9. SQL语句练习实例之二——找出销售冠军
  10. SQL语句练习实例之三——平均销售等待时