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

Android Location在GPS中的应用(一)

jsc11年前 (2014-08-27)Android3713

新建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中的JSON详细总结

1、JSON(JavaScript Object Notation) 定义:   一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高...

Fragment保持状态切换

Fragment保持状态切换

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

Android SharedPreferences PreperenceScreen 偏好数据存取

SharedPreferences是一个接口,程序是无法创建SharedPreferences实例的,1、Context.getSharedPreferences(String name,int mode)来得到一个指定name的SharedPreferences实例2、PreferenceMana...

制作一款Android APK管理器主要代码

Android APK管理器代码,主要就是两个列表,一个显示SD卡上面的APK文件的list,一个显示已经安装的app的list。1:获取SD卡上的APK安装文件后,要用代码读出APK里面的信息,如icon等,的主要代码如下:private void getUninatllApk...

获取Android手机中SD卡存储信息

SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件。因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作的一件事,那么在Android开发中,我们如何能获取SD卡的内存容量呢?首先,要获取SD卡上面的信息,必须先对SD卡有访问的权限,...

Android学习笔记--用户定位User Location

Android学习笔记--用户定位User Location

用户定位 User Location的作用: 1.获取用户的位置 2.追踪用户的移动 User Location的关键API 1.Loca...