android开发怎么获得手机的gps?
第一步,申明权限。(5.0之后权限需要动态申请,具体代码和这个问题无关就不贴出来了)第二步通过LocationManager类获取位置信息,下面是一个封装好的工具类***CreatedbyDELLzhanghuirongon2019/3/15.*获取当前位置信息*/publicclassMyLocationUtil{privatestaticStringprovider;publicstaticLocationgetMyLocation(){//获取当前位置信息//获取定位服务LocationManagerlocationManager=(LocationManager)MyApp.getContext().getSystemService(Context.LOCATION_SERVICE);//获取当前可用的位置控制器Listlist=locationManager.getProviders(true);if(list.contains(locationManager.GPS_PROVIDER)){//GPS位置控制器provider=locationManager.GPS_PROVIDER;//GPS定位}elseif(list.contains(locationManager.NETWORK_PROVIDER)){//网络位置控制器provider=locationManager.NETWORK_PROVIDER;//网络定位}if(provider!=null){if(ActivityCompat.checkSelfPermission(MyApp.getContext(),Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED&&ActivityCompat.checkSelfPermission(MyApp.getContext(),Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED){//TODO:Considercalling//ActivityCompat#requestPermissions//heretorequestthemissingpermissions,andthenoverriding//publicvoidonRequestPermissionsResult(intrequestCode,String[]permissions,//int[]grantResults)//tohandlethecasewheretheusergrantsthepermission.Seethedocumentation//forActivityCompat#requestPermissionsformoredetails.returnnull;}LocationlastKnownLocation=locationManager.getLastKnownLocation(provider);returnlastKnownLocation;}else{ToastUtils.makeText(\"请检查网络或GPS是否打开\");}returnnull;}}第三步(其实到上一步这个问题已经解决了,这个算扩展吧)将位置信息转换成地址信息。在高德或者百度地图开发者平台申请访问api许可。将第二步获取到的经纬度信息上传查询对应坐标信息。因为百度和高德用的不是同一个坐标系,查询时仔细看官方API。直接通过安卓的原生接口获取一个gps的位置意义不是很大。这个数据在一定的坐标系上才有意义。建议去高德的开发平台注册个帐号,引入sdk来做,地理位置与地理位置解析的概念先了解下吧。//第一步先获取LocationManager的对象LocationManagerGpsManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);//通过LocationManager的对象来获取到Location的信息。Locationlocation=GpsManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);//Location中经常用到的有以下几种:/*location.getAccuracy();精度location.getAltitude();高度:海拔location.getBearing();导向location.getSpeed();速度location.getLatitude();纬度location.getLongitude();经度location.getTime();UTC时间以毫秒计*/注:需要添加使用权限的哦
Android Binder Hook的实现
Binder Hook 可以 Hook 掉当前进程用到的系统 Service 服务。 以 LocationManager 为例,在获取一个 LocationManager 时分为两步: (1) 获取 IBinder 对象; (2) 通过 IBinder 的 asInterface() 方法转化为 LocationMangerService 对象,接着初始化 LocationManager 。 application 层用到的都是 LocationManager 对象。 原理: 整个过程需要利用反射设置一个自定义的 Binder 对象和一个自定义的 Service 对象。由于我们只 Hook 其中一部分的功能,其他功能还需要保留,所以要用动态代理的方式创建自定义对象。 在理解后面的内容前你需要了解这些知识点: Activity 等类在获取系统 Service 时,都是调用 getSystemService(serviceName) 方法获取的。 Context # getSystemService() 方法最终会调用到 ServiceManager # getService() 方法中。以 LocationManager 对应的 ServiceFetcher 为例,它的 createService() 方法源码如下: 假如我们要 Hook 掉 LocationManager # getLastKnownLocation() 方法(下文都是)。我们要做的就是让 ServiceManager.getService(Context.LOCATION_SERVICE) 返回我们自定义的 Binder 对象。 先看一下这个方法的源码: sCache 是一个 Map,缓存了已经向系统请求过的 Binder。如果需要让这个方法返回我们自己的 binder 对象,只需要事先往 sCache 中 put 一个自定义的 Binder 对象就行了。 在 put 之前,需要先创建出一个自定义的 Binder。这个 Binder 在被 ILocationManager.Stub.asInterface 处理后,可以返回一个自定义的 LocationManagerService 对象。 先看一下 Binder 的 asInterface() 的实现: 如果把 queryLocalInterface()方法返回一个自定义的Service,使得走 if 语句内部,不走 else,那就算是Hook 成功了。 假设我们想让系统的 LocationManager 返回的位置信息全是在天安门(116.23, 39.54)。那我们需要使得 LocatitionManagerService 的 getLastLocation() 方法 返回的全是 (116.23, 39.54)。 由于我们不能直接拿到系统的这个Service对象,可以先用反射的方式拿到系统的LocationManagerService。然后拦截 getLastLocation() 方法。 原生的Binder对象在调用 queryLocalInterface() 方法时会返回原生的Service对象。我们希望返回3.1中的自定义Service。所以这里拦截 queryLocalInterface() 方法。 有了自定义的 Binder 后,将它注入到 ServiceManger 的 sCache 变量中就完成 Hook 了~ 当onClick被调用的时候,Toast和Log都会显示天安门的坐标(116.23, 39.54)。证明Hook成功! 你甚至可以用Binder Hook的方式Hook掉 ActivityManager 。