您的位置:首页 > 移动开发 > Android开发

Android运行时权限问题记录

2017-03-25 17:27 267 查看
自从Android6.0使用动态授权以后,我们在开发过程中就要麻烦很多,不仅要在关键时刻判断是否拥有权限,否则出现权限问题导致程序崩溃。至于这些细节我在这里就不再啰嗦了,不清楚的可以去看下几篇别人写的帖子即可,比如这篇http://blog.csdn.net/leejizhou/article/details/51511630。然而我并不想重复这个了,而是记录下在实际使用中遇到的问题。首先说下正常情况吧,还是贴一下正常的处理流程代码:

public void testCall(View view)
{
callPhone();
}

public void callPhone()
{
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) !=
PackageManager.PERMISSION_GRANTED)
{
if (ActivityCompat
.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE))
{

new AlertDialog.Builder(this).setMessage("app需要开启权限才能使用此功能")
.setPositiveButton("设置", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
}).setNegativeButton("取消", null).create().show();
} else
{
ActivityCompat
.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
}
} else
{
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "10086");
intent.setData(data);
startActivityForResult(intent, MY);
}
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults)
{
if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
callPhone();
} else
{
Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE)
{
// Do something after user returned from app settings screen, like showing a Toast.
Toast.makeText(this, R.string.returned_from_app_settings_to_activity,
Toast.LENGTH_SHORT).show();
}
}简单的解释下,在调用callPhone的时候首先检查是否有对应的权限,如果没有则取申请权限并且等待用户点击授权或拒绝,然后根据用户的操作来做下一步,否则直接拨打电话。正常的流程就是这样的,并且在Android模拟器和大部分手机上都是这样的。然而在部分手机上,比如我的HTC D10w上却不是这样的。只有在第一次调用的时候时没有权限,接着自动授权了!!!而真正授权时在startActivityForResult的时候,即在这个时候才会弹出授权对话框,然而这个时候的对话框在上面的onRequestPermissionsResult方法中时监测不到!注意我这里写的是startActivityForResult,然而这个也没什么卵用,虽然被调用了但是无法检测是授权还是拒绝。

至此,我想表达的是这一套运行时权限代码在部分手机(比如我的HTC,还有小米手机)上时无效的,如果用户点了拒绝,程序时没有办法再次开启的,只有用户到设置中开启权限才可以。不过,在执行某些权限(定位)的代码的时候系统会打印异常信息(W级别的),然而我没有找到办法捕获这个异常。希望大神能指点下!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: