Координаты GPS (с помощью диспетчера местоположений) печатаются как null

#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.