package cn.netkiller.location;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_PERMISSION_CODE = 12;
private TextView textViewLatitude;
private TextView textViewLongitude;
private TextView textViewAltitude;
private TextView textViewSpeed;
private TextView textViewTime;
private TextView status;
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private ListView listViewAddress;
private ArrayAdapter<String> adapter;
private ArrayList<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewLatitude = (TextView) findViewById(R.id.textViewLatitude);
textViewLongitude = (TextView) findViewById(R.id.textViewLongitude);
textViewAltitude = (TextView) findViewById(R.id.textViewAltitude);
textViewSpeed = (TextView) findViewById(R.id.textViewSpeed);
textViewTime = (TextView) findViewById(R.id.textViewTime);
status = (TextView) findViewById(R.id.status);
list = new ArrayList<String>();
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);
listViewAddress = (ListView) findViewById(R.id.listViewAddress);
listViewAddress.setAdapter(adapter);
this.location();
}
private void loop() {
}
public void location() {
//獲取LocationManager對象
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gpsStatus = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
Log.d("Location", "GPS Status: " + gpsStatus);
boolean networkStatus = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Log.d("Location", "Network Status: " + networkStatus);
//創建一個Criteria對象
Criteria criteria = new Criteria();
//設置粗略精確度
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
//設置是否需要返回海拔信息
criteria.setAltitudeRequired(true);
//設置是否需要返回方位信息
criteria.setBearingRequired(true);
//設置是否允許付費服務
criteria.setCostAllowed(false);
//設置電量消耗等級
criteria.setPowerRequirement(Criteria.POWER_HIGH);
//設置是否需要返回速度信息
criteria.setSpeedRequired(true);
Log.d("Location", "Criteria: " + criteria.toString());
//獲取最符合此標準的provider對象
// String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();
//根據設置的Criteria對象,獲取最符合此標準的provider對象
String currentProvider = locationManager.getBestProvider(criteria, true);
Log.d("Location", "currentProvider: " + currentProvider);
status.setText(currentProvider);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_CODE);
return;
} else {
status.setText("正在獲取GPS坐標請稍候...");
}
locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);
//根據當前provider對象獲取最後一次位置信息
Location location = locationManager.getLastKnownLocation(currentProvider);
//如果位置信息不為null,則請求更新位置信息
if (location != null) {
textViewLatitude.setText(location.getLatitude() + "");
textViewLongitude.setText(location.getLongitude() + "");
textViewAltitude.setText(location.getAltitude() + "");
textViewSpeed.setText(location.getSpeed() + "");
textViewTime.setText(location.getTime() + "");
Log.d("Location", "Latitude: " + location.getLatitude());
Log.d("Location", "location: " + location.getLongitude());
} else {
Log.d("Location", "Latitude: " + 0);
Log.d("Location", "location: " + 0);
}
}
//創建位置監聽器
private LocationListener locationListener = new LocationListener() {
//位置發生改變時調用
@Override
public void onLocationChanged(Location location) {
status.setText("onLocationChanged");
//位置信息變化時觸發
Log.e("Location", "定位方式:" + location.getProvider());
Log.e("Location", "緯度:" + location.getLatitude());
Log.e("Location", "經度:" + location.getLongitude());
Log.e("Location", "海拔:" + location.getAltitude());
Log.e("Location", "時間:" + location.getTime());
textViewLatitude.setText(location.getLatitude() + "");
textViewLongitude.setText(location.getLongitude() + "");
textViewAltitude.setText(location.getAltitude() + "");
textViewSpeed.setText(location.getSpeed() + "");
textViewTime.setText(dateFormat.format(new Date(location.getTime())) + "");
//解析地址
Geocoder geoCoder = new Geocoder(MainActivity.this, Locale.getDefault());
double latitude = location.getLatitude();
double longitude = location.getLongitude();
List<Address> locationList = null;
try {
locationList = geoCoder.getFromLocation(latitude, longitude, 5);
} catch (IOException e) {
e.printStackTrace();
}
// Address address = locationList.get(0);//得到Address實例第一個地址
// status.setText(address.toString());
// String countryName = address.getCountryName();//得到國家名稱,比如:中國
// String locality = address.getLocality();//得到城市名稱,比如:北京市
list.clear();
for (Address address : locationList) {
for (int n = 0; address.getAddressLine(n) != null; n++) {
String addressLine = address.getAddressLine(n);//得到周邊信息,包括街道等,i=0,得到街道名稱
list.add(addressLine);
Log.i("Location", "addressLine = " + addressLine);
Log.d("Location", address.getCountryName() + address.getAdminArea() + address.getFeatureName());
}
}
adapter.notifyDataSetChanged();
}
//provider失效時調用
@Override
public void onProviderDisabled(String provider) {
Log.d("Location", "onProviderDisabled");
status.setText("onProviderDisabled");
}
//provider啟用時調用
@Override
public void onProviderEnabled(String provider) {
Log.d("Location", "onProviderEnabled");
status.setText("onProviderEnabled");
}
//狀態改變時調用
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.d("Location", "onStatusChanged");
//GPS狀態變化時觸發
switch (status) {
case LocationProvider.AVAILABLE:
Log.e("Location", "當前GPS狀態為可見狀態");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.e("Location", "當前GPS狀態為服務區外狀態");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.e("Location", "當前GPS狀態為暫停服務狀態");
break;
}
}
};
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_PERMISSION_CODE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
}
}
}