Dapatkan panjang lintang pengguna saat ini setelah GPS diaktifkan - Android

Saya telah mengikuti tutorial ini http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/ untuk menampilkan popup jika GPS tidak diaktifkan dan mendapatkan lokasi terkini pengguna.

Dan berikut adalah penerima siaran yang mendengarkan kondisi GPS diaktifkan dinonaktifkan

private BroadcastReceiver mGpsSwitchStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
            gps = new GPSTracker(getActivity());

            if(gps.canGetLocation()){
                Log.d("Your Location", "latitude:" + gps.getLatitude() + ", longitude: " + gps.getLongitude());

                Toast.makeText(getActivity(), "GPS Switch", Toast.LENGTH_SHORT).show();

                if(gps.getLatitude() != 0 && gps.getLongitude() != 0 ){
                    final CameraPosition cameraPosition = new CameraPosition.Builder()
                            .target(new LatLng(gps.getLatitude(),gps.getLongitude()))      // Sets the center of the map to selected place
                            .zoom(15)                   // Sets the zoom
                            .build();                   //
                    gMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                    Toast.makeText(getActivity(), "GPS Switch Lat: "+gps.getLatitude()+" Long: "+gps.getLongitude(), Toast.LENGTH_SHORT).show();
                }
            } else {
                if(!gps.isSettingDialogShown())
                    gps.showSettingsAlert();
            }
        }
    }
};

Saat saya mengaktifkan GPS melalui dialog pengaturan atau dari menu drop down. Kelas GPSTracker mendapatkan layanan lokasi dan memeriksa lokasi pengguna saat ini dalam fragmen kode ini

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();

                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();

                        }
                    }
                }
            }
        }

    } catch (SecurityException e) {
        e.printStackTrace();
    }

    return location;
}

Masalah:

Pertama saya tidak tahu mengapa penerima siaran, menerima tindakan dua kali dan kedua ketika dalam mode normal nilai lat lng di penerima tetap nol tetapi dalam debugging terkadang mengembalikan nilai lokasi pengguna saat ini.

Bisakah Anda membantu apa yang saya lakukan salah?


person Malik Usman    schedule 31.03.2017    source sumber
comment
stackoverflow.com/a/43082164/115145   -  person CommonsWare    schedule 31.03.2017
comment
Gunakan Google Fused Location Api dan Pengaturan Lokasi, Periksa ini   -  person Abid Khan    schedule 31.03.2017
comment
@CommonsWare Saya tidak mengerti bagaimana saya bisa mendapatkan lat lng di penerima siaran setelah menyalakan GPS? Dan dalam jawaban Anda, Anda mengatakan hindari penggunaan getLastKnownLocation() lalu apa yang harus digunakan selain ini?   -  person Malik Usman    schedule 31.03.2017
comment
Gunakan requestLocationUpdates(), di mana Anda mendapatkan lokasi di LocationListener Anda. Ini tercakup dalam jawaban yang saya tautkan, lihat langkah #2 dan #3.   -  person CommonsWare    schedule 31.03.2017


Jawaban (1)


Jika Anda tidak perlu bekerja dengan Gps dan Lokasi Jaringan secara terpisah. Saya sarankan untuk menggunakan FusedLocationProvider. BroadcastReceiver mungkin berfungsi dua kali karena berfungsi untuk gps dan layanan lokasi jaringan

person Hakan Saglam    schedule 31.03.2017
comment
Terima kasih atas bantuan Anda, ini memecahkan masalah yang saya hadapi. - person Malik Usman; 03.04.2017