如何在 Android 上检查用户是否在运行时授予了权限?
How to check if permission is granted by user at runtime on Android?
我创建了一个简单的 android activity 作为表盘。
它有 phone 号码的编辑文本和呼叫按钮
这是代码:(android 6.0 棉花糖)
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){
}
}
});
}
}
当我 运行 我的应用程序时,我遇到了这些问题
如果我点击调用按钮并授予权限,则在我再次点击之前不会调用意图
我不知道如何检查权限是否被授予
使用onRequestPermissionResult,如果用户按下ALLOW和DENY,它会处理动作,只需在条件[=19=中调用意图]:
@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;
}
}
}
希望对您有所帮助。
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
检查权限结果的逻辑很糟糕,我不知道为什么Google实现了这么糟糕的代码。
这是一团糟,尤其是当您检查多个权限时。假设你要求
CAMERA
、ACCESS_FINE_LOCATION
和 ACCESS_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
方法中。
我创建了一个简单的 android activity 作为表盘。 它有 phone 号码的编辑文本和呼叫按钮 这是代码:(android 6.0 棉花糖)
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){
}
}
});
}
}
当我 运行 我的应用程序时,我遇到了这些问题
如果我点击调用按钮并授予权限,则在我再次点击之前不会调用意图
我不知道如何检查权限是否被授予
使用onRequestPermissionResult,如果用户按下ALLOW和DENY,它会处理动作,只需在条件[=19=中调用意图]:
@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;
}
}
}
希望对您有所帮助。
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
检查权限结果的逻辑很糟糕,我不知道为什么Google实现了这么糟糕的代码。
这是一团糟,尤其是当您检查多个权限时。假设你要求
CAMERA
、ACCESS_FINE_LOCATION
和 ACCESS_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
方法中。