如何通过NETWORK提供程序检索位置

时间:2015-12-17 15:48:38

标签: android

我正在尝试通过网络提供商获取设备的位置。 如果我使用GPS工作正常。 但是当我试图通过我的提供商找到它时,所有时间都返回false。 我确保在清单中我拥有我需要的所有权限: 这是我的表现:

    <permission
        android:name="com.example.matant.gpsportclient.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

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

    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!--
 The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but are recommended.
    -->


    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Permission to vibrate -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="com.example.matant.gpsportclient.permission.MAPS_RECEIVE" />

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

    <!-- Creates a custom permission so only this app can receive its messages. -->
    <permission
        android:name="com.example.matant.gpsportclient.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.galaxystech.pushnotifications.permission.C2D_MESSAGE" />

    <!-- This app has permission to register and receive data message. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <!-- Network State Permissions to detect Internet status -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这是我的位置类:

 public class GPSportLocationManager {

        private boolean gpsEnabled,networkEnabled,isLocationUpdating;
        private LocationManager locationManager;
        private Location currentLoc;
        private Context context;
        private OnLocationFoundListener listener;
        private int networkLocCount=0,gpsLocCount=0;



          public GPSportLocationManager(Context ctx,OnLocationFoundListener mListener){
                this.context = ctx;
                this.listener = mListener;
            }

            /**
             * method which finding the device location.
             */
            public void getLocation(){
                try {
                    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                    gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                    networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
                    Log.d("gpsEnabled",String.valueOf(gpsEnabled));
                    Log.d("networkEnabled",String.valueOf(networkEnabled));
                    if(!gpsEnabled && !networkEnabled){
                        LocationAlertDialog();
                    }else{
                        if(gpsEnabled){
                            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                    Constants.GPS_MIN_TIME_BETWEEN_UPDATE,Constants.GPS_MIN_DISTANCE_CHANGE,gpsListener);

                        }else{
                            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                    Constants.NETWORK_MIN_TIME_BETWEEN_UPDATE,Constants.NETWORK_MIN_DISTANCE_CHANGE,networkListener);
                        }
                    }
                    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
                    service.schedule(new Runnable() {
                        @Override
                        public void run() {
                            if(currentLoc == null){
                                if(gpsEnabled){
                                    currentLoc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                }else if(networkEnabled){
                                    currentLoc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                                }
                                if(currentLoc != null && listener !=null){
                                    locationManager.removeUpdates(gpsListener);
                                    locationManager.removeUpdates(networkListener);
                                    listener.onLocationFound(currentLoc);
                                }
                            }
                        }
                    },30, TimeUnit.SECONDS);
                }catch (Exception e){
                    Toast.makeText(context,"Error while getting location"+e.getMessage(),Toast.LENGTH_LONG).show();
                }

            }

            /**
             * GPS location listener handle the callbacks.
             */
            private LocationListener gpsListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                if(gpsLocCount != 0 && !isLocationUpdating){
                        isLocationUpdating = true;
                    currentLoc = location;
                    locationManager.removeUpdates(gpsListener);
                    locationManager.removeUpdates(networkListener);
                    isLocationUpdating = false;
                    if(currentLoc != null && listener !=null){
                        listener.onLocationFound(currentLoc);
                        }
                    }
                    gpsLocCount++;
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            };
            private  LocationListener networkListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    if(networkLocCount != 0 && !isLocationUpdating){
                        isLocationUpdating = true;
                        currentLoc = location;
                        locationManager.removeUpdates(gpsListener);
                        locationManager.removeUpdates(networkListener);
                        isLocationUpdating = false;
                        if(currentLoc != null && listener !=null){
                            listener.onLocationFound(currentLoc);
                        }
                    }
                    networkLocCount++;
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            };

            public void LocationAlertDialog() {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
                alertDialog.setTitle("Location settings");
                alertDialog
                        .setMessage("We cannot retrieve your location. Please click on settings and make sure your GPS is enabled");

                alertDialog.setPositiveButton("Settings",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent intent = new Intent(
                                        Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                context.startActivity(intent);
                            }
                        });
                alertDialog.setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });
                alertDialog.show();
            }

        }

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。 在我的设备设置中,我需要配置设备将仅使用WiFi和蜂窝网络来检索位置。