【问题标题】:Current Location comes as null in android当前位置在 android 中为 null
【发布时间】:2017-03-16 17:08:30
【问题描述】:

当我进入一个屏幕时,我会检查 GPS 是否已打开,如果没有,则会显示启用 GPS 的对话框。当用户单击“是”时,onActivityResult -> GPS 已打开,我尝试获取位置,但这始终返回 null

当我在 GPS 已打开的情况下进入屏幕时,可以正确检索位置。我已经为此苦苦挣扎了几天,似乎找不到任何资源。

请帮助我做错了什么?

 @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.recyler_list, container, false);
        initializeView(view);
         registerGoogleClient()
        return view;

    }

    private void registerGoogleClient() {

     try {
                // Create an instance of GoogleAPIClient.
                if (mGoogleApiClient == null) {
                    mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                            .addConnectionCallbacks(this)
                            .addOnConnectionFailedListener(this)
                            .addApi(LocationServices.API)
                            .build();
                    LocationRequest locationRequest = LocationRequest.create();
                    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
                    builder.addLocationRequest(locationRequest);
                    builder.setAlwaysShow(true);
                    locationSettingsRequest = builder.build();
                    connectGoogleApiClient();
                }

            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

     @Override
        public void onStart() {
            super.onStart();

            try {
                connectGoogleApiClient();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

        private void connectGoogleApiClient() {
            try {
                if (mGoogleApiClient != null) {
                    mGoogleApiClient.connect();
                    checkDeviceGps();
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

      @Override
        public void onStop() {
            super.onStop();
            disConnectGoogleApiClient();
        }

     private void disConnectGoogleApiClient() {

            try {
                if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
                    mGoogleApiClient.disconnect();
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }


        @Override
        public void onConnected(Bundle connectionHint) {

            try {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    System.out.println("if block");

                    if (getActivity().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                            && getActivity().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                        // mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
                    }
                    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
                } else {
                    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
                }

                System.out.println("mLastLocation is====>" + mLastLocation);
                if (mLastLocation != null) {
                    latitude = mLastLocation.getLatitude();
                    longtude = mLastLocation.getLongitude();
                    System.out.println("Latitude====>" + mLastLocation.getLatitude());
                    System.out.println("Longitude====>" + mLastLocation.getLongitude());
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }


        private void checkDeviceGps() {

            try {

                PendingResult<LocationSettingsResult> pendingResult =
                        LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, locationSettingsRequest);
                pendingResult.setResultCallback(this);

            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

        @Override
        public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
            final Status status = locationSettingsResult.getStatus();
            switch (status.getStatusCode()) {

                case LocationSettingsStatusCodes.SUCCESS:
                    break;

                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        status.startResolutionForResult(getActivity(), 100);
                    } catch (IntentSender.SendIntentException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            switch (requestCode) {

                case 100:
                    getLatLong();
                    break;
            }
        }


        private void getLatLong() {

            try {
             if (mLastLocation != null) {
                    latitude = mLastLocation.getLatitude();
                    longtude = mLastLocation.getLongitude();
                    System.out.println("Latitude====>" + mLastLocation.getLatitude());
                    System.out.println("Longitude====>" + mLastLocation.getLongitude());
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

【问题讨论】:

  • 您是否尝试等待几秒钟,例如 20 -30,以便在允许 GPS 后查找数据
  • 我该怎么做,你能用代码解释一下吗?
  • 您需要等待几秒钟才能获取位置。您可以为此使用线程。
  • 是的,我试过了,但是没有用同样的结果

标签: android google-client


【解决方案1】:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                System.out.println("if block");

                if (getActivity().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        && getActivity().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);Log.d("TAG",mLastLocation.getLatitude());


                }

            } else {
                mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            }

尝试此更改,并发布您获得的日志,如果您没有获得日志,则意味着您没有所需的权限,如果您获得日志但没有位置,那么我们可以排除权限问题。但是什么方式你在测试 API 级别吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多