GPS定位与高德地图的使用
16lz
2021-01-25
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(); } } }}
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- Android(安卓)情景模式设置
- Android网络请求的几种方式(HttpUrlConnection、HttpClient、Voll
- cocos2d-x 跨平台特性之ios向android移植
- Android(安卓)基于Netty的消息推送方案之概念和工作原理(二)
- Android(安卓)Activity接收Service发送的广播
- 关于pdfbox在android平台中运行出错的原因分析
- android实时录制视频h263编码通过rtp打包udp发送到服务器
- Android(安卓)操作系统获取Root权限 原理详细解析