Android - 相机权限在没有提示的情况下被拒绝
Android - Camera permissions denied without prompting
我 运行 遇到了请求权限背后的手动过程的问题(一直陷入 'denied' 代码),所以我转而使用 Dexter 来简化。我在 onCreate() 中实现了以下代码,并重新安装了该应用程序:
Dexter.withActivity(this)
.withPermission(Manifest.permission.CAMERA)
.withListener(new PermissionListener() {
@Override public void onPermissionGranted(PermissionGrantedResponse response) {
Log.d(TAG, "GRANTED!");
initCamera();
}
@Override public void onPermissionDenied(PermissionDeniedResponse response) {
Log.d(TAG, "DENIED!");
}
@Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
Log.d(TAG, "PERMISSION RATIONAL SHOULD BE SHOWN!");
}
}).check();
它立即落入"DENIED!"日志,它甚至都不提示我。我尝试了这个特定的代码来尝试多个权限(这最终是我需要做的):
Dexter.withActivity(activity)
.withPermissions(Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
Log.d(TAG, "Accepted: " + report.getGrantedPermissionResponses().size() + " | Denied: " + report.getDeniedPermissionResponses().get(0).getPermissionName());
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
Log.d(TAG, "continuing permissions request..");
token.continuePermissionRequest();
}
})
.check();
它会提示录制音频的权限,然后会询问设备上 photos/media/files 的访问权限(它从不询问相机)。一旦完成,它会打印日志:"Accepted 3 | Denied: android.permission.CAMERA"。它甚至没有再次提示我就否认了。
我的 Manifest 已正确设置,以便在正确的位置(在 'application' 标签之外)放置 CAMERA。参考如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app">
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
etc..
奇怪的是,当我进入“设置”>“应用程序”>“我的应用”时,相机选项甚至都没有显示。
我认为这不是 Dexter 的问题,因为当我手动设置它时,它基本上做同样的事情(并且我确认在查看一些顶部后它在这种情况下确实设置正确 S.O. 帖子).
对这里可能出现的问题有什么想法吗?仅供参考 - 我使用的是 Galaxy S6,OS 6.0.2。遇到此问题的其他用户似乎是其他 6.0+ OS 的设备。提前致谢!
编辑:
测试各种设备,它适用于某些设备,但不适用于某些设备:
- Moto X(OS 5.0)- 损坏
- Nexus 5 (OS 7.0) - 有效
- 三星 S6 (OS 6.0.1) - 损坏
- 损坏的 Moto X(OS 6.0)- 正常
似乎不是一个固定的模式。绝对是 st运行ge。我还启动了一个 b运行d 新项目和 运行 相同的代码 - 工作正常并允许访问我的相机。所以它似乎不是完全特定于设备的..
您需要的是本机运行时权限而不是 dexter,从 Android 6.0(API 级别 23)开始,用户在应用 运行 时向应用授予权限,而不是他们安装应用程序。这种方法简化了应用程序安装过程,因为用户在安装或更新应用程序时不需要授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择授予相机应用访问相机但不访问设备位置的权限。用户可以随时通过转到应用程序的“设置”屏幕撤销权限。
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.YOUR_PERMISSION);
then what you need is to request a certain permission if that check is false,
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.YOUR_PERMISSION},
MY_PERMISSION_CODE);
请注意,您还需要根据您已经展示的内容在清单中声明它们。 For more information.
这个问题原来是第三方库,它在他们的清单中有这一行,覆盖了我们自己的许可:
<uses-permission android:name="android.permission.CAMERA" tools:node="remove" />
解决方案是手动将他们的项目作为模块导入(而不是使用 gradle),然后注释掉该行,或者更简单 - 您可以添加 "tools:node="replace""到主项目的 CAMERA 许可行的末尾,之后它工作正常;后一种方法不需要导入项目。
我 运行 遇到了请求权限背后的手动过程的问题(一直陷入 'denied' 代码),所以我转而使用 Dexter 来简化。我在 onCreate() 中实现了以下代码,并重新安装了该应用程序:
Dexter.withActivity(this)
.withPermission(Manifest.permission.CAMERA)
.withListener(new PermissionListener() {
@Override public void onPermissionGranted(PermissionGrantedResponse response) {
Log.d(TAG, "GRANTED!");
initCamera();
}
@Override public void onPermissionDenied(PermissionDeniedResponse response) {
Log.d(TAG, "DENIED!");
}
@Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
Log.d(TAG, "PERMISSION RATIONAL SHOULD BE SHOWN!");
}
}).check();
它立即落入"DENIED!"日志,它甚至都不提示我。我尝试了这个特定的代码来尝试多个权限(这最终是我需要做的):
Dexter.withActivity(activity)
.withPermissions(Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
Log.d(TAG, "Accepted: " + report.getGrantedPermissionResponses().size() + " | Denied: " + report.getDeniedPermissionResponses().get(0).getPermissionName());
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
Log.d(TAG, "continuing permissions request..");
token.continuePermissionRequest();
}
})
.check();
它会提示录制音频的权限,然后会询问设备上 photos/media/files 的访问权限(它从不询问相机)。一旦完成,它会打印日志:"Accepted 3 | Denied: android.permission.CAMERA"。它甚至没有再次提示我就否认了。
我的 Manifest 已正确设置,以便在正确的位置(在 'application' 标签之外)放置 CAMERA。参考如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app">
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
etc..
奇怪的是,当我进入“设置”>“应用程序”>“我的应用”时,相机选项甚至都没有显示。
我认为这不是 Dexter 的问题,因为当我手动设置它时,它基本上做同样的事情(并且我确认在查看一些顶部后它在这种情况下确实设置正确 S.O. 帖子).
对这里可能出现的问题有什么想法吗?仅供参考 - 我使用的是 Galaxy S6,OS 6.0.2。遇到此问题的其他用户似乎是其他 6.0+ OS 的设备。提前致谢!
编辑: 测试各种设备,它适用于某些设备,但不适用于某些设备:
- Moto X(OS 5.0)- 损坏
- Nexus 5 (OS 7.0) - 有效
- 三星 S6 (OS 6.0.1) - 损坏
- 损坏的 Moto X(OS 6.0)- 正常
似乎不是一个固定的模式。绝对是 st运行ge。我还启动了一个 b运行d 新项目和 运行 相同的代码 - 工作正常并允许访问我的相机。所以它似乎不是完全特定于设备的..
您需要的是本机运行时权限而不是 dexter,从 Android 6.0(API 级别 23)开始,用户在应用 运行 时向应用授予权限,而不是他们安装应用程序。这种方法简化了应用程序安装过程,因为用户在安装或更新应用程序时不需要授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择授予相机应用访问相机但不访问设备位置的权限。用户可以随时通过转到应用程序的“设置”屏幕撤销权限。
// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.YOUR_PERMISSION);
then what you need is to request a certain permission if that check is false,
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.YOUR_PERMISSION},
MY_PERMISSION_CODE);
请注意,您还需要根据您已经展示的内容在清单中声明它们。 For more information.
这个问题原来是第三方库,它在他们的清单中有这一行,覆盖了我们自己的许可:
<uses-permission android:name="android.permission.CAMERA" tools:node="remove" />
解决方案是手动将他们的项目作为模块导入(而不是使用 gradle),然后注释掉该行,或者更简单 - 您可以添加 "tools:node="replace""到主项目的 CAMERA 许可行的末尾,之后它工作正常;后一种方法不需要导入项目。