• 安卓定位可以通过使用GPS或者通过network获取地址,俩个都需要增加获取位置的权限!
  • 需要在AndroidManifest里面增加权限!
  • 分别介绍一下学习心得!
//ACCESS_FINE_LOCATION:允许APP访问精确地理位置。<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>//ACCESS_COARSE_LOCATION:允许APP访问大概地理位置<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

GPS具体实现:

//检查是否开启权限! if (ActivityCompat.checkSelfPermission(this,                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            Toast.makeText(this, "权限不够", Toast.LENGTH_LONG).show();            return;        }//获取一个地址管理者,获取的方法比较特殊,不是直接new出来的        LocationManager locationManager = (LocationManager) getSystemService(mContext.LOCATION_SERVICE);//使用GPS获取上一次的地址,这样获取到的信息需要多次,才能够显示出来,所以后面有动态的判断        Location location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);//判断是否用户打开了GPS开关,这个和获取权限没关系        GPSisopen(locationManager);//显示信息,可以根据自己的传入对应的location!!!        upLoadInfor(location);//获取时时更新,第一个是Provider,第二个参数是更新时间1000ms,第三个参数是更新半径,第四个是监听器    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 8, new LocationListener() {            @Override            /*当地理位置发生改变的时候调用*/            public void onLocationChanged(Location location) {                upLoadInfor(location);//实时的显示信息            }            /* 当状态发生改变的时候调用*/            @Override            public void onStatusChanged(String s, int i, Bundle bundle) {                Log.d("GPS_SERVICES", "状态信息发生改变");            }            /*当定位者启用的时候调用*/            @Override            public void onProviderEnabled(String s) {                Log.d("TAG", "onProviderEnabled: ");            }            @Override            public void onProviderDisabled(String s) {                Log.d("TAG", "onProviderDisabled: ");            }        });    }//判断是否用户打开GPS开关,并作指导性操作!   private void GPSisopen(LocationManager locationManager) {        if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {            Toast.makeText(this, "请打开GPS", Toast.LENGTH_SHORT);            final AlertDialog.Builder dialog = new AlertDialog.Builder(this);            dialog.setTitle("请打开GPS连接");            dialog.setMessage("为了获取定位服务,请先打开GPS");            dialog.setPositiveButton("设置", new android.content.DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialogInterface, int i) {                    //界面跳转                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);                    startActivityForResult(intent, 0);                }            });            dialog.setNegativeButton("取消", new android.content.DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialogInterface, int i) {                    dialogInterface.dismiss();                }            });            //调用显示方法!            dialog.show();        }    }//同时获取到的只是location如果想根据location获取具体地址,可以通过Android提供的API获取具体的地点!//传进来一个location返回一个Address列表,这个是耗时的操作所以需要在子线程中进行!!!//传进来一个location返回一个Address列表,这个是耗时的操作所以需要在子线程中进行!!!//传进来一个location返回一个Address列表,这个是耗时的操作所以需要在子线程中进行!!!   private List getAddress(Location location) {        List result = null;        try {            if (location != null) {                Geocoder gc = new Geocoder(this, Locale.getDefault());                result = gc.getFromLocation(location.getLatitude(),                        location.getLongitude(), 1);            }        } catch (Exception e) {            e.printStackTrace();        }        return result;    }//采取直接用匿名类的方法,构造了一个线程,但是在子线程中不能直接修改主线程的内容,否则会报错,但是!!!,当我用Android8.0模拟器测试的时候没有崩,当用Android7.0测试的时候直接崩溃,所以还是老老实实通过handler来解决这个问题!new Thread(new Runnable() {            @Override            public void run() {                Log.e("Run", "A new Thread");                try {                    final Location location1 = finalLocation;                    addresses = getAddress(location1                    );                    if (addresses != null) {                        Log.e("run: ", addresses.toString());                        Message message = new Message();                        message.what = 1;//信息内容                        handler.sendMessage(message);//发送信息                    }                } catch (Exception e) {                    Log.e("Exception", "ERRPOR");                }            }        }).start();//主线程中处理函数    private Handler handler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case 1:                    tvMapInfo.setText(tvMapInfo.getText() + "\n" + addresses.toString());                    break;                default:                    break;            }        }    };

基站定位:

  • 优点耗时短,缺点定位精度不如GPS
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

更多相关文章

  1. Java乔晓松-android中获取手机视频的缩略图
  2. Android中dip(dp)与px之间单位转换 dip2px dp转px 无context算法
  3. 使用FileProvider共享文件
  4. Android(安卓)Looper原理源码分析
  5. 重学 Android(安卓)面试题
  6. getDrawable()缓存带来的问题
  7. Android(安卓)RecyclerView DiffUtil 局部刷新 整理 踩坑 封装
  8. android获取Mac地址和IP地址
  9. Android获取assets文件夹中的数据并写入SD卡示例

随机推荐

  1. 【Android(安卓)Developers Training】 1
  2. Android(安卓)Wi-Fi ADB命令控制WIFI开启
  3. Android(安卓)4.0 MutliMedia 流程分析
  4. 序列化
  5. 修改android4.2系统源码实现system组和ro
  6. Android之“只是想来谈谈Handler机制”
  7. Android中的属性动画(Property Animation
  8. 2018-08-07
  9. AndroidStudioTip--用Builder模式替代构
  10. 查看Android应用包名package和入口activi