Android 检查并请求许可后继续

Android continue after checking and requesting permission

我知道有很多关于检查和请求许可以及处理他们的回复的问题得到了回答,我很清楚这一点。但我有点困惑的是,如果我们正在检查两个不同事物的相同权限,我们如何在授予权限后继续任务?

例如,我有 recycleView,在我的适配器中我有两个按钮的代码,一个用于保存文件,另一个用于保存并打开 activity 以与其他应用程序共享该文件。

MyRecycleAdapter {

Context context:

save.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
           if(checkPermission()) {
               have permission
               save file to disk
          } else {
              requestPermission
               save file to disk
           }  
     }
});
share.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
           if(checkPermission()) {
               have permission
               save file to disk
               open share activity using (context)
          } else {
              requestPermission
               save file to disk
              open share activity using (context)
           }  
     }
});

}

使用不同的请求代码来控制授予权限后发生的事情:

final int SAVE = 1;
final int SAVE_AND_SHARE = 2;

if (ActivityCompat.checkSelfPermission(this,
  Manifest.permission.WRITE_EXTERNAL_STORAGE)
  != PackageManager.PERMISSION_GRANTED
) {
  ActivityCompat.requestPermissions(
    this,
    new String[]{
      android.Manifest.permission.WRITE_EXTERNAL_STORAGE
    },
    [either SAVE or SAVE_AND_SHARE]);
} else {
  //permission is already granted, continue
}


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] 
  grantResults) {
  if (requestCode == SAVE) {
    if (grantResults.length > 0
      && grantResults[0] == PackageManager.PERMISSION_GRANTED
    ) {
      //save
    } else {
      //permission was denied
    }
  } else if (requestCode == SAVE_AND_SHARE) {
    if (grantResults.length > 0
      && grantResults[0] == PackageManager.PERMISSION_GRANTED
    ) {
      //save and share
    } else {
      //permission was denied
    }
  }
}

只是为了完成。最近在 API 中简化了请求权限。以下是我在执行某些操作之前检查权限的方式:

private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Permission callback
    val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
        if (isGranted) {
            // Yay, permission was granted
            doSomething()
        }
        else {
            // Boo, permission was refused
            Snackbar.make(root,"Wut ?! We need your permission!", Snackbar.LENGTH_LONG).show()
        }
    }
}

private fun checkLocationPermissionAndDoSomething() {

    // Do we have the permission ?
    if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        // Permission is not granted. Should we show an explanation?
        if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Explanation is needed. Show dialog
            val builder = AlertDialog.Builder(requireContext())
            builder.setTitle("Please")
            builder.setMessage("We need to use your location because bla blah bla.")
            builder.setPositiveButton(android.R.string.ok) { _, _ ->
                requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
            }
            builder.show()
        }
        else {

            // No explanation needed, we can request the permission.
            requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
        }
    } else {

        // Permission has already been granted
        doSomething()
    }
}

当需要多个权限时,只需使用 ActivityResultContracts.RequestMultiplePermissions 并使用一组权限