开发APP的那些组件---->>>>------位置信息

                                     Android如何中得到当前位置信息

 

在Android中得到当前位置的步骤:

1.在AndroidManifest.xml中声明权限:

      android.permission.ACCESS_FINE_LOCATION(或者android.permission.ACCESS_COARSE_LOCATION)


2.声明并实例化一个LocationManager对象,这个类提供了关于获取位置信息的服务,用于管理Android的定位服务。这个类允许应用定期的更新地理位置信息,同时允许当到达指定地点时候激活相关的Intent。

LocationManager locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


3.声明并设置Criteria对象。这个类是用来选择合适的provider的,他设置了一些条件,通过对这些条件进行筛选,系统得到最优的provider对象。条件有:精度,耗电量,海拔,方位,速度以及付费情况等。

        Criteria criteria=new Criteria(); 
        criteria.setAccuracy(Criteria.ACCURACY_FINE); //精度要求:ACCURACY_FINE(高)ACCURACY_COARSE(低)

        criteria.setAltitudeRequired(false);              // 不要求海拔信息

        criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH); //方位信息的精度要求:ACCURACY_HIGH(高)ACCURACY_LOW(低)
        criteria.setBearingRequired(false);             // 不要求方位信息
        criteria.setCostAllowed(true);                     // 是否允许付费
        criteria.setPowerRequirement(Criteria.POWER_LOW); // 对电量的要求  (HIGH、MEDIUM)


4.根据criteria的条件获取最合适的provider。第二个参数是指是否只返回当前处于激活状态的provider。

        String provider=locMan.getBestProvider(criteria,true);

       在这里简介一下provider。provider是LocationManager获取位置信息的途径,常用的有两种:GPS和NETWORK。

      GPS定位:更精确,缺点是只能在户外使用,耗电严重,并且返回用户位置信息的速度远不能满足用户需求。需要在AndroidManifest.xml中声明权限:

      android.permission.ACCESS_FINE_LOCATION

      NETWORK定位:通过基站和Wi- Fi信号来获取位置信息,室内室外均可用,速度更快,耗电更少。需要在AndroidManifest.xml中声明权限:

      android.permission.ACCESS_FINE_LOCATION或者:android.permission.ACCESS_COARSE_LOCATION

      使用locMan.getAllProviders();可以获得所有已知provider的list。为了获取用户位置信息,我们可以使用多种定位方式的其中一个,也可以同时使用多个。


5.设置监听器,并设置有关更新操作的一些条件(时间间隔,距离间隔),监听器会定期的更新位置信息。这里设置了使用之前得到的最优provider,更新位置操作的时间间隔为1000毫秒,距离间隔为5米,绑定LListener监听器。

 locMan.requestLocationUpdates(provider, 1000, 5, new LListener());


6.获取地理位置信息。返回provider最近获得的位置信息。

 Location loc = locMan.getLastKnownLocation(provider);


7.补充。如有需要,我们可以将Location信息转化为GeoPoint。函数如下

  private GeoPoint getGeoByLocation(Location loc){
     GeoPoint gp = null;
     if(loc != null){
      double latitude = loc.getLatitude() * 1E6;
      double longitude = loc.getLongitude() * 1E6;
      gp = new GeoPoint((int)latitude, (int)longitude);
     }
  return gp;
    }



代码案例:

package com.example.locationtest;

import java.util.List;
import java.util.Locale;

import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.text.format.Time;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity 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(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取LocationManager服务
        locationManager =(LocationManager) this
               .getSystemService(Context.LOCATION_SERVICE);
        // 获取Location Provider
        getProvider();
        // 如果未设置位置源,打开GPS设置界面
        openGPS();
        // 获取位置
        location = locationManager.getLastKnownLocation(provider);
        // 显示位置信息到文字标签
        updateWithNewLocation(location);
        MyLocationListener locationListener=new MyLocationListener();
        // 注册监听器locationListener,第2、3个参数可以控制接收gps消息的频度以节省电力。第2个参数为毫秒,
        // 表示调用listener的周期,第3个参数为米,表示位置移动指定距离后就调用listener
        locationManager.requestLocationUpdates(provider, 1000, (float)0.001,
                       locationListener);
        int i=0;
        location = locationManager.getLastKnownLocation(provider);
       while(location==null){
       	 
        	Log.e("log",String.valueOf(i)+ location+"");
       	 try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
       	location =locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        	 if(i++>100)break;
        	};

}

    // 判断是否开启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);  
        Log.e("log", provider);
    }
 // Gps消息监听器
    private final class MyLocationListener  implements LocationListener{
    // 位置发生改变后调用
        public void onLocationChanged(Location location) {
        	Log.e("log", "location 变了");
       updateWithNewLocation(location);
        }
        // provider被用户关闭后调用
        public void onProviderDisabled(String provider){
        	Log.e("log", "provider 被用户关闭了");
        updateWithNewLocation(null);
        }
        // provider被用户开启后调用
        public void onProviderEnabled(String provider){ 
        	Log.e("log", "provider 被用户开启了");
        }
        // provider状态变化时调用
        public void onStatusChanged(String provider, int status,
        Bundle extras){ }
    };
    // Gps监听器调用,处理位置信息
    private void updateWithNewLocation(Location location) {
        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));
    }
// 获取地址信息
private List<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;
}

}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.locationtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="7" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.locationtest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
</manifest>
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值