android132 360 05 手机定位

时间:2022-09-23 12:53:46
.网络定位:根据ip地址定位,根据ip地址在实际地址数据库中查询实际地址。
缺点:动态ip导致地址不准确。
.基站定位:3个基站就可以确定实际位置,定位范围是几百米到几公里不等。
.GPS定位:美国卫星定位系统(北斗定位是中国的),至少3颗卫星就可以定位,GPS使用24颗卫星基本就可以覆盖全球90%范围,GPS不需要网络只要能够接受卫星信号就可以了,定位的精度比较准确几米到几十米不等。缺点是容易受云层和建筑干扰。
.安卓采用A-GPS(辅助GPS定位系统),弥补GPS定位缺点,可以通过网络和GPS共同定位,如果GPS信号不强就用网络,网络信号不强就用GPS.范围是几米到几十米。
package com.itheima52.location;

import java.util.List;

import android.app.Activity;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
/*
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 粗糙位置信息,
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> 模拟器模拟的经纬度坐标,
*/ //获取经纬度
public class MainActivity extends Activity { private TextView tvLocation;
private LocationManager lm;
private MyLocationListener listener; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvLocation = (TextView) findViewById(R.id.tv_location);
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
List<String> allProviders = lm.getAllProviders();// 获取所有位置提供者(网络(NETWORK_PROVIDER = "network"),基站(PASSIVE_PROVIDER = "passive"),GPS(GPS_PROVIDER = "gps"))
System.out.println(allProviders);
listener = new MyLocationListener();
// 参1表示位置提供者(通过GPS更新),参2表示最短更新位置时间0表示立即更新,参3表示最短更新位置距离0表示立即更新。
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
} class MyLocationListener implements LocationListener { // 位置发生变化回调
@Override
public void onLocationChanged(Location location) {
String j = "经度:" + location.getLongitude();
String w = "纬度:" + location.getLatitude();
String accuracy = "精确度:" + location.getAccuracy();
String altitude = "海拔:" + location.getAltitude();
tvLocation.setText(j + "\n" + w + "\n" + accuracy + "\n" + altitude);
} // 位置提供者状态发生变化(GPS没有信号变成有信号)
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("onStatusChanged");
} // 用户打开gps
@Override
public void onProviderEnabled(String provider) {
System.out.println("onProviderEnabled");
} // 用户关闭gps
@Override
public void onProviderDisabled(String provider) {
System.out.println("onProviderDisabled");
} } @Override
protected void onDestroy() {
super.onDestroy();
lm.removeUpdates(listener);// 手机定位其实是启动了一个服务,当activity销毁时,服务不会停止,所以要手动停止更新位置, 节省电量,
} }
public class Demo {
//火星坐标
public static void main(String[] args) {
try {
ModifyOffset instance = ModifyOffset.getInstance(ModifyOffset.class
.getResourceAsStream("axisoffset.dat"));
PointDouble s2c = instance.s2c(new PointDouble(116.29049474,
40.04302021));// 标准坐标转化为火星坐标 System.out.println(s2c);
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.InputStream;
import java.io.ObjectInputStream; /**
* 火星地球坐标转化.地图坐标修偏(火星坐标是人为加偏后的坐标)
*/
public class ModifyOffset {
private static ModifyOffset modifyOffset;
static double[] X = new double[660 * 450];
static double[] Y = new double[660 * 450]; private ModifyOffset(InputStream inputStream) throws Exception {
init(inputStream);
} public synchronized static ModifyOffset getInstance(InputStream is) throws Exception {
if (modifyOffset == null) {
modifyOffset = new ModifyOffset(is);
}
return modifyOffset;
} public void init(InputStream inputStream) throws Exception {
ObjectInputStream in = new ObjectInputStream(inputStream);
try {
int i = 0;
while (in.available() > 0) {
if ((i & 1) == 1) {
Y[(i - 1) >> 1] = in.readInt() / 100000.0d;
;
} else {
X[i >> 1] = in.readInt() / 100000.0d;
;
}
i++;
}
} finally {
if (in != null)
in.close();
}
} // standard -> china
public PointDouble s2c(PointDouble pt) {
int cnt = 10;
double x = pt.x, y = pt.y;
while (cnt-- > 0) {
if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
return pt;
int ix = (int) (10.0d * (x - 72.0d));
int iy = (int) (10.0d * (y - 10.0d));
double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
x = (x + pt.x + (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] + dx
* (1.0d - dy) * X[ix + 660 * iy + 1] + dx * dy
* X[ix + 660 * iy + 661] + (1.0d - dx) * dy
* X[ix + 660 * iy + 660] - x) / 2.0d;
y = (y + pt.y + (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] + dx
* (1.0d - dy) * Y[ix + 660 * iy + 1] + dx * dy
* Y[ix + 660 * iy + 661] + (1.0d - dx) * dy
* Y[ix + 660 * iy + 660] - y) / 2.0d;
}
return new PointDouble(x, y);
} // china -> standard
public PointDouble c2s(PointDouble pt) {
int cnt = 10;
double x = pt.x, y = pt.y;
while (cnt-- > 0) {
if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
return pt;
int ix = (int) (10.0d * (x - 72.0d));
int iy = (int) (10.0d * (y - 10.0d));
double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
x = (x + pt.x - (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] - dx
* (1.0d - dy) * X[ix + 660 * iy + 1] - dx * dy
* X[ix + 660 * iy + 661] - (1.0d - dx) * dy
* X[ix + 660 * iy + 660] + x) / 2.0d;
y = (y + pt.y - (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] - dx
* (1.0d - dy) * Y[ix + 660 * iy + 1] - dx * dy
* Y[ix + 660 * iy + 661] - (1.0d - dx) * dy
* Y[ix + 660 * iy + 660] + y) / 2.0d;
}
return new PointDouble(x, y);
} } class PointDouble {
double x, y; PointDouble(double x, double y) {
this.x = x;
this.y = y;
} public String toString() {
return "x=" + x + ", y=" + y;
}
}

通过service启动坐标定位:

package com.itheima52.mobilesafe.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder; /**
* 获取经纬度坐标的service
* 清单文件注册:<service android:name=".service.LocationService" ></service>
*
* //Context context;
context.startService(new Intent(context, LocationService.class));// 开启定位服务,调用LocationService的onCreate方法。
SharedPreferences sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);
String location = sp.getString("location","getting location...");
System.out.println("location:" + location);
abortBroadcast();// 中断短信的传递, 从而系统短信app就收不到内容了,不中断则系统短信还是能够接收到短信。
*/
public class LocationService extends Service { private LocationManager lm;
private MyLocationListener listener;
private SharedPreferences mPref; @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
mPref = getSharedPreferences("config", MODE_PRIVATE);
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
// List<String> allProviders = lm.getAllProviders();// 获取所有位置提供者
// System.out.println(allProviders);
Criteria criteria = new Criteria();
criteria.setCostAllowed(true);// 是否允许付费,比如使用3g网络定位,如果设为false则没有GPS只有流量因为要流量钱就不开启。
criteria.setAccuracy(Criteria.ACCURACY_FINE);//精确度为fine:一般的精确度。
String bestProvider = lm.getBestProvider(criteria, true);// 获取最佳位置提供者,true表示Provider可用就返回,false表示不管可不可用都返回。
listener = new MyLocationListener();
lm.requestLocationUpdates(bestProvider, 0, 0, listener);// 参1表示位置提供者,参2表示最短更新时间,参3表示最短更新距离
} //
class MyLocationListener implements LocationListener { // 位置发生变化
@Override
public void onLocationChanged(Location location) {
System.out.println("get location!");
// 将获取的经纬度保存在sp中
mPref.edit()
.putString(
"location",
"j:" + location.getLongitude() + "; w:"
+ location.getLatitude()).commit(); stopSelf();//停掉service
}
// 位置提供者状态发生变化
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("onStatusChanged");
}
// 用户打开gps
@Override
public void onProviderEnabled(String provider) {
System.out.println("onProviderEnabled");
}
// 用户关闭gps
@Override
public void onProviderDisabled(String provider) {
System.out.println("onProviderDisabled");
}
} @Override
public void onDestroy() {
super.onDestroy();
lm.removeUpdates(listener);// 当activity销毁时,停止更新位置, 节省电量,否则服务会一直开启。
}
}

android132 360 05 手机定位的更多相关文章

  1. 手机自带的显示基站命令(android手机定位,iphone基站定位)

    手机自带的显示基站命令(安卓手机定位,苹果手机基站定位) 分类: 通信和网络2012-02-07 17:48 1734人阅读 评论(0) 收藏 举报 手机htciphone中兴三星网络 安卓手机自带快 ...

  2. iOS修改手机定位&lpar;非越狱任意位置&rpar;

    利用开发者的一些调试功能,我们可以修改非越狱的苹果手机定位,模拟任意位置. 经测试,此方法仅限开发者调试使用,并不能长时间修改手机定位. 1. 首先需要了解一些坐标系的知识 iOS,原生坐标系为 WG ...

  3. 基于h5&plus;ajax实现的手机定位

    因朋友需要,之前看了下关于h5的手机定位,目前写了个demo在这里贴出来,感兴趣的朋友可以看一下. 目前的版本只是demo,仍有几个问题需要完善一下,问题如下: 1,如何将经纬度等数据发送到被定位人看 ...

  4. Android手机定位技术的发展

    基于以下三种方式的移动位置:1. 网络位置 :2. 基站定位. 3. GPS定位 1 网络位置 前提是连接到网络:Wifi.3G.2G 到达IP址  比如:彩虹版QQ,珊瑚虫版QQ,就有一个功能显示对 ...

  5. &lbrack;android&rsqb; 手机卫士手机定位的原理

    手机定位的三种方式:网络定位,基站定位,GPS定位 网络定位,手机连上wifi 2g 3g的时候,手机会有一个ip,误差很大 基站定位,精确度与基站的多少有关,几十米到几公里的误差 GPS定位,至少需 ...

  6. 改Android手机定位位置

    手机定位方法 1,gps等卫星定位,如美国的gps,欧洲的伽利略,中国的北斗等,通过至少三颗卫星,用三角定位和时间等算法,计算出设备的经纬度,到地图上找到这个经纬度的地名 2,移动运营商基站定位,通过 ...

  7. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

  8. 【Android】第18章 位置服务和手机定位&mdash&semi;本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-04 一.简介 目前,基于位置的服务发展迅速,已涉及到商务.医疗.定位.追踪.敏感区域警告.工作和生活等各个方面.定位服务融合了G ...

  9. 手机定位室内gps没信号

    手机定位一般分3种,gps,手机信号基站,上网地点,其中gps信号一般只有户外有,所以在室外的时候只开启定位和gps就可以定位了,但是在室内没有gps的情况,就需要开网络定位了.

随机推荐

  1. websocket和swoole

    <head></head><body><script type="text/javascript">var sock = null; ...

  2. javascript --- 将共享属性迁移到原型中去

    当我们用一个构造函数创建对象时,其属性就会被添加到this中去.并且被添加到this中的属性实际上不会随着实体发生改变,这时,我们这种做法显得会很没有效率.例如: function her(){ th ...

  3. 参加 TiD 2015 是怎样一番体验?

    人生有很多第一次,(专程打飞的去帝都)参加软件大会,我也是第一次.   TiD   说到软件大会,QCon.PyCon 什么的早已如雷贯耳,没吃过猪肉还没见过猪跑?但对于 TiD,确实还是头一次听说. ...

  4. WCF 已超过传入消息&lpar;65536&rpar;的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性

    我出现这个问题主要是服务器返回数据量过大引起了,需要客户端服务端都要进行配置:我会说其实有神器的么....(工具=>wcf服务配置编辑器),用工具编辑下,就会完全搞定这个问题,再也不用纠结了 服 ...

  5. C&num;使用checked关键字处理&quot&semi;溢出&quot&semi;错误

    代码如下: private void btnCalculate_Click(object sender, EventArgs e) { byte num1, num2;//定义两个byte变量 if( ...

  6. 在Windows环境中使用Nginx&comma; Consul&comma; Consul Template搭建负载均衡和服务发现服务

    搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...

  7. mysql-5&period;7&period;18-winx64 免安装版配置

    如题,最新的都是只有免安装版的,可以官网下载zip的压缩包. 下载后解压,如下 下面就开始配置 1.在path中添加环境变量 ;D:\coding\mysql-5.7.18-winx64\bin; ← ...

  8. Java中文字符所占的字节数

    Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节:采用GB2312或GBK编码方式时,一个中文字符占2 ...

  9. &lbrack;Converge&rsqb; Training Neural Networks

    CS231n Winter 2016: Lecture 5: Neural Networks Part 2 CS231n Winter 2016: Lecture 6: Neural Networks ...

  10. 托布利兹变换 toeplitz 变换

    托布利兹变换 toeplitz 变换 算术平均变换 '''An->C=>(A1+A2+A3+...+An)/n->C,K_ni=1/n=>+[AiK_ni->C (Yn- ...