.平时获取Location 有GPS 获取,几十米到几公里的误差

手机一定的二种艺术:互连网稳定,基站定位,GPS定位

选用手机获取所在地点的经纬度:

 

Location 在Android 开发中或者时常使用的,比如
通过经纬度获取天气,按照Location 获取所在地区详细Address (比如谷歌(Google)Map 开发).等。而在Android 中经过LocationManager 来获取Location
.平时获取Location 有GPS 获取,WIFI 获取. 如下介绍GPS获取Location:

 

第一步:

互联网稳定,手机连上wifi 2g
3g的时候,手机会有一个ip,误差很大

创设一个Android 工程命名为GPS

基站定位,精确度与基站的多少有关,几十米到几英里的误差

 

GPS定位,至少需求三颗卫星才能稳定,在浩淼的地方标准

第二步:

 

在MainActivity中选择LocationManager获取经纬度:

手机应用A-GPS须要互联网来赞助定位,定位速度快,互连网记录了上次的卫星轨道,

import java.util.List;

 

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

 

public class MainActivity extends Activity {
    private LocationManager manager;
    private SharedPreferences sp;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        manager = (LocationManager)
getSystemService(LOCATION_SERVICE);//获取手机地方新闻
        
        List<String> providers = manager.getAllProviders();
        
//        for (String provider : providers) {
//            System.out.println(provider);
//        }
       

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

       //获取的尺度
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);//获取精准地方
        criteria.setCostAllowed(true);//允许爆发费用
       
criteria.setPowerRequirement(Criteria.POWER_HIGH);//消耗大的话,获取的效能高
        criteria.setSpeedRequired(true);//手机地方移动
        criteria.setAltitudeRequired(true);//海拔
        
        //获取最佳provider: 手机或者模拟器上均为gps
        String bestProvider = manager.getBestProvider(criteria,
true);//使用GPS卫星
        
        System.out.println(“最好的岗位提供者是”+bestProvider);
        sp = getSharedPreferences(“config”,MODE_PRIVATE);
        
        //parameter: 1. provider 2. 每隔多少日子获得四遍  3.每隔多少米 
4.监听器触发回调函数
        manager.requestLocationUpdates(bestProvider,60000,100, new
MyLocationListener());
    }
    
    private class MyLocationListener implements LocationListener{
        /**
         * 手机地方暴发转移
         */
        public void onLocationChanged(Location location) {
            location.getAccuracy();//精确度
            String  latitude = location.getLatitude()+””;//经度
            String longitude = location.getLongitude()+””;//纬度
           

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

            //将获取到的中纬度音讯存入SharedPreferences
            Editor editor = sp.edit();
            editor.putString(“lastloaction”, latitude + “-” +
longitude);
            editor.commit();
            
        }
        
        /**
         * 当某个地方提供者的情况爆发转移时
         */
        public void onStatusChanged(String provider, int status, Bundle
extras) {
            
        }
        
        
        /**
         * 某个设备打开时
         */
        public void onProviderEnabled(String provider) {
            
        }

稳定格局(“gps”),更新时间(60000),更新距离(50),LocationListener对象

        
        /**
         * 某个设备关闭时
         */
        public void onProviderDisabled(String provider) {
            
        }
        
    }
}

 

第三步:

LocationListener是一个接口,要求做它的贯彻类

在AndroidManifest.xml中开展如下配置(参预Location相关权限):

定义MyLocationListener完结LocationListener,完毕它上面的法门

 

onLocationChanged(),当地点变动的时候回调,传递进入一个Location对象

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest
xmlns:android=”http://schemas.android.com/apk/res/android
    package=”cn.itcast.gps”
    android:versionCode=”1″
    android:versionName=”1.0″ >

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

    <uses-sdk android:minSdkVersion=”8″ />
    <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”/>

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

    <application
        android:icon=”@drawable/ic_launcher”
        android:label=”@string/app_name” >
        <activity
            android:name=”.DemoActivity”
            android:label=”@string/app_name” >
            <intent-filter>
                <action android:name=”android.intent.action.MAIN”
/>

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

                <category
android:name=”android.intent.category.LAUNCHER” />
            </intent-filter>
        </activity>
    </application>

 

第四步:

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

计划应用程序,可在代码中参与Log.i() ,在LogCat中观测打印新闻

onProviderEnabled(),当某一个岗位提供者可用了

抑或直接导出 data/data/<packagename>/share_pre/config.xml
文件直接观测

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

 

 

可以将经纬度自行在网站上开展查询

当activity销毁的时候,打消监听地方

 

重写activity的onDestroy()方法

注意:

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

android2.3 有bug,定位后并未提醒

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

2.3模拟器不援助手动发送模拟的中纬度

 

可选用2.2的模拟器

急需的权力

android.permission.ACCESS_FINE_LOCATION 获取精准地点

android.permission.ACCESS_COARSE_LOCATION 获取粗略的职位

android.permission.ACCESS_MOCK_LOCATION 获取模拟的职位(模拟器开发的时候)

 

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

 

江山对坐标进行了加偏处理,变成木星坐标,要求国家测绘局的插件,网上有罗睺坐标转换代码

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) {

        }

    }
}

 

相关文章