Android虚拟定位是一种技术,它使用一组精确的传感器,比如GPS、WiFi、蓝牙、视觉等,来替代硬件GPS定位,从而获得准确的定位信息。Android虚拟定位的原理是,通过传感器获取用户手机的定位信息,然后将这些信息发送到服务器上,服务器将这些定位信息与地图、POI(兴趣点)和其他信息进行比较,并将最终的定位结果返回给用户。
Android虚拟定位的优势在于,它可以取代硬件GPS定位,更加准确、可靠,而且能够支持更多的室内定位,这对于室内定位十分有用。另外,Android虚拟定位也可以提供更多的定位服务,比如,实时路况信息等,可以更好地满足用户的定位需求。
有相应的编程接口。了解一下基本的安卓编程就知道了。
各种游戏 APP能使用重力数据 就是调取了相应的数据。
参考:
import javautilList;
import androidappActivity;
import androidhardwareSensor;
import androidhardwareSensorEvent;
import androidhardwareSensorEventListener;
import androidhardwareSensorManager;
import androidosBundle;
import androidviewView;
import androidwidgetButton;
import androidwidgetTextView;
public class SensorGetValueActivity extends Activity implements SensorEventListener{
private SensorManager sensorManager;
/ Called when the activity is first created /
@Override
public void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
sensorManager=(SensorManager)thisgetSystemService(SENSOR_SERVICE);
setContentView(Rlayoutmain);
Button close=(Button)findViewById(Ridbtn_close);
closesetOnClickListener(new ButtonOnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}
protected void onResume(){
superonResume();
List<Sensor> sensors=sensorManagergetSensorList(SensorTYPE_ALL);
for(Sensor s:sensors){
sensorManagerregisterListener(this, s,SensorManagerSENSOR_DELAY_NORMAL);
}
// sensorManagerregisterListener(this, sensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER),
// SensorManagerSENSOR_DELAY_NORMAL);
}
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
switch(eventsensorgetType()){
//加速度
case SensorTYPE_ACCELEROMETER:
TextView tv1=(TextView)findViewById(Ridtv1);
String x1=StringvalueOf(eventvalues[SensorManagerDATA_X]);
String y1=StringvalueOf(eventvalues[SensorManagerDATA_Y]);
String z1=StringvalueOf(eventvalues[SensorManagerDATA_Z]);
tv1setText("加速度x:"+x1+"\n"+"加速度y:"+y1+"\n"+"加速度z:"+z1);
break;
//倾斜度
case SensorTYPE_ORIENTATION:
TextView tv2=(TextView)findViewById(Ridtv2);
String x2=StringvalueOf(eventvalues[SensorManagerDATA_X]);
String y2=StringvalueOf(eventvalues[SensorManagerDATA_Y]);
String z2=StringvalueOf(eventvalues[SensorManagerDATA_Z]);
tv2setText("倾斜度x:"+x2+"\n"+"倾斜度y:"+y2+"\n"+"倾斜度z:"+z2);
break;
//磁力计
case SensorTYPE_MAGNETIC_FIELD:
TextView tv3=(TextView)findViewById(Ridtv3);
String x3=StringvalueOf(eventvalues[SensorManagerDATA_X]);
String y3=StringvalueOf(eventvalues[SensorManagerDATA_Y]);
String z3=StringvalueOf(eventvalues[SensorManagerDATA_Z]);
tv3setText("磁力计x:"+x3+"\n"+"磁力计y:"+y3+"\n"+"磁力计z:"+z3);
break;
//温度
case SensorTYPE_TEMPERATURE:
TextView tv4=(TextView)findViewById(Ridtv4);
String c=StringvalueOf(eventvalues[SensorManagerDATA_X]);
tv4setText("Degree:"+c);
break;
}
}
protected void onStop(){
superonStop();
sensorManagerunregisterListener(this);
}
}
public class MainActivity extends Activity implements SensorEventListener {
private static final String TAG = MainActivityclassgetSimpleName();
private SensorManager mSensorManager;
private Sensor mSensor;
private TextView textviewX;
private TextView textviewY;
private TextView textviewZ;
private TextView textviewF;
private int mX, mY, mZ;
private long lasttimestamp = 0;
Calendar mCalendar;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
textviewX = (TextView) findViewById(RidtextView1);
textviewY = (TextView) findViewById(RidtextView3);
textviewZ = (TextView) findViewById(RidtextView4);
textviewF = (TextView) findViewById(RidtextView2);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensor = mSensorManagergetDefaultSensor(SensorTYPE_ACCELEROMETER);// TYPE_GRAVITY
if (null == mSensorManager) {
Logd(TAG, "deveice not support SensorManager");
}
// 参数三,检测的精准度
mSensorManagerregisterListener(this, mSensor,
SensorManagerSENSOR_DELAY_NORMAL);// SENSOR_DELAY_GAME
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
if (eventsensor == null) {
return;
}
if (eventsensorgetType() == SensorTYPE_ACCELEROMETER) {
int x = (int) eventvalues[0];
int y = (int) eventvalues[1];
int z = (int) eventvalues[2];
mCalendar = CalendargetInstance();
long stamp = mCalendargetTimeInMillis() / 1000l;// 1393844912
textviewXsetText(StringvalueOf(x));
textviewYsetText(StringvalueOf(y));
textviewZsetText(StringvalueOf(z));
int second = mCalendarget(CalendarSECOND);// 53
int px = Mathabs(mX - x);
int py = Mathabs(mY - y);
int pz = Mathabs(mZ - z);
Logd(TAG, "pX:" + px + " pY:" + py + " pZ:" + pz + " stamp:"
+ stamp + " second:" + second);
int maxvalue = getMaxValue(px, py, pz);
if (maxvalue > 2 && (stamp - lasttimestamp) > 30) {
lasttimestamp = stamp;
Logd(TAG, " sensor isMoveorchanged");
textviewFsetText("检测手机在移动");
}
mX = x;
mY = y;
mZ = z;
}
}
/
获取一个最大值
@param px
@param py
@param pz
@return
/
public int getMaxValue(int px, int py, int pz) {
int max = 0;
if (px > py && px > pz) {
max = px;
} else if (py > px && py > pz) {
max = py;
} else if (pz > px && pz > py) {
max = pz;
}
return max;
}
}
方向传感器和加速度传感器主要用于游戏,电磁场传感器这个很少见啊,因该是用来确定方位信息的,比如GPS,至于温度传感器是用于监测电池和CPU温度的软件你到豆荚或91熊猫去下找系统软件。
以上就是关于android虚拟定位原理全部的内容,包括:android虚拟定位原理、怎么把安卓系统中的重力传感器的数据读出来、如何在android studio 上用加速度传感器来得到x y z轴上的坐标等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)