java - 如何在 android fragment 中处理位置权限

标签 java android android-fragments android-permissions

我正在创建一个应用程序,我无法在其中处理 fragment 中位置的权限。方法

public void onRequestPermissionsResult(int requestCode String permissions[], int[] grantResults){}

在 fragment 中不起作用。所以请帮助我如何处理权限 DENYALLOW 这是我的代码...

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

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        checkLocationPermission();
    }

    return v;
}



public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
public boolean checkLocationPermission(){
    if (ContextCompat.checkSelfPermission(getActivity(),
            Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        // Asking user if explanation is needed
        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                Manifest.permission.ACCESS_FINE_LOCATION)) {


            //Prompt the user once explanation has been shown
            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_LOCATION);


        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_LOCATION);
        }
        return false;
    } else {
        return true;
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // Permission was granted.
                if (ActivityCompat.checkSelfPermission(getActivity(),
                        Manifest.permission.ACCESS_FINE_LOCATION)
                        == PackageManager.PERMISSION_GRANTED) {


                }

            } else {

                // Permission denied, Disable the functionality that depends on this permission.
                Toast.makeText(getActivity(), "permission denied", Toast.LENGTH_LONG).show();
            }
            return;
        }

    }
}

}

请帮助我如何处理 fragment 中的两个权限。

谢谢..

最佳答案

据我所知,你应该使用这个 PermissionsDispatcher请求运行时权限。您只需要在您的 Fragment 中定义回调函数,如下所示:

@NeedsPermission(Manifest.permission. ACCESS_FINE_LOCATION)
void showCamera() {
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
            .addToBackStack("camera")
            .commitAllowingStateLoss();
}

@OnShowRationale(Manifest.permission. ACCESS_FINE_LOCATION)
void showRationaleForCamera(final PermissionRequest request) {
    new AlertDialog.Builder(this)
        .setMessage(R.string.permission_camera_rationale)
        .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())
        .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())
        .show();
}

@OnPermissionDenied(Manifest.permission. ACCESS_FINE_LOCATION)
void showDeniedForCamera() {
    Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();
}

@OnNeverAskAgain(Manifest.permission. ACCESS_FINE_LOCATION)
void showNeverAskForCamera() {
    Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();
}

然后使用auto-gen方式请求权限:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button_camera).setOnClickListener(v -> {
      // NOTE: delegate the permission handling to generated method
      MainActivityPermissionsDispatcher.showCameraWithCheck(this);
    });
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // NOTE: delegate the permission handling to generated method
    MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}

您应该仔细阅读库以获取更多详细信息。

关于java - 如何在 android fragment 中处理位置权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065841/

相关文章:

java - 完成加载监听器上的 WebView loadDataWithBaseURL

java - 如何重置卡牌堆或获取上一张卡?

java - Android fragment 实现问题

java - 为什么这段java代码显示错误?

java - 高性能应用程序中的 C/C++ 与 Java/C#

Java Spring boot 2.0.5 MultipartFile上传 "Content type not supported"

java - 保存实例以避免在选项卡之间切换时丢失数据

java - 当小时和分钟变量低于零时,moveForward(lostTime) 应如何给出正确的输出?

java - 如何取消AsyncTask中的doInBackground

android - 如何创建怯场插件