如何获得在Android中获取GPS位置的权限

问题描述

我是Android的新手,在我当前的项目中,我正在尝试使用GPS检索位置。获取位置的代码位于单独的非活动类中,因为我显示坐标的片段被塞满了。

我尝试使用来自developer.android.com的指南,但没有得到任何权限提示,并且当我按片段中的按钮时,我仅获得了默认的纬度和经度0值。 / p>

我已在清单中提供了权限:

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

GPS定位器类:

public class LocationProvider implements ActivityCompat.OnRequestPermissionsResultCallback {
    private static final int PERMISSION_REQUEST_LOCATION = 1;
    private Activity activity;

    Location gps_loc;
    Location final_loc;
    double longitude;
    double latitude;
    private LocationManager locationManager;

    public LocationProvider(Activity activity) {
        this.activity =activity;
        locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_LOCATION) {
            // Request for permission.
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getLocation();
            } else {
                requestLocationPermission();
            }
        }
    }

    private void getLocation() {
        // Check if the permission has been granted
        if (ActivityCompat.checkSelfPermission(activity,Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            gps_loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (gps_loc != null) {
                Log.v("Loc_provider",gps_loc.toString());
                final_loc = gps_loc;
                latitude = final_loc.getLatitude();
                longitude = final_loc.getLongitude();
            }
        } else {
            requestLocationPermission();
        }
    }


    private void requestLocationPermission() {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSION_REQUEST_LOCATION);
        }


    public String getCoordinates() {
        return latitude + " "+ longitude;
    }
}

片段中的代码:

FloatingActionButton fab=view.findViewById(R.id.floatingActionButton);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                locProvider=new LocationProvider(requireActivity());
                gpsCoordinates.setText(locProvider.getCoordinates());
            }
        });

最欢迎提供修复代码的提示和解决方案。

更新1: 我改为将代码移到片段中,使其如下所示:

fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!checkIfAlreadyhavePermission()) {
                    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
                } else {
                    gps_loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    gpsCoordinates.setText(getCoordinates());
                    }
                }
        });

private String getCoordinates() {
        if (gps_loc != null) {
            Log.v("Loc_provider",gps_loc.toString());
            final_loc = gps_loc;
            latitude = gps_loc.getLatitude();
            longitude = gps_loc.getLongitude();
        }
        return latitude + " " + longitude;
    }

    private boolean checkIfAlreadyhavePermission() {
        int result = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_FINE_LOCATION);
        return result == PackageManager.PERMISSION_GRANTED;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,@NonNull int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_LOCATION: {
                // If request is cancelled,the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //Log.v("Grant_Results",String.valueOf(grantResults[0]));
                    Toast.makeText(getActivity(),"permission granted",Toast.LENGTH_LONG).show();
                    gpsCoordinates.setText(getCoordinates());
                    } else {
                       Toast.makeText(getActivity(),"permission denied",Toast.LENGTH_LONG).show();
                    }
                break;
                }
            }
    }

我现在得到权限提示,但是位置仍然没有更新(我得到0)。

解决方法

请注意:

  1. 不建议保存一个Activity对象,这可能会导致内存泄漏。活动可能会被破坏并重新创建(例如,当屏幕方向更改时)。保留对旧活动的引用会给您带来麻烦。

  2. 实现ActivityCompat.OnRequestPermissionsResultCallback接口无济于事。您的方法将永远不会被调用。您将必须在活动中明确调用它。

  3. 您尚未请求权限,因此将不会显示您的权限提示,并且将返回double的默认值0。您需要调用getLocation()方法,以使控件位于else块上并显示您的权限提示

我建议您处理活动中的权限。让活动获取该位置的坐标。您可以使活动使用方法LocationFetcher实现一个名为getCoordinates()的接口。然后,您可以像这样在片段中调用它:

LocationFetcher locationFetcher = (LocationFetcher) activity;
gpsCoordinates.setText(locationFetcher.getCoordinates());
,

通过在Fragment中实现LocationListener然后添加

来解决
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,400,1,this);

在onRequestPermissionsResult()中。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...