Android Geolocation работает в эмуляторе, но не работает в телефоне - PullRequest
0 голосов
/ 03 сентября 2018

Я сделал простое приложение с геолокацией, которое отображает текущее местоположение пользователя в текстовых представлениях, например, широту, долготу и Геокодер почтовый индекс названия страны и т. Д.

В эмуляторе все работает отлично, но по какой-то причине местоположение не получается на моем мобильном телефоне.

Эмулятор работает под управлением Android 7.1, а на моем мобильном - Android 7.0, но это не должно быть проблемой, потому что я создал приложение с 6.0 зефиром.

Вот код

"Mainactivity"

package com.example.slimshady.LocationInfoApp;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

    LocationManager locationManager;
    LocationListener locationListener;
    Geocoder geocoder;
    TextView latitude, longitude, city, postcode, country;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        latitude = (TextView)findViewById(R.id.latitude);
        longitude = (TextView) findViewById(R.id.longitude);
        city = (TextView)findViewById(R.id.city);
        postcode = (TextView)findViewById(R.id.postcode);
        country = (TextView)findViewById(R.id.country);


        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                updateLocationInfo(location);

            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {

            }

            @Override
            public void onProviderEnabled(String s) {

            }

            @Override
            public void onProviderDisabled(String s) {

            }
        };

        // asking permission starts here
        if (Build.VERSION.SDK_INT < 23){

            // api level lower than 23 so no need to ask for permission

            try {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, locationListener);

            }
            catch (SecurityException e){

                e.printStackTrace();
            }
        }
        else {

            // api level greater than or equal to 23 checking if has permission if not VVVV this condition
            // means go ask for permission

            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){

                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
            }
            else{

                // means api level greater than or equal to 23 and already has permission
                // so no need to go out and ask for permission

                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, locationListener);

                // last known location because we went to this part means we have been here before
                Location lastKnownLocation =  locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (lastKnownLocation != null) {
                    updateLocationInfo(lastKnownLocation);
                }



            }

        }
        // asking permission ends here


    }

    public void updateLocationInfo(Location location) {

        geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());

        try {

            List<Address> locationAddress = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(),1);
            if (locationAddress != null && locationAddress.size() > 0) {

                latitude.setText("Latitude: "+String.valueOf(locationAddress.get(0).getLatitude()));
                longitude.setText("Longitude: "+String.valueOf(locationAddress.get(0).getLongitude()));
                city.setText("City: "+String.valueOf(locationAddress.get(0).getLocality()));
                postcode.setText("Post Code: "+String.valueOf(locationAddress.get(0).getPostalCode()));
                country.setText("Country: "+String.valueOf(locationAddress.get(0).getCountryName()));

            }


        }
        catch (Exception e){

        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

            startListening();

        }
    }

    public void startListening(){

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, locationListener);

        }

    }
}

Код простой и простой, все должно работать нормально, но по некоторым причинам это не так.

Я имею в виду, что GPS-приемник в моем физическом устройстве работает с Google-картами, поэтому я знаю, что он не сломан.

смотри, работает в эмуляторе нормально Image of it working in the emulator

Но тот же код не работает на моем мобильном телефоне, и я добавил все разрешения:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>

См. То же приложение не работает на моем физическом устройстве, это скриншот с моего физического устройства

Screenshot of it not working on mobile

Как вы видите, местоположение включено, и я получил разрешение на запрос во всплывающем окне. И последнее, но не менее важное, чтобы показать, что приемник GPS работает и не поврежден в моем физическом устройстве.

Скриншот меня с использованием карт Google Screenshot of me using google maps Я обведен красным на GPS и карты могут определить мое местоположение GPS

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Если вы используете выпущенный apk на физическом устройстве, то вам нужно добавить SHA1 для выпуска apk в разделе ограничений консоли Google API. Я думаю, что это помогает.

Если нет, то, пожалуйста, покажите ошибку logcat путем отладки приложения на физическом устройстве.

0 голосов
/ 04 сентября 2018

Существует несколько способов, которыми ваше устройство может найти себя. Они часто путаются как «GPS», когда это не так.

  1. GPS (система глобального позиционирования) Это глобальная навигационная спутниковая система (GNSS), которая использует сигналы от орбитальной группировки спутников для определения местоположения устройства. GPS, в частности, относится к группировке спутников, развернутых Министерством обороны США. Альтернативы включают ГЛОНАСС (русский) и Галилео (европейский).
  2. Сеть Использует сигналы WiFi или Bluetooth для определения местоположения вашего устройства. Устройство сканирует идентификаторы передатчиков, а затем отправляет эти идентификаторы на сервер через интернет-соединение для поиска в базе данных. Сервер отвечает местоположением.

Ваш код в настоящее время использует только LocationManager.GPS_PROVIDER, который использует только спутники для определения местоположения вашего устройства. Карты Google могут использовать сетевое местоположение, которое все еще может работать, когда GPS отключен.

Я подозреваю, что вам нужно либо:

  1. Добавить LocationManager.NETWORK_PROVIDER или
  2. Включить GPS на вашем устройстве. Это где-то под Настройки и Местоположение.

enter image description here

0 голосов
/ 04 сентября 2018

Я решил проблему, как ваш полностью удаленный менеджер местоположений, и заставил все локации работать на основе FusedLocationProviderClient, также у меня была странная ошибка на samsung s8 с LocationSettingsRequest, которая может запустить диалог по умолчанию для включения GPS, это было работал с ошибками, но после удаления locationManager.requestLocationUpdates прекрасно работает с плавкими.

...