我正在尝试请求能够在应用中阅读联系人,并且已经学习了几个教程。所有这些都使用了与此过程几乎相同的代码。下面是我的MainActivity.java文件中的代码,它应该请求权限。
private void checkContactPermissions()
{
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Contacts permission NOT granted");
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
else
{
Log.i(TAG, "Contacts permission granted");
readContacts();
}
}
我的manifest.xml还包括以下行:
<uses-permission android:name="android.permission.READ_CONTACTS" />
当应用程序在模拟器或物理调试设备上运行时,它不会请求权限,但是日志会声明该权限已被授予。我已通过转到设置并检查它已关闭来确认权限已关闭。还有什么会导致应用程序执行,就像授予权限一样。
答案 0 :(得分:1)
试试这个,
private Context mContext=YourActivity.this;
private static final int REQUEST = 112;
if (Build.VERSION.SDK_INT >= 23) {
String[] PERMISSIONS = {android.Manifest.permission.READ_CONTACTS};
if (!hasPermissions(mContext, PERMISSIONS)) {
ActivityCompat.requestPermissions((Activity) mContext, PERMISSIONS, REQUEST );
} else {
readContacts();
}
} else {
readContacts();
}
获取权限结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
readContacts();
} else {
Toast.makeText(mContext, "The app was not allowed to read your contact", Toast.LENGTH_LONG).show();
}
}
}
}
检查marshmallow的权限
private static boolean hasPermissions(Context context, String... permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
清单
<uses-permission android:name="android.permission.READ_CONTACTS" />
答案 1 :(得分:0)
正如Divyesh Patel指出的那样,我将布尔状态混合起来,应该是
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED)
而不是
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED)
答案 2 :(得分:0)
重要的是你要注意这些权限仅针对版本> 23的设备提出,如果你有较低版本的android,那么对于像redmi这样的某些模型你必须手动调用权限。
否则版本&lt; 23通常不会要求权限。 如果你放入清单。它将自动接受它,特别是当你在usb上安装app时。
答案 3 :(得分:0)
如果任何设备的操作系统版本低于&lt; 23或者在应用程序显示文件maxtarget版本低于&lt; 23那么它将不会在运行时询问权限,因为在这些设备上安装的应用程序实际上允许您提到的所有人。
因此,仅当设备的操作系统版本高于22(Lolipop)时,才有可能获得运行时权限。
希望这有用..
@Rajesh
答案 4 :(得分:0)
我使用RxPermission的权限来使我的代码最终简短。
首先在manifest.xml
中添加这些权限(或您需要的权限)。
<uses-permission android:name="android.permission.READ_CONTACTS" />
然后在您的活动中向用户询问运行时权限。
RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions
.request(Manifest.permission.READ_CONTACTS) // ask single or multiple permission once
.subscribe(granted -> {
if (granted) {
// All requested permissions are granted
} else {
// At least one permission is denied
}
});
将此库添加到您的build.gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.tbruyelle:rxpermissions:0.10.1'
implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
}
这不容易吗?