当前位置:首页 > Android > 正文内容

Android Location在GPS中的应用(一)

jsc11年前 (2014-08-27)Android4238

新建AndroidProject,注意选择Google APIs:
 

打开AndroidManifest.xml,在其中加入GPS使用权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
 
main.java的代码如下:

public class main extends Activity { 
    /** Called when the activity is first created. */ 
private LocationManager locationManager; 
private String provider; 
private Location location; 
private Address address; 
    @Override 
    public void onCreate(BundlesavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        // 获取LocationManager服务 
        locationManager =(LocationManager) this 
               .getSystemService(Context.LOCATION_SERVICE); 
        // 获取Location Provider 
        getProvider(); 
        // 如果未设置位置源,打开GPS设置界面 
        openGPS(); 
        // 获取位置 
        location = locationManager.getLastKnownLocation(provider); 
        // 显示位置信息到文字标签 
        updateWithNewLocation(location); 
        // 注册监听器locationListener,第2、3个参数可以控制接收gps消息的频度以节省电力。第2个参数为毫秒, 
        // 表示调用listener的周期,第3个参数为米,表示位置移动指定距离后就调用listener 
        locationManager.requestLocationUpdates(provider, 2000, 10, 
                       locationListener); 
    } 
    // 判断是否开启GPS,若未开启,打开GPS设置界面 
    private void openGPS() {        
        if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER) 
        ||locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER) 
        ) { 
           Toast.makeText(this, "位置源已设置!", Toast.LENGTH_SHORT).show(); 
            return; 
        } 
        Toast.makeText(this, "位置源未设置!", Toast.LENGTH_SHORT).show(); 
        // 转至GPS设置界面 
        Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); 
       startActivityForResult(intent,0); 
    } 
    // 获取Location Provider 
    private void getProvider(){ 
    // 构建位置查询条件 
        Criteria criteria = new Criteria(); 
        // 查询精度:高 
       criteria.setAccuracy(Criteria.ACCURACY_FINE); 
        // 是否查询海拨:否 
       criteria.setAltitudeRequired(false); 
        // 是否查询方位角:否 
       criteria.setBearingRequired(false); 
        // 是否允许付费:是 
        criteria.setCostAllowed(true); 
        // 电量要求:低 
       criteria.setPowerRequirement(Criteria.POWER_LOW); 
        // 返回最合适的符合条件的provider,第2个参数为true说明,如果只有一个provider是有效的,则返回当前provider 
        provider = locationManager.getBestProvider(criteria,true);   
    } 
 // Gps消息监听器 
    private final LocationListener locationListener = new LocationListener(){ 
    // 位置发生改变后调用 
        public voidonLocationChanged(Location location) { 
       updateWithNewLocation(location); 
        } 
        // provider被用户关闭后调用 
        public voidonProviderDisabled(String provider){ 
        updateWithNewLocation(null); 
        } 
        // provider被用户开启后调用 
        public voidonProviderEnabled(String provider){ } 
        // provider状态变化时调用 
        public voidonStatusChanged(String provider, int status, 
        Bundle extras){ } 
    }; 
    // Gps监听器调用,处理位置信息 
    private void updateWithNewLocation(Locationlocation) { 
        String latLongString; 
        TextView myLocationText= (TextView)findViewById(R.id.text); 
        if (location != null) { 
        double lat =location.getLatitude(); 
        double lng =location.getLongitude(); 
        latLongString = "纬度:" + lat + "/n经度:" + lng; 
        } else { 
        latLongString = "无法获取地理信息"; 
        } 
        myLocationText.setText("您当前的位置是:/n" + 
        latLongString+"/n"+getAddressbyGeoPoint(location)); 
    } 
// 获取地址信息 
privateList<Address> getAddressbyGeoPoint(Location location) { 
List<Address> result = null; 
// 先将Location转换为GeoPoint 
// GeoPoint gp=getGeoByLocation(location); 
try { 
if (location != null) { 
// 获取Geocoder,通过Geocoder就可以拿到地址信息 
Geocoder gc = new Geocoder(this, Locale.getDefault()); 
result= gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
return result; 
} 
}

如果,要想在模拟器中看到效果,还需要在DDMS的EmulatorControl面板中进行一些设置。如果你看不到Emulator Control面板,可以从window->Show view->Other…中打开它:
 

在Emulator Control面板中,你可以找到一个LocationControls的地方:
 
201408271409116465571921.png
你可以在Longitude和Latitude中输入一个虚拟的经纬度,然后点击Send,可以把模拟器的位置修改为指定位置。此时运行程序,即可看到如图所示的信息:
 201408271409116493852808.jpg

        有时候,你可能出现“无法获取地理信息”的错误。这可能是没有开启“启用GPS卫星”选项。不要奇怪,在模拟器中,“使用无线网络”是无效的,使用该选项无法获取地理信息,因为模拟器中根本没有sim卡,也就无法通过基站来定位了。
如果在真机上就不同了。如果机器没有内置GPS模块,那么启用GPS卫星选项反而无法进行定位,具体情况只有多试几次才能明白。
@font-face { font-family: "宋体";}@font-face { font-family: "Cambria";}p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 10pt; font-size: 12pt; font-family: "Times New Roman"; }div.Section1 { page: Section1; }
Geocoder需要访问internet,在真机上调试请打开wifi或者3G网络。

扫描二维码推送至手机访问。

版权声明:本文由微小站发布,如需转载请注明出处。

本文链接:https://jsc0.com/post/16.html

标签: GPS
分享给朋友:

“Android Location在GPS中的应用(一)” 的相关文章

Android中AsyncTask的简单用法

Android中AsyncTask的简单用法

        在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好 的用户体验。但是在子线程中无法去操作主线程(UI 线...

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google...

android上传图片至服务器

本实例实现了android上传手机图片至服务器,服务器进行保存服务器servlet代码publicvoid doPost(HttpServletRequest request, HttpServletResponse response)  ...

Android应用加入微信分享

Android应用加入微信分享

一、申请你的AppIDhttp://open.weixin.qq.com/  友情提示:推荐使用eclipse打包软件最后一步的MD5值去申请AppID二、官网下载libammsdk.jar包http://open.weixin.qq.com/download/?lang=zh_...

Fragment保持状态切换

Fragment保持状态切换

在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常挂掉网上说使用replace切换会使被切换的Fragment给替换掉,从而被被切换的Fra...

onTextChanged参数解释及实现EditText字数监听

由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher。它有三个成员方法,第一个after很简单,这个方法就是在EditText内容已经改变之后调用,重点看下面两个方法:beforeTextChanged(CharSequ...