美国从上个世纪70年代开始投资这个项目,耗资120亿美元造就了全球定位系统(GPS)。这个系统的核心就是24颗卫星,这些卫星离地2万公里,以12小时为周期绕着地球旋转。刚开始这个项目主要是为军方提供精确定位服务,但现在这个系统已经获得广泛的应用。我们的安卓SDK也提供了丰富的API (Application Programming Interface)来操作GPS,开发人员就可以通过GPS API和安卓设备自带的GPS模块来定位全球的任何位置,而且还包括跟踪手机的位置。
安卓SDK为GPS提供了很多API,但最核心的是LocationManager,这是一个系统服务类,跟我们以前学过的WindowManager、AudioManager、NotificationManager等服务类创建服务对象的方法是类似的。所有跟GPS相关的操作都是由LocationManager对象及其派生出来的对象来完成。
利用窗口(Activity)提供的getSystemService方法来创建位置管理器对象。
LocationManger manager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
一旦获得了LocationManager对象,我们就可以调用它的方法来获取跟GPS相关的服务和对象。
获得位置的方向
……
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:orientation="vertical"
android:padding="20dp" >
<ListView
android:id="@+id/lvLocationProvider"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
LinearLayout>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_poem_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="center_vertical"
android:minHeight="50dp"
android:textSize="30sp"
android:textColor="#0000ff"/>
package net.hw.display_all_location_providers;
import android.content.Context;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
/**
* 功能:列表显示全部位置提供者
* 作者:华卫
* 日期:2021年01月02日
*/
public class MainActivity extends AppCompatActivity {
private ListView lvLoationProvider; // 位置提供者列表
private LocationManager mLocationManager; // 位置管理器对象
private List<String> providers; // 位置提供者名称列表
private ArrayAdapter<String> adapter; // 数组适配器
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局文件设置用户界面
setContentView(R.layout.activity_main);
// 通过资源标识符获取控件实例
lvLoationProvider = findViewById(R.id.lvLocationProvider);
// 第一步、获得位置管理器对象
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// 第二步、获得全部位置提供者名称
providers = mLocationManager.getAllProviders();
// 第三步、创建数组适配器,将数据源与列表控件绑定
adapter = new ArrayAdapter<String>(this, // 上下文环境
R.layout.provider_list_item, // 列表项模板
providers // 数组列表作为数据源
);
// 第四步、列表控件设置适配器,让适配器起作用
lvLoationProvider.setAdapter(adapter);
// 第五步、列表项单击事件处理
lvLoationProvider.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
String strProviderName = providers.get(position);
if (strProviderName.equals("network")) {
Toast.makeText(MainActivity.this, "通过网络获取位置信息。", Toast.LENGTH_SHORT).show();
} else if (strProviderName.equals("passive")) {
Toast.makeText(MainActivity.this, "被动获取位置信息。", Toast.LENGTH_SHORT).show();
} else if (strProviderName.equals("gps")) {
Toast.makeText(MainActivity.this, "通过GPS获取位置信息。", Toast.LENGTH_SHORT).show();
}
}
});
}
}