棉花糖已经重新设计了获取权限。因此,在调用需要权限的方法之前可以处理权限,它可以正常工作,但是在以下情况下会崩溃:
第1步:打开应用并授予所有必要的权限
第2步:单击“主页”按钮(因此该应用程序处于后台)
步骤3:在“设置”中手动更改权限
步骤4:从多任务启动应用程序,现在由于应用程序上下文无效而崩溃
观察到该应用程序再次被创建,不知道为什么会发生这种情况。欢迎提出任何纠正此问题的建议!
最佳答案
这是因为棉花糖添加了其他功能。您需要在运行时向用户请求。为此,我制作了这个类。然后在需要的地方使用它
public class AppPermission {
public static boolean isMarshmallowPlusDevice() {
return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1;
}
@TargetApi(Build.VERSION_CODES.M)
public static boolean isPermissionRequestRequired(Activity activity, @NonNull String[] permissions, int requestCode) {
if (isMarshmallowPlusDevice() && permissions.length > 0) {
List<String> newPermissionList = new ArrayList<>();
for (String permission : permissions) {
if (PackageManager.PERMISSION_GRANTED != activity.checkSelfPermission(permission)) {
newPermissionList.add(permission);
}
}
if (newPermissionList.size() > 0) {
activity.requestPermissions(newPermissionList.toArray(new String[newPermissionList.size()]), requestCode);
return true;
}
}
return false;
}
}
然后将此代码放在您需要用户许可的位置。
if (!AppPermission.isPermissionRequestRequired(SignInActivity.this, new String[]{"android.permission.GET_ACCOUNTS"},
REQUEST_APP_PERMISSION)) {
// Your code if permission available
}
之后,在您的
Fragment
或Activity
中输入以下代码-@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_APP_PERMISSION:
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
switch (permission) {
case "android.permission.GET_ACCOUNTS":
if (PackageManager.PERMISSION_GRANTED == grantResult) {
// Your code
}
break;
}
}
break;
}
}
上面的代码是对
GET_ACCOUNTS
的请求许可,您可以将其更改为所需的任何内容。关于Android棉花糖: Changing permissions at run time crashes app,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37160465/