[MiniPro]Android GPS-从上到下整个框架剖析与案例解说

1. 代码

MainActivity.java

 package home.lee.gps; import java.util.Iterator; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.text.method.ScrollingMovementMethod; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.widget.Button; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener, OnCheckedChangeListener, OnLongClickListener{ private static final int ITEM_GPS = 1; private static final int ITEM_NETWORK = 2; private static final int ITEM_PASSIVE = 3; private static final String GPS_PROVIDER = android.location.LocationManager.GPS_PROVIDER; private static final String NETWORK_PROVIDER = android.location.LocationManager.NETWORK_PROVIDER; private static final String PASSIVE_PROVIDER = android.location.LocationManager.PASSIVE_PROVIDER; private boolean OPEN_SERVICE = false; private String serviceName; private LocationManager locationManager; private String defaultGPSProvider; private Button getGPSBtn; private Button startGPSBtn; private TextView resultText; private boolean serviceFlag = false; private Criteria criteria; private String bestProvider; private TextView locatioinMsg; private boolean gpsFlag = false; private String provider; private boolean networkFlag = false; private boolean passiveFlag = false; private Button locationBtn; private View providerBtn; private RadioButton gpsRadioBtn; private RadioButton networkRadioBtn; private RadioButton passiveRadioBtn; private RadioGroup radioGroup; private boolean GPS_CHECKED = false; private boolean NETWORK_CHECKED = false; private boolean PASSIVE_CHECKED = false; private boolean BEST_CHECKED = false; private String checkedProvider = null; private Button switchGPSserviceBtn; private Button getLocationBtn; private static boolean openServiceFlag = false; private Location location; private RadioButton bestProRadioBtn; private double longitude; private double latitude; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_layout); System.out.println("openServiceFlag is " + openServiceFlag); serviceName = Context.LOCATION_SERVICE; locationManager = (LocationManager)this.getSystemService(serviceName); List providers = locationManager.getAllProviders(); locatioinMsg = (TextView)findViewById(R.id.locationMsg); locatioinMsg.setMovementMethod(ScrollingMovementMethod.getInstance()); locatioinMsg.setOnLongClickListener(this); locationBtn = (Button)findViewById(R.id.locationStatus); locationBtn.setOnClickListener(this); providerBtn = (Button)findViewById(R.id.providerStatus); providerBtn.setOnClickListener(this); switchGPSserviceBtn = (Button)findViewById(R.id.switchGPSservice); switchGPSserviceBtn.setOnClickListener(this); getLocationBtn = (Button)findViewById(R.id.getLoc); getLocationBtn.setOnClickListener(this); radioGroup = (RadioGroup)findViewById(R.id.radioGroup); gpsRadioBtn = (RadioButton)findViewById(R.id.gps); networkRadioBtn = (RadioButton)findViewById(R.id.network); passiveRadioBtn = (RadioButton)findViewById(R.id.passive); bestProRadioBtn = (RadioButton)findViewById(R.id.best); radioGroup.setOnCheckedChangeListener(this); locatioinMsg.setText("Supported providers:
"); for (Iterator iterator = providers.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); if(string.trim().equals("gps")) { gpsFlag = true; gpsRadioBtn.setEnabled(true); System.out.println("gpsFlag " + gpsFlag); System.out.println("gpsLoStatus " + locationStatus(GPS_PROVIDER)); }else if(string.trim().equals("network")){ networkFlag = true; networkRadioBtn.setEnabled(true); System.out.println("networkFlag " + networkFlag); System.out.println("networkLoStatus " + locationStatus(NETWORK_PROVIDER)); }else if(string.trim().equals("passive")){ passiveFlag = true; passiveRadioBtn.setEnabled(true); System.out.println("passiveFlag " + passiveFlag); System.out.println("passiveLoStatus " + locationStatus(PASSIVE_PROVIDER)); } locatioinMsg.append(" " + string + "
"); } if(!gpsFlag){ switchGPSserviceBtn.setEnabled(false); } } private boolean locationStatus(String provider) { boolean status = Settings.Secure.isLocationProviderEnabled(getContentResolver(), provider); return status; } private boolean providerStatus(String provider) { boolean status = Settings.Secure.isLocationProviderEnabled(getContentResolver(), provider); return status; } @Override protected void onStart() { super.onStart(); // 注册自定义动态广播消息 IntentFilter filter = new IntentFilter(); filter.addAction("android.location.GPS_ENABLED_CHANGE"); registerReceiver(gpsReceiver, filter); System.out.println("自定义动态注册"); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(gpsReceiver); System.out.println("注销广播接收器"); } public BroadcastReceiver gpsReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { openServiceFlag = intent.getBooleanExtra("enabled", false); System.out.println("receiver " + openServiceFlag); } }; @Override public void onClick(View v) { if(checkedProvider == null){ if(BEST_CHECKED == true){ locatioinMsg.append("
without best provider, the provider is " + checkedProvider); }else{ Toast.makeText(getApplicationContext(), "请选择Provider,再确认", Toast.LENGTH_SHORT).show(); } return; } switch(v.getId()){ case R.id.locationStatus: System.out.println(checkedProvider + " locationStatus is " + locationStatus(checkedProvider)); locatioinMsg.append(checkedProvider + " locationStatus is " + locationStatus(checkedProvider) + "
"); break; case R.id.providerStatus: System.out.println(checkedProvider + " providerStatus is " + providerStatus(checkedProvider)); locatioinMsg.append(checkedProvider + " providerStatus is " + providerStatus(checkedProvider) + "
"); break; case R.id.switchGPSservice: Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE"); System.out.println("button switch is " + openServiceFlag); locatioinMsg.append("button switch is " + openServiceFlag + "
"); //发送广播 if(openServiceFlag){ intent.putExtra("enabled", false); System.out.println("关闭GPS服务"); locatioinMsg.append("关闭GPS服务
"); openServiceFlag = false; }else { intent.putExtra("enabled", true); System.out.println("开启GPS服务"); locatioinMsg.append("开启GPS服务
"); openServiceFlag = true; } sendBroadcast(intent); break; case R.id.getLoc: location = locationManager.getLastKnownLocation(checkedProvider); if(BEST_CHECKED == true){ System.out.println("The best " + checkedProvider + " provider location is " + location); locatioinMsg.append("
 " + "The best " + checkedProvider + " provider location is " + location + "
"); }else { System.out.println(checkedProvider + " location is " + location); locatioinMsg.append("
 " + checkedProvider + " location is " + location + "
"); } if((providerStatus(checkedProvider) == false && GPS_CHECKED == true) || (providerStatus(checkedProvider) == false && NETWORK_CHECKED == true)){ Intent gpsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(gpsIntent); break; } else if(providerStatus(checkedProvider) == true && GPS_CHECKED == true && openServiceFlag == false){ Toast.makeText(getApplicationContext(), "请开启GPS服务-switch", Toast.LENGTH_SHORT).show(); break; } else if((providerStatus(checkedProvider) == true && GPS_CHECKED == true && location == null) || (providerStatus(checkedProvider) == false && PASSIVE_CHECKED == true && location == null)){ Toast.makeText(getApplicationContext(), "请确保已有定位信息", Toast.LENGTH_SHORT).show(); break; } else if(providerStatus(checkedProvider) == true && NETWORK_CHECKED == true && location == null){ Toast.makeText(getApplicationContext(), "请开启数据业务或WIFI网络,保证能够正常上网,再定位", Toast.LENGTH_SHORT).show(); break; } longitude = location.getLongitude(); latitude = location.getLatitude(); locatioinMsg.append("
" + checkedProvider + ":
" + " longitude: " + longitude + "
" + " latitude: " + latitude + "
"); break; } } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if(checkedId == gpsRadioBtn.getId()){ GPS_CHECKED = true; NETWORK_CHECKED = false; PASSIVE_CHECKED = false; BEST_CHECKED = false; checkedProvider = GPS_PROVIDER; switchGPSserviceBtn.setEnabled(true); System.out.println("GPS_PROVIDER"); }else if(checkedId == networkRadioBtn.getId()){ GPS_CHECKED = false; NETWORK_CHECKED = true; PASSIVE_CHECKED = false; BEST_CHECKED = false; checkedProvider = NETWORK_PROVIDER; switchGPSserviceBtn.setEnabled(false); System.out.println("NETWORK_PROVIDER"); }else if(checkedId == passiveRadioBtn.getId()){ GPS_CHECKED = false; NETWORK_CHECKED = false; PASSIVE_CHECKED = true; BEST_CHECKED = false; checkedProvider = PASSIVE_PROVIDER; switchGPSserviceBtn.setEnabled(false); System.out.println("PASSIVE_PROVIDER"); }else if(checkedId == bestProRadioBtn.getId()){ GPS_CHECKED = false; NETWORK_CHECKED = false; PASSIVE_CHECKED = false; BEST_CHECKED = true; checkedProvider = getBestLocationProvider(); System.out.println("Best provider is " + checkedProvider); if(checkedProvider == GPS_PROVIDER){ switchGPSserviceBtn.setEnabled(true); }else if(checkedProvider == NETWORK_PROVIDER || checkedProvider == PASSIVE_PROVIDER){ switchGPSserviceBtn.setEnabled(false); } System.out.println("BEST_PROVIDER"); } } private String getBestLocationProvider() { criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); return locationManager.getBestProvider(criteria, true); } @Override public boolean onLongClick(View v) { if(!locatioinMsg.getText().toString().trim().equals("")){ new AlertDialog.Builder(MainActivity.this) .setTitle("编辑").setIcon(R.drawable.confirm) .setMessage("是否清空文本框中的内容?") .setCancelable(false) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { locatioinMsg.setText(""); System.out.println("string not none, so clear it."); } }) .setNegativeButton("取消", null) .show(); } return true; } } 

2. 效果

代码下载
Android_GPS整体框架剖析.pdf

原文地址:https://www.cnblogs.com/webapplee/p/3771688.html