#android #gps #locationmanager
#Android #gps #locationmanager
Вопрос:
OnCreateMethod,
LocationManager manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
coordinates = new GeoPoint((int)location.getLatitude(), (int)location.getLongitude()).toString();
}
};
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
}
и когда я пытаюсь показать координаты (setText) в TextView, он говорит «null»
Манифест Android,
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Несмотря на то, что мой TextView отображает «null», я получаю уведомление в строке состояния с надписью «Поиск GPS»
Комментарии:
1. Где вы задаете координаты для TextView? Вы должны сделать это в
onLocationChanged
.2. я поместил их в строковую переменную в onLocationChange и использовал setText в onClickListner, где мне нужно отобразить их после нажатия кнопки
3. В этом случае координаты все равно могут быть нулевыми при нажатии кнопки. По этой причине поместите этот код в onLocationChanged.
4. Привет, я поместил код setText в onLocationChanged, теперь возникает исключение, в котором говорится: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main «java.lang.RuntimeException: заглушка в com.google.android.maps. ГеоПункт. <инициализация> (неизвестный источник) в com.my program.. activity.onLocationChanged
Ответ №1:
Вот мой подход:
Всегда используйте задачу синхронизации для получения координат и т.д.
Это связано с тем, что блокировка GPS и т.д. Требует времени, и вы не хотите перегружать свой основной поток пользовательского интерфейса. Использование задачи синхронизации позволит вам запустить процесс в фоновом режиме и автоматически обновить поле пользовательского интерфейса после эффективного выполнения метода.
Вот фрагмент кода: Для выполнения фоновой части задачи асинхронной синхронизации
protected String doInBackground(Location... params) {
/*
* Get a new geocoding service instance, set for localized addresses.
* This example uses android.location.Geocoder, but other geocoders that
* conform to address standards can also be used.
*/
// Show user progress bar
pd.show();
Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
// Get the current location from the input parameter list
Location location = params[0];
// Create a list to contain the result address
List<Address> addresses = null;
// Try to get an address for the current location. Catch IO or network
// problems.
try {
/*
* Call the synchronous getFromLocation() method with the latitude
* and longitude of the current location. Return at most 1 address.
*/
addresses = geocoder.getFromLocation(location.getLatitude(),
location.getLongitude(), 1);
// Catch network or other I/O problems.
} catch (IOException exception1) {
// Log an error and return an error message
Log.e(LocationUtils.APPTAG,
mContext.getString(R.string.IO_Exception_getFromLocation));
// print the stack trace
exception1.printStackTrace();
// Return an error message
return (mContext.getString(R.string.IO_Exception_getFromLocation));
// Catch incorrect latitude or longitude values
} catch (IllegalArgumentException exception2) {
// Construct a message containing the invalid arguments
String errorString = mContext.getString(
R.string.illegal_argument_exception,
location.getLatitude(), location.getLongitude());
// Log the error and print the stack trace
Log.e(LocationUtils.APPTAG, errorString);
exception2.printStackTrace();
//
return errorString;
}
// If the reverse geocode returned an address
if (addresses != null amp;amp; addresses.size() > 0) {
// Get the first address
Address address = addresses.get(0);
// Format the first line of address
addressText = mContext.getString(
R.string.address_output_string,
// If there's a street address, add it
address.getMaxAddressLineIndex() > 0 ? address
.getAddressLine(0) : "",
// Locality is usually a city
address.getLocality(),
// The country of the address
address.getCountryName());
// Return the text
return addressText;
// If there aren't any addresses, post a message
} else {
return mContext.getString(R.string.no_address_found);
}
}
После завершения выполнения фоновой задачи вы можете запустить метод onPostExecute.
protected void onPostExecute(String result) {
delegate.processFinished(result);
// Update the EditText on the UI Thread.
ed.setText(result);
// Hide progress bar
pd.hide();
}
Затем в вашем соответствующем основном классе вы можете вызвать задачу Aysch и попросить ее отобразить результаты.
public void getAddress(View v) {
// In Gingerbread and later, use Geocoder.isPresent() to see if a
// geocoder is available.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD
amp;amp; !Geocoder.isPresent()) {
// No geocoder is present. Issue an error message
Toast.makeText(getActivity(), R.string.no_geocoder_available,
Toast.LENGTH_LONG).show();
return;
}
if (servicesConnected()) {
// Get the current location
Location currentLocation = mLocationClient.getLastLocation();
Lat = currentLocation.getLatitude();
Lng = currentLocation.getLongitude();
LatLng = Double.toString(Lat) "," Double.toString(Lng);
// Message to show results
Toast.makeText(getActivity(), LatLng, 0).show();
// Turn the indefinite activity indicator on
// Start the background task
GetAddressTask getAddressTask = new GetAddressTask(getActivity(),
locationAddress, pd);
getAddressTask.delegate = this;
getAddressTask.execute(currentLocation);
} else {
Toast.makeText(getActivity(), "servicesConnected() == false",
Toast.LENGTH_SHORT).show();
}
}
Примечание: это только соответствующие фрагменты кода, которые вам нужны. Обратитесь к моему github, если вам требуется более подробный подход. Не забудьте проголосовать за и принять ответ!
Ps:
Я включил пару изображений приложения, которое я сделал, чтобы проиллюстрировать, что может делать код, не беспокойтесь о карте и прочем. Здесь просто отображаются события, которые я добавил и которыми поделился с друзьями, у которых есть такое же приложение на телефоне, через облачный сервер Google.