• [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

  • 相关阅读:
    C# 文件流
    SQL语句(十八_补充)——存储过程
    SQL语句(十九)——存储过程(练习)
    SQL语句(十八)—— 存储过程
    软件测试(二)PICT的使用 组合测试方法(两两组合测试,可遍历组合测试)
    Swing布局管理器
    软件测试(一)-黑盒测试 随机测试技巧
    (一)在Lingo中使用集合
    数学建模 TSP(旅行商问题) Lingo求解
    哲学家进餐问题
  • 原文地址:https://www.cnblogs.com/webapplee/p/3771688.html
Copyright © 2020-2023  润新知