- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一款需要用户提供多项权限(位置、外部存储、相机和手机状态)的应用程序,如果我一个接一个地提出请求,当我运行应用程序,这是一个问题:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//ask for the location permission
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 123);
}
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//ask for the location permission
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
PERMISSION_EXTERNAL, REQUEST_EXTERNAL_STORAGE);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_PHONE_STATE);
}
有多个测试来创建一个字符串,其中包含所有需要的权限请求,这很烦人,我尝试只请求权限而不测试它们是否被授予 checkSelfPermision 方法:
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE}, REQUEST_MULTIPLE);
它起作用了,它一个接一个地堆叠所有不同的请求,如果我重新运行该应用程序,它不会再次询问,因为权限已被授予,如果我手动删除其中一个权限,该应用程序只会询问对于我删除的那个。
因此,如果在不使用 checkSelfPermission 进行测试的情况下一切正常,那么这个方法有什么用呢?是否存在我错过或不知道的风险?
最佳答案
@Waylan 这里有一个或两个非常有用的链接,我将发布一些代码来帮助您处理用户可以与他们选择的内容进行交互的三种方式中的哪一种。即首先拒绝允许和不再询问链接
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
//.... write file into storage ...
System.out.println("SDK > BuildVersion TRUE");
} else {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 666); // Comment 26
System.out.println("go to requestPermissions");
}
}
onLoad();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 666: // Allowed was selected so Permission granted
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Snackbar s = Snackbar.make(findViewById(android.R.id.content),"Permission Granted",Snackbar.LENGTH_LONG);
View snackbarView = s.getView();
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.RED);
textView.setTextSize(18);
textView.setMaxLines(6);
s.show();
// do your work here
} else if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) {
// User selected the Never Ask Again Option Change settings in app settings manually
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Change Permissions in Settings");
alertDialogBuilder
.setMessage("" +
"\nClick SETTINGS to Manually Set\n"+"Permissions to use Database Storage")
.setCancelable(false)
.setPositiveButton("SETTINGS", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 1000); // Comment 3.
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
} else {
// User selected Deny Dialog to EXIT App ==> OR <== RETRY to have a second chance to Allow Permissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Second Chance");
alertDialogBuilder
.setMessage("Click RETRY to Set Permissions to Allow\n\n"+"Click EXIT to the Close App")
.setCancelable(false)
.setPositiveButton("RETRY", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Integer.parseInt(WRITE_EXTERNAL_STORAGE));
Intent i = new Intent(MainActivity.this,MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
})
.setNegativeButton("EXIT", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
break;
}};
关于android - 在 Android 中使用 checkSelfPermission?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46301102/
我的问题是我不确定使用什么字符串键来检查通知权限。对于关键 "com.google.android.c2dm.permission.RECEIVE" 此代码始终返回 true,即使我从我的 list
我正在尝试运行 Android 示例 camera2basic。有一种调用 checkSelfPermission 的方法需要 API 级别 23,但我在只支持 API 级别 21 的手机上运行。ch
我在下面的代码中收到错误: if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)
我正在尝试让我的应用为 Android 6 做好准备,但现在我遇到了需要请求和检查权限的问题。 我尝试了文档中的以下内容: int permissionCheck = ContextCompat.ch
我的客户要求测试他们的 APK。我在我的 Android 6 和 Android 4 上安装了那个应用程序。但是它在启动时崩溃了。 错误 java.lang.NoSuchMethodError: an
是否可以运行 Google Sample - RuntimePermissionsBasic 在操作系统低于 MNC (Android M) 的设备上? 这个项目附带: compileSdkVersi
我有使用的应用程序 它在 Android 6.0 上自动授予,但我可以在设置中撤销它。想要检查它是否被授予以防用户撤销它,所以我这样做: int permissionCheck = ContextC
目前我有以下方法来检查 Marshmallow 的 AppCompatActivity 中的运行时权限: if(Build.VERSION.SDK_INT > Build.VERSION_CODES.
我有一个 Android 应用程序,我想检查相机权限。但是,即使我将其关闭(在模拟器或真实设备的应用程序设置中),结果始终为 0(GRANTED)。我用的模拟器和真机是SDK 23,Android M
我正在尝试使运行时权限向后兼容旧设备,但使用支持库我无法在 ContextCompat 类中找到 checkSelfPermission() 静态调用,但其记录为 here 这是我的项目 gradle
我正在开发一款需要用户提供多项权限(位置、外部存储、相机和手机状态)的应用程序,如果我一个接一个地提出请求,当我运行应用程序,这是一个问题: if (ActivityCompat.checkSelfP
在我的 android 应用程序(minSdkVersion 15)中,我必须创建目录并将文件写入其中。在我的 AppManifest 中,我正在使用: 在创建目录或文件之前,我正在检查是否允许或
我明白为什么 Android Studio 显示 MissingPermission警告。 Call requires permission which may be rejected by user
因此,我现在已经在这里坐了 4 个小时,对为什么我的 2 台设备行为不端而摸不着头脑。 问题是,即使授予了权限, checkSelfPermission 也会返回 false! 我 100% 确定这不
当按下 ListView 中的通话按钮时,我正在检查电话通话权限。由于某种原因,我在 checkSelfPermission() 方法中作为参数传递的 Context 导致了空指针异常。我使用过 th
这可能是一个非常愚蠢的问题。 我有一个几年前使用 Eclipse 编写的应用程序,适用于 Android OS 8 (2.3.x)。我正在尝试将其带入现代世界(仍然使用 8 构建,但目标是 28),并
我已经发布了我的 Android 应用程序,但我看到用户出现很多以下错误。我无法每次在模拟器上自己重现该问题,因此我很难自己调试它。 当用户在后台运行一段时间后打开我的应用程序时,似乎会发生这种情况。
我想知道下面代码中的 this 关键字指的是什么(代码块是请求访问用户位置的权限)。 class RequiresLocation : AppCompatActivity() { overri
我在检查权限时遇到问题,在 6.0 中总是说 nullpointer 我的调试: 我做错了什么 public String getGeolocation(Context context){ t
嗨,我在 Eclipse 中有一个旧项目,当我尝试像这样检查SelfPermission时: ContextCompat.checkSelfPermission(this, Manifest.per
我是一名优秀的程序员,十分优秀!