案例三:根据要求标准查找提供器
由于在大部分情况下,都不太可能去显示地选择要使用的位置提供器。更常见的情况是,通过指定一个提供器所必须满足的条件要求,来让Android去确定要使用最优的技术。
此时可以使用Criteria类说明对提供器的要求,包括精度(高或者低)、能耗(低、中、高)、花费以及返回海拔、速度和方向的能力。如:
Criteria criteria = new Criteria(); //设置精度为低精度 criteria.setAccuracy(Criteria.ACCURACY_COARSE); //不需要海拔 criteria.setAltitudeRequired(false); //不需要方向 criteria.setBearingRequired(false); //允许花费 criteria.setCostAllowed(true); //低能耗 criteria.setPowerRequirement(Criteria.POWER_LOW); |
在定义了上述的要求标准之后,可以通过LocationManager提供的getBestProvider()方法来返回最佳匹配的位置提供器,或者使用getBestProvider()返回的所有可能匹配。如:
LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); String bestProvider = manager.getBestProvider(criteria , true) ; |
其中布尔值为true可以把结果限制在当前已启动的提供器的范围内。
如果有多个位置提供器匹配了你的标准,那它将返回精度最高的一个,如果没有任何一个位置提供器满足要求,那么将会按照(能耗、精度、返回方向、速度和海拔的能力)顺序放宽标准,直到找到一个提供器为止。如果此时仍然没有找到匹配的位置提供器,那么就会返回null。
如果要查看所有符合标准的提供器的名称,可以通过LocationManager提供的getProviders(Criteria criteria , boolean b)方法,此方法可以接收一个criteria,并返回一个经过过虑的字符串列表,并且该表记录了所有符合标准的可用位置提供器。此方法跟getBestProviders()方法相同,如果没有找到匹配的提供器则返回null。
1)在main.xml布局文件中添加一个用来显示当前位置信息的TextView组件,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</LinearLayout>
|
2)在继承了Activity的MainActivity.java中取得相应组件的id、LocationManager服务..,具体实现代码如下:
package zjh.android.lx;
import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView;
public class MainActivity extends Activity { private TextView info = null; private LocationManager manager = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main);
this.info = (TextView)super.findViewById(R.id.info);
manager = (LocationManager)super.getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = manager.getBestProvider(criteria, true); Location location = manager.getLastKnownLocation(provider);
final LocationListener listener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) {} @Override public void onProviderEnabled(String provider) {} @Override public void onProviderDisabled(String provider) {} @Override public void onLocationChanged(Location location) { UpdateWithNewLocation(location); } };
UpdateWithNewLocation(location); manager.requestLocationUpdates(provider, 1000, 0, listener); } private void UpdateWithNewLocation(Location location) { if(location!=null){ double latitude = location.getLatitude(); double longitude = location.getLongitude(); MainActivity.this.info.setText("经度为:"+latitude+"\n"+"纬度为:"+longitude); }else{ MainActivity.this.info.setText("获取位置信息失败"); } }
}
|
3)由于涉及到多个提供器,因此需要在AndroidMainfest.xml文件中添加如下权限:
<!-- GPS provider的权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Network provide的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|