我遇到了请求权限的手动过程问题(只是一直陷入'拒绝'代码),所以我转而使用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();
它立即陷入“拒绝!”记录,它甚至从未提示过我。我尝试了这个特定的代码来尝试多个权限(这最终是我需要做的):
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();
它提示录制音频的权限,然后询问有关设备上的照片/媒体/文件的访问权限(它从不询问相机)。然后,一旦完成,它会打印日志:“Accepted 3 | Denied:android.permission.CAMERA”。它甚至没有再提示我就否认了它。
我的Manifest已正确设置为将CAMERA放在适当的位置('application'标签之外)。见下文参考:
<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..
奇怪的是,当我进入设置&gt;应用程序&gt; MyApp,Camera选项甚至没有显示在那里。
我认为这不是Dexter的一个问题,因为当我手动设置它时,它基本上做了同样的事情(我确认在查看几个SO帖子之后,它确实在这种情况下正确设置)。 / p>
有关这个问题的任何想法吗?仅供参考 - 我使用的是Galaxy S6,OS 6.0.2。遇到这种情况的其他用户似乎是具有6.0+操作系统的其他设备。提前谢谢!
编辑: 测试各种设备,它适用于某些设备,但不适用于某些设备:
似乎不是一个坚实的模式..绝对奇怪。我还启动了一个全新的项目并运行相同的代码 - 工作正常并允许访问我的相机。所以它似乎并不完全是设备特定的..
答案 0 :(得分:11)
这个问题原来是一个第三方图书馆,在他们的文件中有这条线,超越了我们自己的许可:
<uses-permission android:name="android.permission.CAMERA" tools:node="remove" />
解决方案是手动将项目作为模块导入(而不是使用gradle),然后注释掉该行,或者更简单 - 您可以添加“tools:node =”替换“”到结尾主项目的CAMERA许可线,之后工作正常;无需使用后一种方法导入项目。
答案 1 :(得分:1)
您需要的是本机运行时权限而不是dexter,从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。此方法简化了应用安装过程,因为用户在安装或更新应用时无需授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择让相机应用程序访问相机,但不能访问设备位置。用户可以通过转到应用程序的“设置”屏幕随时撤消权限。
ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.YOUR_PERMISSION}, MY_PERMISSION_CODE);
然后你需要的是在检查结果为假的情况下请求某个权限,
function fetchValue(){
var bill = JSON.parse(localStorage.getItem('bill'));
var result = document.getElementById('total');
result.innerHTML='';
var total=0;
for(var i=0;i < bill.length;i++){
var items= bill[i].items;
var date= bill[i].date;
var price= bill[i].price;
total+= parseFloat(price);
}
}
根据你所展示的已经完成的内容,你还需要在清单中声明它们。 For more information