Java android纬度和经度返回0.0

Java android纬度和经度返回0.0,java,android,Java,Android,我正在使用NET_PROVIDER检查当前的经度和纬度,并在应用程序中将它们打印为toast消息。 但是,在权限设置和连接网络的情况下,经度和纬度始终返回0.0 我为修复此问题所做的: 设置权限 在onLocationChanged方法中保存了以前的位置 我尝试了emulator和real device(api22)。但两者都返回0给我 这是我的密码 TrackGps.java: import android.Manifest; import android.app.AlertDialog;

我正在使用NET_PROVIDER检查当前的经度和纬度,并在应用程序中将它们打印为toast消息。 但是,在权限设置和连接网络的情况下,经度和纬度始终返回0.0

我为修复此问题所做的:

  • 设置权限
  • onLocationChanged
    方法中保存了以前的位置
  • 我尝试了emulator和real device(api22)。但两者都返回0给我

    这是我的密码

    TrackGps.java

    import android.Manifest;
    import android.app.AlertDialog;
    import android.app.Service;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.provider.Settings;
    
    
    import android.support.v4.app.ActivityCompat;
    import android.util.Log;
    import android.widget.Toast;
    
    /**
     * Created by Hannah Liao on 5/7/2017
     */
    
    public class TrackGps extends Service implements LocationListener {
    
        private final Context mContext;
    
        boolean checkNetwork = false;
    
        boolean canGetLocation = false;
        LocationListener locationListener;
        Location loc ;
        double latitude;
        double longitude;
    
    
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    
    
        private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
        protected LocationManager locationManager;
    
        public TrackGps(Context mContext) {
            this.mContext = mContext;
            getLocation();
        }
    
        private Location getLocation() {
    
            try {
                locationManager = (LocationManager) mContext
                        .getSystemService(LOCATION_SERVICE);
    
                checkNetwork = locationManager
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
                if(!checkNetwork) {
                    Toast.makeText(mContext, "No Service Provider Available", Toast.LENGTH_SHORT).show();
                } else {
                    this.canGetLocation = true;
                    // First get location from Network Provider
                    if (checkNetwork) {
                        Toast.makeText(mContext, "Network", Toast.LENGTH_SHORT).show();
    
                        try {
                            locationManager.requestLocationUpdates(
                                    LocationManager.NETWORK_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                            Log.d("Network", "Network");
    
                            if (locationManager != null) {
                                loc = locationManager
                                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                                this.onLocationChanged(loc);
                            }
    
                            if (loc != null) {
                                latitude = loc.getLatitude();
                                longitude = loc.getLongitude();
                            }
                        } catch (SecurityException e) {
    
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                // otherwise just use network
               /*if (checkGPS) {
                    Toast.makeText(mContext, "GPS", Toast.LENGTH_SHORT).show();
                    if (loc == null) {
                        try {
                            locationManager.requestLocationUpdates(
                                    LocationManager.GPS_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener);
                            Log.d("GPS Enabled", "GPS Enabled");
                            if (locationManager != null) {
                                loc = locationManager
                                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                if (loc != null) {
                                    latitude = loc.getLatitude();
                                    longitude = loc.getLongitude();
                                }
                            }
                        } catch (SecurityException e) {
    
                        }
                    }
                }*/
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return loc;
        }
    
        public double getLongitude() {
            if (loc != null) {
                longitude = loc.getLongitude();
            }
            return longitude;
        }
    
        public double getLatitude() {
            if (loc != null) {
                latitude = loc.getLatitude();
            }
            return latitude;
        }
    
        public boolean canGetLocation() {
            return this.canGetLocation;
        }
    
        public void showSettingsAlert() {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
    
    
            alertDialog.setTitle("GPS Not Enabled");
    
            alertDialog.setMessage("Do you wants to turn On GPS");
    
    
            alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    mContext.startActivity(intent);
                }
            });
    
    
            alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
    
    
            alertDialog.show();
        }
    
    
    
        public void stopUsingGPS() {
            if (locationManager != null) {
    
                locationManager.removeUpdates(TrackGps.this);
            }
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onLocationChanged(Location location) {
                this.loc = location;
                getLocation();
                getLongitude();
                getLatitude();
        }
    
        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
    
        }
    
        @Override
        public void onProviderEnabled(String s) {
    
        }
    
        @Override
        public void onProviderDisabled(String s) {
    
        }
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.map.hannah.location3">
    
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-feature android:name="android.hardware.location.gps" />
        <application
    
    
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
    
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <service android:name=".TrackGps" android:enabled="true" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
        defaultConfig {
            applicationId "com.map.hannah.location3"
            minSdkVersion 17
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
    }
    
    MainActivity.java

    清单

    import android.Manifest;
    import android.app.AlertDialog;
    import android.app.Service;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.provider.Settings;
    
    
    import android.support.v4.app.ActivityCompat;
    import android.util.Log;
    import android.widget.Toast;
    
    /**
     * Created by Hannah Liao on 5/7/2017
     */
    
    public class TrackGps extends Service implements LocationListener {
    
        private final Context mContext;
    
        boolean checkNetwork = false;
    
        boolean canGetLocation = false;
        LocationListener locationListener;
        Location loc ;
        double latitude;
        double longitude;
    
    
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    
    
        private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
        protected LocationManager locationManager;
    
        public TrackGps(Context mContext) {
            this.mContext = mContext;
            getLocation();
        }
    
        private Location getLocation() {
    
            try {
                locationManager = (LocationManager) mContext
                        .getSystemService(LOCATION_SERVICE);
    
                checkNetwork = locationManager
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
                if(!checkNetwork) {
                    Toast.makeText(mContext, "No Service Provider Available", Toast.LENGTH_SHORT).show();
                } else {
                    this.canGetLocation = true;
                    // First get location from Network Provider
                    if (checkNetwork) {
                        Toast.makeText(mContext, "Network", Toast.LENGTH_SHORT).show();
    
                        try {
                            locationManager.requestLocationUpdates(
                                    LocationManager.NETWORK_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                            Log.d("Network", "Network");
    
                            if (locationManager != null) {
                                loc = locationManager
                                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                                this.onLocationChanged(loc);
                            }
    
                            if (loc != null) {
                                latitude = loc.getLatitude();
                                longitude = loc.getLongitude();
                            }
                        } catch (SecurityException e) {
    
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                // otherwise just use network
               /*if (checkGPS) {
                    Toast.makeText(mContext, "GPS", Toast.LENGTH_SHORT).show();
                    if (loc == null) {
                        try {
                            locationManager.requestLocationUpdates(
                                    LocationManager.GPS_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener);
                            Log.d("GPS Enabled", "GPS Enabled");
                            if (locationManager != null) {
                                loc = locationManager
                                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                if (loc != null) {
                                    latitude = loc.getLatitude();
                                    longitude = loc.getLongitude();
                                }
                            }
                        } catch (SecurityException e) {
    
                        }
                    }
                }*/
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return loc;
        }
    
        public double getLongitude() {
            if (loc != null) {
                longitude = loc.getLongitude();
            }
            return longitude;
        }
    
        public double getLatitude() {
            if (loc != null) {
                latitude = loc.getLatitude();
            }
            return latitude;
        }
    
        public boolean canGetLocation() {
            return this.canGetLocation;
        }
    
        public void showSettingsAlert() {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
    
    
            alertDialog.setTitle("GPS Not Enabled");
    
            alertDialog.setMessage("Do you wants to turn On GPS");
    
    
            alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    mContext.startActivity(intent);
                }
            });
    
    
            alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
    
    
            alertDialog.show();
        }
    
    
    
        public void stopUsingGPS() {
            if (locationManager != null) {
    
                locationManager.removeUpdates(TrackGps.this);
            }
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onLocationChanged(Location location) {
                this.loc = location;
                getLocation();
                getLongitude();
                getLatitude();
        }
    
        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
    
        }
    
        @Override
        public void onProviderEnabled(String s) {
    
        }
    
        @Override
        public void onProviderDisabled(String s) {
    
        }
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.map.hannah.location3">
    
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-feature android:name="android.hardware.location.gps" />
        <application
    
    
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
    
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <service android:name=".TrackGps" android:enabled="true" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
        defaultConfig {
            applicationId "com.map.hannah.location3"
            minSdkVersion 17
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
    }
    

    阅读
    getLastKnownLocation
    What@commonware shared似乎非常有用,也许这个问题与这个问题完全相同。另外,当没有可用数据时,0.0不是默认位置吗?问题是我没有收到任何错误消息,例如NullPointerException。原始代码来自。不过我的控制台看起来不错。