GPS定位。Android 系统提供了地理位置服务相关的 API

package com.tsh.mylocation;

import android.app.Activity;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {
    private LocationManager lm;
    private LocationListener listener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取位置管理器
        lm=(LocationManager) getSystemService(LOCATION_SERVICE);
        listener=new MyLocationListener();
        lm.requestLocationUpdates("gps", 0, 0, listener);
    }
    private class MyLocationListener implements LocationListener{

        @Override
        public void onLocationChanged(Location location) {
            //获取经度
            String longitude="经度:"+location.getLongitude();
            String latitude="纬度:"+location.getLatitude();
            String acc="精确度:"+location.getAccuracy();
            Toast.makeText(MainActivity.this, longitude+latitude+acc, 1).show();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {

        }

    }
}

接通下去我们拿落实直播中之定势功能。

 

固定主要发生以下权限:

 

本文也菜鸟窝作者蒋志碧的连载。“从 0 开始开发同慢慢悠悠直播 APP
”系列来聊天时下最恼火的直播
APP,如何完整的落实一个类似”腾讯直播”的商业化项目

onStatusChanged(),当状态改变之时刻回调,关闭 开启

Geocoder 代码示例

private static String getAddressFromLocation(final Activity activity, Location location) {
    //Geocoder初始化
    Geocoder geocoder = new Geocoder(activity);
    //判断Geocoder地理编码是否可用
    boolean falg = geocoder.isPresent();
    try {
        //获取纬度和经度
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        //根据经纬度获取地理信息
        List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
        if (addresses.size() > 0) {
            //返回当前位置,精度可调
            Address address = addresses.get(0);
            String sAddress;
            if (!TextUtils.isEmpty(address.getLocality())) {
                if (!TextUtils.isEmpty(address.getFeatureName())) {
                    //存储 市 + 周边地址
                    sAddress = address.getLocality() + " " + address.getFeatureName();

                    //address.getCountryName() 国家
                    //address.getPostalCode() 邮编
                    //address.getCountryCode() 国家编码
                    //address.getAdminArea() 省份
                    //address.getSubAdminArea() 二级省份
                    //address.getThoroughfare() 道路
                    //address.getSubLocality() 二级城市
                } else {
                    sAddress = address.getLocality();
                }
            } else {
                sAddress = "定位失败";
            }
            return sAddress;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "";
}

网稳定,手机并上wifi 2g
3g的时光,手时来一个ip,误差很特别

代码中涉嫌到 MVP实现稳,Android 6.0 运行时权验证,带动画的自定义
switch 控件,请戳链接

onProviderDisabled(),当某一个职提供者不可用了

5.1、PublishPresenter :定位逻辑实现类似

初始化 onLocationListener 定位监听接口,如果固定打响,通过调用
mIPublishView.doLocationSuccess(location)
方法,提示定位打响,mIPublishView.doLocationFailed()
提示定位失败。定位按钮点击调用 doLocation() 方法最终水到渠成位置信息显示。

public class PublishPresenter extends IPublishPresenter {
    private IPublishView mIPublishView;
    private String TAG = PublishPresenter.class.getSimpleName();

    public PublishPresenter(IPublishView iPublishView) {
        super(iPublishView);
        this.mIPublishView = iPublishView;
    }

  public LocationMgr.onLocationListener getOnLocationListener() {
      return mOnLocationListener;
  }
    //初始化定位监听回调接口
  private LocationMgr.onLocationListener mOnLocationListener = new LocationMgr.onLocationListener() {
      @Override
      public void onLocationChanged(int code, double lat1, double long1, String location) {
          //0 表示成功
          if (0 == code) {
              mIPublishView.doLocationSuccess(location);
          } else {
              mIPublishView.doLocationFailed();
          }
      }
  };

  //定位
  @Override
  public void doLocation() {
      if (LocationMgr.checkLocationPermission(mIPublishView.getActivity())) {
          //成功返回地理位置信息结果
          boolean success = LocationMgr.getMyLocation(mIPublishView.getActivity(), mOnLocationListener);
          if (!success) {
              mIPublishView.doLocationFailed();
          }
      }
  }
}

 

其三、LocationManager 使用初探

1、获取 LocationManager

2、判断定位服务(GPS,WIFI,基站)是否可用

3、设置固定监听,获取经纬度

public void getMyLocation(Context context){
  // 获取 LocationManager 实例
  mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  // 判断网络定位是否可用,可替换成 GPS 定位。
  if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    0, 0, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    //位置发生改变时回调该函数
                    location.getLatitude();//纬度
                    location.getLongitude();//经度
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras){
                      //状态改变回调
                      //provider:定位器名称(NetWork,Gps等)
                      //status: 3种状态,超出服务范围,临时不可用,正常可用
                      //extras: 包含定位器一些细节信息
                }

                @Override
                public void onProviderEnabled(String provider) {
                    //定位开启回调
                }

                @Override
                public void onProviderDisabled(String provider) {
                    //定位关闭回调
                }
            });
        } 
}

急需之权位

5.2、PublishActivity

实例化定位按钮,调用定位功能
mPublishPresenter.doLocation(),实现稳定打响和挫折方法并作处理。

public class PublishActivity extends BaseActivity implements View.OnClickListener, IPublishView{
private TextView mTvLBS;
private PublishPresenter mPublishPresenter;
@Override
protected void setListener() {
    mBtnLBS.setOnClickListener(this);
}
@Override
public void onClick(View v) {
    switch (v.getId()) {
        //定位
        case R.id.btn_lbs:
            if (mBtnLBS.isChecked()) {
                mBtnLBS.setChecked(false, true);
                mTvLBS.setText("不显示地理位置");
            } else {
                mBtnLBS.setChecked(true, true);
                mTvLBS.setText("正在定位中");
                //调用定位功能
                mPublishPresenter.doLocation();
            }
            break;
    }
}
//定位成功
@Override
public void doLocationSuccess(String location) {
    mTvLBS.setText(location);
}
//定位失败
@Override
public void doLocationFailed() {
    mTvLBS.setText("定位失败");
    mBtnLBS.setChecked(false, false);
}

    /**
     * 权限验证回调
     * <p>
     * 1、权限通过 ActivityCompat 类的 checkSelfPermission() 方法判断是否有所需权限。PublishPresenter.java # checkPublishPermission()
     * 2、权限请求是通过 ActivityCompat 类中的 requestPermissions() 方法,
     * 在 OnRequestPermissionsResultCallback # onRequestPermissionsResult() 方法中回调。PublishActivity.java # onRequestPermissionsResult()
     * 3、应用程序可以提供一个额外的合理的使用权限调用 Activitycompat # shouldShowRequestPermissionRationale() 方法。
     * Android 原生系统中,如果第二次弹出权限申请的对话框,会出现「以后不再弹出」的提示框,如果用户勾选了,你再申请权限,
     * 则 shouldShowRequestPermissionRationale() 返回 true,意思是说要给用户一个解释,告诉用户为什么要这个权限。
     *
     * @param requestCode  请求码
     * @param permissions  权限数组
     * @param grantResults 授予结果数组
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            //定位权限
            case Constants.LOCATION_PERMISSION_REQ_CODE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //获取地理位置失败处理
                    if (!LocationMgr.getMyLocation(this, mPublishPresenter.getOnLocationListener())) {
                        mTvLBS.setText("定位失败");
                        mBtnLBS.setChecked(false, false);
                    }
                }
                break;
        }
    }
}

运行结果

公海赌船网址 1

详情转至
GitHub
参考:

https://developer.android.com/reference/android/location/LocationManager.html\#GPS\_PROVIDER

https://developer.android.com/reference/android/location/Geocoder.html

http://blog.csdn.net/feiduclear\_up/article/details/50704127

https://my.oschina.net/JumpLong/blog/89266

撸这个类别的一半,你便是大神 ,
戳http://mp.weixin.qq.com/s/ZagocTlDfxZpC2IjUSFhHg

国家对坐标进行了加偏处理,变成火星坐标,需要国家测绘局的插件,网上发出火星坐标转换代码

季、定位工具类包装:LocationMgr

要害功效:监测定位权限,通过网络取位置信息,通过经纬度解码地理位置

public class LocationMgr {
    private static String TAG = LocationMgr.class.getSimpleName();
    private static LocationListener mLocationListener;

    //监测定位权限
    public static boolean checkLocationPermission(final Activity activity) {
        if (Build.VERSION.SDK_INT >= 23) {
            if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION)) {
                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Constants.LOCATION_PERMISSION_REQ_CODE);
                return false;
            }
        }
        return true;
    }

    /**
     * 根据经纬度解码地理位置
     * @param activity
     * @param location
     * @return
     */
    private static String getAddressFromLocation(final Activity activity, Location location) {
        Geocoder geocoder = new Geocoder(activity);
        try {
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            Log.d(TAG, "getAddressFromLocation->lat:" + latitude + ", long:" + longitude);
            List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
            if (addresses.size() > 0) {
                //返回当前位置,精度可调
                Address address = addresses.get(0);
                String sAddress;
                if (!TextUtils.isEmpty(address.getLocality())) {
                    if (!TextUtils.isEmpty(address.getFeatureName())) {
                        sAddress = address.getLocality() + " " + address.getFeatureName();
                    } else {
                        sAddress = address.getLocality();
                    }
                } else {
                    sAddress = "定位失败";
                }
                return sAddress;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 获取位置
     * @param activity
     * @param locationListener
     * @return
     */
    public static boolean getMyLocation(final Activity activity, final onLocationListener locationListener) {
        final LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
      //判断网络定位是否可用
        if (!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            //调用定位提示对话框,打开定位功能
            AlertDialog.Builder builder
                    = new AlertDialog.Builder(activity);
            builder.setMessage("尚未开启位置定位服务");
            builder.setPositiveButton("开启", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //启动定位Activity
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    activity.startActivity(intent);
                }
            });

            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });

            builder.show();
            return false;
        }
        //权限检查
        if (!checkLocationPermission(activity)) {
            return true;
        }

      // 通过网络获取位置
        Location curLoc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (null == curLoc) {
            mLocationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    //获取解码的地理位置
                    String strAddress = getAddressFromLocation(activity, location);
                    if (TextUtils.isEmpty(strAddress)) {
                      //定位失败回调
                        locationListener.onLocationChanged(-1, 0, 0, strAddress);
                    } else {
                      //定位成功回调
                        locationListener.onLocationChanged(0, location.getLatitude(), location.getLongitude(), strAddress);
                    }
                  //关闭 GPS 定位功能
                    locationManager.removeUpdates(this);
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
                  //关闭 GPS 定位功能
                    locationManager.removeUpdates(this);
                }

                @Override
                public void onProviderEnabled(String provider) {
                  //关闭 GPS 定位功能
                    locationManager.removeUpdates(this);
                }

                @Override
                public void onProviderDisabled(String provider) {
                  //关闭 GPS 定位功能
                    locationManager.removeUpdates(this);
                }
            };
          //设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,8000,0,mLocationListener);
        }else {
            //获取解码的地理位置
            String strAddress = getAddressFromLocation(activity,curLoc);
            if (TextUtils.isEmpty(strAddress)) {
              //定位失败回调
                locationListener.onLocationChanged(-1, 0, 0, strAddress);
            } else {
              //定位成功回调
                locationListener.onLocationChanged(0, curLoc.getLatitude(), curLoc.getLongitude(), strAddress);
            }
        }
        return true;
    }
    //自定义定位监听回调接口
    public interface onLocationListener {
        void onLocationChanged(int code, double lat1, double long1, String location);
    }
}

基站定位,精确度和基站的略有关,几十米及几公里的误差

Android 系统提供了地理位置服务相关的 API
方便开发者去取得当前的地理位置,在 android.loaction
包下要出以下简单个像样。

 


调用location对象的getLongitude()方法,得到经度


 


定义MyLocationListener实现LocationListener,实现它下面的方法

二、Geocoder

Geocoder
用于拍卖刚于编码和倒为编码。地理编码是以街道地址或其他地理位置换为(纬度,经度)坐标的经过。逆向地理编码是以(纬度,经度)坐标转换为(部分)地址之长河。反向地理编码位置描述负的细节数量可能会见有所不同,例如可能含有最近建筑的圆街道地址,而另外一个或就包含城市称号及邮政编码。Geocoder
类需要一个免含在中心 android
框架中的后端服务。如果平台受到并未后端服务,Geocoder
查询艺术将回一个空列表。使用 isPresent() 方法来确定Geocoder
实现是否留存。由于国内使用不了Google Services
服务,因此一般的手机厂商还见面以协调之无绳电话机内放置百度地图服务,或者高德地图服务来顶替
Google Services 服务。

首要有以下措施

isPresent():判断当前设备是否坐了地理位置服务。返回 true 表示
Geocoder 地理编码可以利用,否则不得使用。

getFromLocationName():返回描述地理位置信息的聚集。locationName:地址,maxResults:返回地址数据(1-5)

getFromLocation():根据经纬度返回对应的地理位置信息。latitude:纬度,longitude:经度,maxResults:返回地址的多寡(1-5)。

公海赌船网址 2

LocationListener是一个接口,需要举行它的兑现类似

1.2、LocationListener 位置监听器接口

public interface LocationListener {
    //当坐标改变时触发此函数
    void onLocationChanged(Location location);

    //当provider的状态改变时,该方法被调用。状态有三种:
    //LocationProvider#OUT_OF_SERVICE:无服务
    //LocationProvider#TEMPORARILY_UNAVAILABLE:provider不可用
    //LocationProvider#AVAILABLE:provider可用
    void onStatusChanged(String provider, int status, Bundle extras);

    //当provider可用时调用,比如 GPS 可用时就会调用该方法。
    void onProviderEnabled(String provider);

    //当provider不可用时调用该方法。比如 GPS 未打开,GPS 不可用就会调用该方法。
    void onProviderDisabled(String provider);
}

调用LocationManager对象的requestLocationUpdates()方法,请求位置更新,参数:

现Android 开发取得用户地理位置曾越来越简单,各种地图 SDK
都提供精确定位方法。不过假如需要被只是需要模糊定位及用户之市,系统 API
完全可满足急需,这时要重复并入一个地形图 SDK 显得很臃肿。系统 API
进行定位都蛮宽泛了,只是当 Android 6.0
版本在了千钧一发权限的动态验证,只待以原本基础及判断权即可。

将LocationListener对象置为null,垃圾回收

一、LocationManager

LocationManager
提供系统稳定服务,这些服务允许应用程序定期更新装备的地理位置,或者当设备进加地理位置紧邻时,触发应用指定意图。

LocationManager 不可知直接实例化,需要以如下方法

Context.getSystemService(Context.LOCATION_SERVICE)

于 LocationManager 中务必询问一点儿单第一知识点:

1、provider

2、LocationListener

GPS定位,至少用三粒卫星才能够定点,在广的地方标准

2、Geocoder:根据经纬度获取详细信息/根据相信地址获取经纬度信息

android.permission.ACCESS_MOCK_LOCATION 获取模拟的职务(模拟器开发之时段)

1.4、绑定监听和解绑监听

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

locationManager.removeUpdates(locationListener);

 

五、LocationMgr 的使用

android.permission.ACCESS_FINE_LOCATION 获取精准位置

1、LocationManager:用于获取地理位置的中纬度信息

onProviderEnabled(),当某一个职务提供者可用了

1.3、获得 LocationManager 实例

protected LocationManager  locationManager;
locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);

当activity销毁之时光,取消监听位置

1.1、provider

职信息提供者。android系统一般提供三种植方法取得地理位置信息。

1、GPS_PROVIDER:通过
GPS
来得到地理位置的经纬度信息。优点(获取地理位置信息精确度高),缺点(只能于露天使用,获取经纬度信息耗时,耗电)。

2、NETWORK_PROVIDER:通过活动网络的基站或者
Wi-Fi
来抱地理位置。优点(只要出网络,就可以便捷稳定,室内室外还只是),缺点(精确度不强)。

3、PASSIVE_PROVIDER:被动接受更新地理位置信息,而休用好要地理位置信息。该
PASSIVE_PROVIDER 返回的职是经另外 providers 产生的,你可查询
getProvider() 方法决定位置更新的因,需要 ACCESS_FINE_LOCATION
权限,但是若未启用 GPS,则这 provider 可能就回去粗略位置匹配。

LocationManager 提供了以下几栽艺术来博取地理位置提供者。

//返回当前设备的所有 provider
public List<String> getAllProviders();
//当 enabledOnly 为 true 时,返回当前设备可使用的 provider,enabledOnly 为发false,返回所有 provider
public List<String> getProviders(boolean enabledOnly);
//返回当前设备最符合条件的 provider。Criteria:指定条件,enabledOnly:返回当前设备可用的 provider
public String getBestProvider(Criteria criteria, boolean enabledOnly);
//返回符合条件的 provider,Criteria:指定条件,enabledOnly:返回当前设备可用的 provider
public List<String> getProviders(Criteria criteria, boolean enabledOnly);

手机使用A-GPS需要网络来赞助定位,定位速度快,网络记录了上次之卫星轨道,

【从 0 开始开同放缓直播 APP】5.1 MVP 完全解析 —
实现直播登录
【从 0 开始开同款直播 APP】13 Android 6.0
运行时权
【从 0 开始开同舒缓直播 APP】14 animation-list 逐帧动画从定义 Switch
控件

 

//网络权限
<uses-permission android:name="android.permission.INTERNET"/>
//模糊定位权限:一般用于网络定位
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
//精确定位权限:一般用于gps定位
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

手机一贯的老三栽办法:网络稳定,基站定位,GPS定位

Criteria

指令选择 provider 的应用程序标准的类似。providers
可以根据准确性,功率使用状况,报告高度,速度和方向的力和货币资产进行选择。该类用于指定率先选择最好符合条件的
provider,根据
Cirteria
指定的基准,设备会自动选择啊种 provider。

//指示纬度和经度所需的精度。参数:Criteria.ACCURACY_FINE:表示高精确度。Criteria.ACCURACY_COARSE:表示模糊精确度。
public void setAccuracy(int accuracy);
//是否需要海拔信息
public void setAltitudeRequired(boolean altitudeRequired);
//设置方位精度。参数:Criteria.NO_REQUIREMENT 无, Criteria.ACCURACY_LOW 低, Criteria.ACCURACY_HIGH 高。
public void setBearingAccuracy(int accuracy);
//指示是否要求方位信息
public void setBearingRequired(boolean bearingRequired);
//是否允许收费
public void setCostAllowed(boolean costAllowed);
//设置水平方向精准度
public void setHorizontalAccuracy(int accuracy);
//设置垂直方向精准度
public void setVerticalAccuracy(int accuracy);
//设置电池消耗要求 参数:Criteria.NO_REQUIREMENT 无, Criteria.POWER_LOW 低, Criteria.POWER_MEDIUM 中, Criteria.POWER_HIGH 高。
public void setPowerRequirement(int level);
//设置速度精度
public void setSpeedAccuracy(int accuracy);
//是否要求速度信息
public void setSpeedRequired(boolean speedRequired);
//-----------------------------split line-------------------------------------
                             Criteria 的使用
//-----------------------------split line-------------------------------------
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置定位精准度
criteria.setAltitudeRequired(false);//是否要求海拔
criteria.setBearingRequired(true);//是否要求方向
criteria.setCostAllowed(true);//是否要求收费
criteria.setSpeedRequired(true);//是否要求速度
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);//设置电池耗电要求
criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH);//设置方向精确度
criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);//设置速度精确度
criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);//设置水平方向精确度
criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);//设置垂直方向精确度
//返回满足条件的,当前设备可用的location provider,当第二个参数为false时,返回当前设备所有provider中最符合条件的那个provider(但是不一定可用)。
String mProvider  = mLocationManager.getBestProvider(criteria,true);

android.permission.ACCESS_COARSE_LOCATION 公海赌船网址获取粗略的位置

调用Location对象的getAccuracy()方法,得到精确度

onLocationChanged(),当位置变动的当儿回调,传递进入一个Location对象

调用LocationManager对象的removeUpdates(),取消监听,参数:LocationListener对象

固定法(“gps”),更新时间(60000),更新距离(50),LocationListener对象

 

获取LocationManager对象,通过getSystemService(LOCATION_SERVICE)

 

模拟器上,ddms里面发送以下职务,才能够显

调用Location对象的getLatitude()方法,得到维度

 

 

重写activity的onDestroy()方法

 

相关文章