纬度和经度显示0,0

时间:2017-04-30 09:06:08

标签: android google-maps

我想通过JSON数据显示纬度和经度,但每次我获得纬度和经度的0值。我谷歌它并发现我必须添加运行时权限才能解决,但我无法解决问题。如何解决这个问题?

GpsLocation类

public class GpsLocation extends Service implements LocationListener {
    private final Context mContext;
    // flag for GPS status
    boolean isGPSEnabled = false;
    // flag for network status
    boolean isNetworkEnabled = false;
    // flag for GPS status
    boolean canGetLocation = false;
    Location location; // location
    double latitude; // latitude
    double longitude; // longitude
    double speed, direction;
    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GpsLocation(Context context) {
        this.mContext = context;
        getLocation();
    }

    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;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    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 Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     */
    public void stopUsingGPS() {
        if(locationManager != null){
            locationManager.removeUpdates(GpsLocation.this);
        }
    }

    /**
     * Function to get latitude
     */
    public double getLatitude() {
        if (location != null) {
            latitude = location.getLatitude();
        }
        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     */
    public double getLongitude() {
        if (location != null) {
            longitude = location.getLongitude();
        }
        // return longitude
        return longitude;
    }

    public double getSpeed() {
        return speed;
    }

    public double getDirection() {
        return direction;
    }

    /**
     * Function to check GPS/wifi enabled
     *
     * @return boolean
     */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * Function to show settings alert dialog
     * On pressing Settings button will launch Settings Options
     */
    public void showSettingsAlert() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");
        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });
        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        // Showing Alert Message
        alertDialog.show();
    }

    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            speed = location.getSpeed();
            direction = location.getBearing();
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

NearMe

public class NearMe extends Fragment {
    MapView mMapView;
    private GoogleMap googleMap;

    GpsLocation gpsLocation;
    double longitude, latitude;
    private ProgressDialog pDialog;
    ArrayList<MySchool> al_school = new ArrayList<MySchool>();
    ArrayList<MyCollege> al_college = new ArrayList<MyCollege>();
    ArrayList<MyUniversity> al_university = new ArrayList<MyUniversity>();
    private static final String TAG = NearMe.class.getSimpleName();
    private static final String urlSchool = "http://www.myeducationhunt.com/api/v1/schools";
    private static final String urlCollege = "http://www.myeducationhunt.com/api/v1/colleges";
    private static final String urlUniversity = "http://www.myeducationhunt.com/api/v1/universities";

    Context mContext;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View v = inflater.inflate(R.layout.fragment_near_me, container, false);

        final LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);


        if (isConnected()) {
            if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Toast.makeText(getContext(), "GPS is Enabled in your device", Toast.LENGTH_SHORT).show();

                mMapView = (MapView) v.findViewById(R.id.mapView);
                mMapView.onCreate(savedInstanceState);

                mMapView.onResume();

                try {
                    MapsInitializer.initialize(getActivity().getApplicationContext());


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


                gpsLocation = new GpsLocation(getContext());
                if (gpsLocation.canGetLocation()) {

                    latitude = gpsLocation.getLatitude();
                    longitude = gpsLocation.getLongitude();

                    Toast.makeText(getContext(), "latitude:" + latitude + "Longitude:" + longitude, Toast.LENGTH_LONG).show();
                } else {

                    gpsLocation.showSettingsAlert();
                }


                pDialog = new ProgressDialog(getContext());
                pDialog.setMessage("Loading…");
                pDialog.show();


                mMapView.getMapAsync(new OnMapReadyCallback() {
                    @Override
                    public void onMapReady(GoogleMap mMap) {
                        googleMap = mMap;

                        //     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(gpsLocation.getLatitude(), gpsLocation.getLongitude()));
                        //     CameraUpdate zoom = CameraUpdateFactory.zoomTo(14);
                        //     mMap.moveCamera(cameraUpdate);
                        //     mMap.animateCamera(zoom);

                        //  mMap.animateCamera(cameraUpdate);


                        LatLng schoollatlng = new LatLng(latitude, longitude);
                        googleMap.addMarker(new MarkerOptions().position(schoollatlng).title("MyLocation"));
                        CameraPosition cameraPosition = new CameraPosition.Builder().target(schoollatlng).zoom(10).build();
                        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(gpsLocation.getLatitude(), gpsLocation.getLongitude()), 14.0f));

                        drawSchoolMarker();
                        drawCollegeMarker();
                        drawUniversityMarker();
                    }
                });
            } else {
                showGPSDisabledAlertToUser();
            }
        } else {

            Toast.makeText(getContext(), "Please check your internet connection", Toast.LENGTH_LONG).show();
        }

        return v;
    }

    public boolean isConnected() {
        ConnectivityManager connMgr = (ConnectivityManager) getActivity().getSystemService(Activity.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected())
            return true;
        else
            return false;
    }

    private void hidePDialog() {
        if (pDialog != null) {
            pDialog.dismiss();
            pDialog = null;
        }
    }

    private void drawSchoolMarker() {

        JsonArrayRequest schoolRequest = new JsonArrayRequest(urlSchool,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        hidePDialog();

                        // Parsing json
                        for (int i = 0; i < response.length(); i++) {
                            try {

                                JSONObject obj = response.getJSONObject(i);
                                MySchool school = new MySchool();

                                school.setId(obj.getInt("id") + " ");
                                school.setName(obj.getString("name"));
                                if (obj.getString("latitude") == "null") {
                                    school.setLatitude(Double.parseDouble("27.6712"));
                                } else {
                                    school.setLatitude(Double.parseDouble(obj.getString("latitude")));
                                }

                                if (obj.getString("longitude") == "null") {
                                    school.setLongitude(Double.parseDouble("85.2865"));
                                } else {
                                    school.setLongitude(Double.parseDouble(obj.getString("longitude")));
                                }

                                al_school.add(school);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

                        //iterate from arraylist
                        for (MySchool schoolItr : al_school) {

                            View marker = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_marker, null);
                            TextView numTxt = (TextView) marker.findViewById(R.id.num_txt);
                            numTxt.setText(schoolItr.getName());
                            LatLng latlng = new LatLng(schoolItr.getLatitude(), schoolItr.getLongitude());
                            googleMap.addMarker(new MarkerOptions().position(latlng).icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(getContext(), marker))).title(schoolItr.getName()));
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                hidePDialog();
            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(schoolRequest);
    }

    private void drawCollegeMarker() {
        JsonArrayRequest collegeRequest = new JsonArrayRequest(urlCollege,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        hidePDialog();

                        // Parsing json
                        for (int i = 0; i < response.length(); i++) {
                            try {

                                JSONObject obj = response.getJSONObject(i);
                                MyCollege college = new MyCollege();

                                college.setId("" + obj.getInt("id"));
                                college.setName("" + obj.getString("name"));
                                //college.setLatitude(Double.parseDouble("" + obj.getDouble("latitude")));
                                //college.setLongitude(Double.parseDouble("" + obj.getDouble("longitude")));
                                if (obj.getString("latitude") == "null") {

                                    college.setLatitude(Double.parseDouble("27.6712"));
                                } else {

                                    college.setLatitude(Double.parseDouble(obj.getString("latitude")));
                                }

                                if (obj.getString("longitude") == "null") {
                                    college.setLongitude(Double.parseDouble("27.6712"));
                                } else {
                                    college.setLongitude(Double.parseDouble(obj.getString("longitude")));

                                }

                                al_college.add(college);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

                        //iterate from arraylist
                        for (MyCollege collegeItr : al_college) {

                            View marker = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_marker_college, null);
                            TextView numTxt = (TextView) marker.findViewById(R.id.txt_college);
                            numTxt.setText(collegeItr.getName());
                            LatLng latlng = new LatLng(collegeItr.getLatitude(), collegeItr.getLongitude());
                            googleMap.addMarker(new MarkerOptions().position(latlng).icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(getContext(), marker))).title(collegeItr.getName()));
                        }


                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                hidePDialog();
            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(collegeRequest);
    }

    private void drawUniversityMarker() {
        JsonArrayRequest uniRequest = new JsonArrayRequest(urlUniversity,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        hidePDialog();

                        // Parsing json
                        for (int i = 0; i < response.length(); i++) {
                            try {

                                JSONObject obj = response.getJSONObject(i);
                                MyUniversity university = new MyUniversity();

                                university.setId("" + obj.getInt("id"));
                                university.setName("" + obj.getString("name"));
                                //university.setLatitude(Double.parseDouble("" + obj.getDouble("latitude")));
                                //university.setLongitude(Double.parseDouble("" + obj.getDouble("longitude")));
                                if (obj.getString("latitude") == "null") {

                                    university.setLatitude(Double.parseDouble("27.6712"));
                                } else {

                                    university.setLatitude(Double.parseDouble(obj.getString("latitude")));
                                }

                                if (obj.getString("longitude") == "null") {
                                    university.setLongitude(Double.parseDouble("27.6712"));
                                } else {
                                    university.setLongitude(Double.parseDouble(obj.getString("longitude")));

                                }

                                al_university.add(university);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }

                        //iterate from arraylist
                        for (MyUniversity universityItr : al_university) {

                            View marker = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_marker_university, null);
                            TextView numTxt = (TextView) marker.findViewById(R.id.txt_university);
                            numTxt.setText(universityItr.getName());
                            LatLng latlng = new LatLng(universityItr.getLatitude(), universityItr.getLongitude());
                            googleMap.addMarker(new MarkerOptions().position(latlng).icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(getContext(), marker))).title(universityItr.getName()));

                        }


                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                hidePDialog();
            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(uniRequest);
    }

    public static Bitmap createDrawableFromView(Context context, View view) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels);
        view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);
        view.buildDrawingCache();
        Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);

        return bitmap;
    }

    private void showGPSDisabledAlertToUser() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        alertDialogBuilder.setMessage("GPS is disabled in your device. Would you like to enable it?")
                .setCancelable(false)
                .setPositiveButton("Goto Settings Page To Enable GPS",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Intent callGPSSettingIntent = new Intent(
                                        android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                startActivity(callGPSSettingIntent);
                            }
                        });
        alertDialogBuilder.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = alertDialogBuilder.create();
        alert.show();
    }

}

Logcat 显示 java.lang.SecurityException的问题:“网络”位置提供程序需要ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限。

04-30 14:42:43.089 13948-13948/com.example.user.educationhunt W/System.err: java.lang.SecurityException: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.
04-30 14:42:43.089 13948-13948/com.example.user.educationhunt W/System.err:     at android.os.Parcel.readException(Parcel.java:1620)
04-30 14:42:43.089 13948-13948/com.example.user.educationhunt W/System.err:     at android.os.Parcel.readException(Parcel.java:1573)
04-30 14:42:43.089 13948-13948/com.example.user.educationhunt W/System.err:     at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:606)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:880)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:464)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at com.example.user.educationhunt.pojos.GpsLocation.getLocation(GpsLocation.java:74)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at com.example.user.educationhunt.pojos.GpsLocation.<init>(GpsLocation.java:55)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at com.example.user.educationhunt.fragment.NearMe.onCreateView(NearMe.java:128)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.os.Handler.handleCallback(Handler.java:746)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.os.Looper.loop(Looper.java:148)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5443)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
04-30 14:42:43.090 13948-13948/com.example.user.educationhunt W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

0 个答案:

没有答案