现在的位置: 首页 > 综合 > 正文

Android之位置服务三

2018年06月09日 ⁄ 综合 ⁄ 共 3703字 ⁄ 字号 评论关闭

案例三:根据要求标准查找提供器

由于在大部分情况下,都不太可能去显示地选择要使用的位置提供器。更常见的情况是,通过指定一个提供器所必须满足的条件要求,来让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 = LocationManagergetSystemService(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)在继承了ActivityMainActivity.java中取得相应组件的idLocationManager服务..,具体实现代码如下:

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"/>

 

 

抱歉!评论已关闭.