【问题标题】:How to check if permission is granted by user at runtime on Android?如何检查用户在Android运行时是否授予权限?
【发布时间】:2017-03-13 11:17:13
【问题描述】:

我创建了一个简单的 android 活动,它充当拨号盘。 它有一个电话号码的编辑文本和一个呼叫按钮 这是代码:(android 6.0 marshmallow)

public class Main2Activity extends AppCompatActivity {
EditText num;
Button call;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    num = (EditText) findViewById(R.id.num);
    call = (Button) findViewById(R.id.call);
    call.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                // request permission if not granted
                if (ActivityCompat.checkSelfPermission(Main2Activity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(Main2Activity.this, new String[]{Manifest.permission.CALL_PHONE}, 123);
                    // i suppose that the user has granted the permission
                    Intent in = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + num.getText().toString()));
                    startActivity(in);
                 // if the permission is granted then ok
                } else {
                    Intent in = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + num.getText().toString()));
                    startActivity(in);
                }
            }
            // catch the exception if I try to make a call and the permission is not granted
            catch (Exception e){
            }
        }
    });
}

}

当我运行我的应用程序时,我遇到了这些问题

  • 如果我单击调用按钮并授予权限,则在我再次单击之前不会调用意图

  • 我不知道如何检查权限是否被授予

【问题讨论】:

标签: android permissions runtime grant


【解决方案1】:

使用onRequestPermissionResult,如果用户按下ALLOWDENY,它会处理动作,只需在“如果用户按下允许”的条件下调用意图:

@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 123: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                   //If user presses allow
                   Toast.makeText(Main2Activity.this, "Permission granted!", Toast.LENGTH_SHORT).show();
                   Intent in = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + num.getText().toString()));
                startActivity(in);
                } else {
                   //If user presses deny
                   Toast.makeText(Main2Activity.this, "Permission denied", Toast.LENGTH_SHORT).show();
                }
                break;
            }
        }
    }

希望这会有所帮助。

【讨论】:

  • 我试过了,但是当我拒绝权限时,toast 没有显示
  • 现在请检查。
  • 如果有超过1个权限,你必须从permissions参数中找到索引并将其用于grantResults
【解决方案2】:

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 是检查权限结果的糟糕逻辑,我不知道 Google 为什么要实现如此糟糕的代码。

尤其是当您检查多个权限时,这会很混乱。假设你要求 CAMERAACCESS_FINE_LOCATIONACCESS_NETWORK_STATE

您需要检查 ACCESS_FINE_LOCATION 但用户仅在第一次运行时授予 CAMERA 并且您检查 grantResults[1] 但在第二次运行时 ACCESS_FINE_LOCATION 成为索引为 0 的权限。我遇到了很多问题,用户没有一次授予所有权限.

你应该使用

   int size = permissions.length;
    boolean locationPermissionGranted = false;

    for (int i = 0; i < size; i++) {
        if (permissions[i].equals(Manifest.permission.ACCESS_FINE_LOCATION)
                && grantResults[i] == PackageManager.PERMISSION_GRANTED) {
            locationPermissionGranted = true;
        }
    }

或者更简单的

   if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
           // Do something ...
        }

onPermissionRequestResult 方法中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2013-05-17
    相关资源
    最近更新 更多