如何判断android用户拒绝了某项权限?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断android用户拒绝了某项权限?相关的知识,希望对你有一定的参考价值。

例如,当使用照相机的时候,会弹出开启照相机的权限请求界面,如何能知道用户拒绝了权限,至于什么camera是否为null或者异常的判断等没经过亲测的方法就不要回答了,求有用的方法。
有人说通过反射去判断Camera中的某些字段,比如mNativeContext,如果有知道如何判断这些字段的大神,求提供方法,我的积分就这些,无法提供更高的奖励了,见谅!

android框架包含了对各种Camera以及其上可用的Camera功能的支持,它允许你在应用程序中抓拍照片和视频。
注意事项
在开启应用程序使用Android设备上的Camera功能之前,要考虑一些打算如何使用这些硬件功能的问题:
1. Camera需求:要考虑应用程序是否必须要运行在有Camera的设备上,如果必须,就要在应用程序的清单中声明Camera需求;
2. 快照或定制Camera:应用程序准备如何使用Camera?是只对抓拍或视频剪辑感兴趣?还是要应用程序提供使用Camera的新方法?对于抓拍或剪辑,要考虑使用既存的Camera应用程序。对于开发定制化的Camera功能,请看下文的“构建Camera应用程序”
基础
Android框架通过Camera API或Camera Intent来支持拍照和录像,以下是相关的类:
Camera
这个类是控制设备Camera的主API。在构建一个Camera应用程序时,它被用于拍照或录像。
SurfaceView
这个类用于向用户实时的展现Camera的预览。
MediaRecorder
这个类用于记录来自Camera的视频
Intent
MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.ACTION_VIDEO_CAPTURE类型的Intent动作被用于不直接使用Camera对象来拍照或录像。
清单声明
在开始使用Camera API开发应用程序之前,要确保清单文件已经有了适当的声明,以允许使用Camera硬件和其他相关的功能。
1. Camera权限:应用程序必须申请使用设备Camera的权限。
<uses-permissionandroid:name="android.permission.CAMERA"/>
注意:如果通过Intent来使用Camera,应用程序就不需要申请这个权限。
2. Camera功能:应用程序还必须要声明打算使用的Camera功能,例如:
<uses-featureandroid:name="android.hardware.camera"/>
把Camera功能添加到应用程序的清单中,会让Google Play防止把程序安装到不包含Camera或不支持你所需要的Camera功能的设备上。关于如何使用基于功能过滤的Google Play,请看Google Play和基于功能的过滤
如果应用程序能够使用Camera或正确的操作Camera功能,但却不需要它,那么就应该在清单中指定android:required属性,并把属性值设置为false:
<uses-feature android:name="android.hardware.camera" android:required="false" />

3. 存储权限:如果应用程序要把图片或视频保存到设备的外部存储器上(如SD卡),就必须在清单中指定这个权限:
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

4. 音频录音权限:对于视频采集的音频录音,应用程序必须要申请音频采集权限:
<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>

5. 位置定位权限:如果应用程序要给图片标记GPS位置信息,就必须申请位置定位权限:
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
关于获得用户位置的更多信息,请看“定位策略”
使用既存的Camera应用
在应用程序中不需要太多的额外代码就可以快速的开启拍照或录像的方法是:使用Intent来调用一个既存的Android Camera应用程序。一个Camera Intent能够通过既存的Camera应用程序和它返回给应用程序的播放控制来申请采集一张照片或一段视频。本节会向你展示如何使用这项技术来采集一张图片或一段视频。
调用Camera Intent的过程会遵循以下这些大概的步骤:
1. 编写一个Camera Intent:创建一个申请图片或视频的Intent对象,使用以下Intent类型之一:
MediaStore.ACTION_IMAGE_CAPTURE:从一个既存的Camera应用中申请图片功能的Intent动作类型;
MediaStore.ACTION_VIDEO_CAPTURE:从一个既存的Camera应用中申请视频功能的Intent动作类型。
2. 启动Camera的Intent:使用startActivityForResult()方法来执行Camera的Intent。Intent启动后,该Camera应用程序的用户界面会显示在屏幕上,并且用户能够拍照或录像;
3. 接收Intent的结果:在你的应用程序中建立一个onActivityResult()方法来接收来自Camera Intent的回调和数据。当用户完成成拍照或录像(或者是取消操作),系统会调用这个方法。
图像采集Intent
使用Camera Intent来采集图像是你的应用程序用最少的代码来拍照的快捷方式。一个图片采集Intent能够包含以下额外的信息:
MediaStore.EXTRA_OUTPUT:这个设置需要一个指定了保存图片路径和文件名的Uri对象。这个设置是可选,但强烈推荐使用。如果不指定这个值,Camera应用程序会用默认的名称把采集到的图片保存到默认的位置,这些默认值在Intent.getData()方法的返回字段中指定。
以下示例演示了如何构建一个图片采集Intent,并执行它。示例中GetOutputMediaFileUri()方法引用了下面“保存媒体文件”一节中的示例代码:
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;

@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

startActivityResult()方法执行完成后,用户就会看到Camera应用程序的界面。用户完成拍照(或取消操作)之后,用户界面就会返回到你的应用程序中,并且你必须监听onActivityResult()方法来接收Intent的结果,并继续你的应用程序的执行。
视频采集Intent
使用Camera Intent采集视频是让你的应用程序能够用最少的代码来录像的一中快捷方式。视频采集Intent能够包含以下额外信息:
MediaStore.EXTRA_OUTPUT:这个设置要求用一个URI来指定保存视频的路径和文件名。虽然它是可选的,但强烈推荐使用这个设置。如果没有指定这个设置,那么Camera应用程序会把采集到的视频用默认的名称保存到默认的位置,默认的设置是在Intent的Intent.getData()方法域中返回的。
MediaStore.EXTRA_VIDEO_QUALITY:这个值的范围是0~1,0的时候质量最差且文件最小,1的时候质量最高且文件最大。
MediaStore.EXTRA_DURATION_LIMIT:这个值以秒为单位,显示视频采集的时长。
MediaStore.EXTRA_SIZE_LIMIT:这个值以字节为单位,限制视频采集的文件大小。
下面的示例演示了如何构造一个视频采集的Intent,并执行它。这个例子中的getOutputMediaFileUri()方法引用了下文的“保存媒体文件”中的示例代码:
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;

@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high

// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);

当startActivityForResult()方法被执行时,用户就会看到一个可编辑的Camera应用程序界面。在用户完成录像(或取消操作)之后,该用户界面就会返回到你的应用程序中,并且你必须监听onActivityResult()方法来接收Intent的结果,并继续执行你的应用程序。
接收Camera Intent结果
一旦你构建并执行了一个图片或视频的Camera Intent,那么就必须要配置你应用程序来接收Intent的结果。本节向你展示了如何监听来自Camera Intent的回调,以便应用程序能够对采集到的图片或视频做进一步的处理。
为了接收Intent的结果,必须在启动Intent的那个Activity中重写onActivityResult()方法。下面的示例演示了如何重写onActivityResult()方法来采集图片Camera Intent或视频Camera Intent的返回结果:
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
if (resultCode == RESULT_OK)
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
else if (resultCode == RESULT_CANCELED)
// User cancelled the image capture
else
// Image capture failed, advise user



if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE)
if (resultCode == RESULT_OK)
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
else if (resultCode == RESULT_CANCELED)
// User cancelled the video capture
else
// Video capture failed, advise user



一旦Activity接收到一个成功的结果,那么你的应用程序就可以访问指定位置中的被采集的图片或视频。追问

谢谢你的回答,但是不是我要的答案,没看过底层就不要回答了。

追答

不知道你说的权限是哪一类的,如果是平常ROOT后的,那就不必要看底层啊。

参考技术A Android4.0以后,可以在设置,应用中心,打开应用看到应用申请的权限,打叉的是拒绝的权限,需要说明的是:
1、不同手机,查看权限管理的地方可能不一样,因为Android手机众多不能一一列举,建议可以百度查找相应的方法。
2、下载LBE或者360安全管家,可以直接查看到权限控制,只是在4.0之前可能没办法直接更改,需要root才能更改,4.0之后不需要root。
参考技术B android在开发中有时候要判断应用中是否有某项权限,或者想获取到某个应用的权限清单,可以使用以下方法:
1) 判断应用是否具有某个权限:
PackageManager pm = getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED ==
pm.checkPermission("android.permission.RECORD_AUDIO", "packageName"));
if (permission)
showToast("有这个权限");
else
showToast("木有这个权限");

2)获取某个应用的权限清单:
try
PackageInfo pack = pm.getPackageInfo("packageName",PackageManager.GET_PERMISSIONS);</span>
String[] permissionStrings = pack.requestedPermissions;
showToast("权限清单--->" + permissionStrings.toString());
catch (NameNotFoundException e)
e.printStackTrace();

如何拒绝项目管理员管理用户权限的权限?

【中文标题】如何拒绝项目管理员管理用户权限的权限?【英文标题】:How to deny Project Admins permission to manage user rights? 【发布时间】:2021-04-12 17:20:47 【问题描述】:

这样他就保留了 Project 中的所有 Admin 权限,但不能再在 Project 中添加或删除用户。

在 Web 门户中,项目管理员组的所有权限均显示为灰色。尽管我是项目集合管理员。

我发现了一个类似的问题:Prevent project admin from adding new user to project and organization in Azure DevOps? 但该答案仅表明您不应该让用户成为 Project Administrators 组的成员,而不是如何授予用户除管理用户权限之外的所有项目管理员权限。


编辑 13-04-2021

根据Hugh Lin - MSFT的回答,您不能从Project Administrators组中剥夺管理用户的权限,您必须创建一个新组。 但是,您如何赋予该新组项目管理员的其他权利(在这张图片上加下划线)?

您可以看到项目管理员组在很多地方都被使用(在很多object-level 权限下),新组如何在所有这些地方获得相同的权限?

【问题讨论】:

【参考方案1】:

项目管理员被授予all project-level permissions,拥有项目的最高权限。您不能更改 Project Administrators 组的权限设置。这是设计使然。

这在official document 中有说明。

因此,如果您不希望项目管理员中的用户管理用户权限。您需要从 Project Administrators 组中删除此用户。将用户添加到新的项目组并授予所有权限,将所有权限设置为Allow

在新创建的自定义组中,我们只能分配列表中给定的权限。无法授予项目管理员组专有的某些权限。

【讨论】:

谢谢。因此,如果我们创建一个新组,比如自定义项目管理员,并让用户成为该组的成员,那么该用户可以执行默认项目管理员组可以执行的所有操作,但管理用户除外,或者还有更多用户无法执行的操作再长点呢?而且我看到很多地方都使用了 Project Administrators 组,新组如何在所有这些地方获得相同的权限?另请参阅我的问题中的修改。 在新建的自定义组中,我们只能分配given in the list的权限。无法授予项目管理员组专有的某些权限。 好的,明白了。所以它不是更精细的调整。我的问题源于我们不希望 Azure AD 中的用户能够在未经注册批准的情况下添加到我们的 Azure DevOps 项目的愿望(或要求)。由于 Azure DevOps 目前是结构化的,因此项目的管理相当分散。如果没有项目管理员角色的用户,您将错过很多去中心化。 但也许我们可以使用/滥用预览功能“限制用户对特定项目的可见性和协作”,以确保项目管理员无法再添加 new 用户,如果他也被添加到Project-Scoped Users 组中。这样的配置有什么缺点吗? 确实不能完全满足你的需求。您可以在我们的 UserVoice 网站上添加您对该功能的请求,这是我们产品建议的主要论坛。

以上是关于如何判断android用户拒绝了某项权限?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 文件提供者 - 权限拒绝

如何在 Android 11 中检测权限的永久拒绝?

[android开发篇]自定义权限

如何检测权限对话框被用户拒绝

如何更改文件权限

怎么修改文件夹权限