Android联系人权限,无需在运行时询问

时间:2017-04-19 10:43:52

标签: java android permissions

我正在尝试请求能够在应用中阅读联系人,并且已经学习了几个教程。所有这些都使用了与此过程几乎相同的代码。下面是我的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" />

当应用程序在模拟器或物理调试设备上运行时,它不会请求权限,但是日志会声明该权限已被授予。我已通过转到设置并检查它已关闭来确认权限已关闭。还有什么会导致应用程序执行,就像授予权限一样。

5 个答案:

答案 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'
}

这不容易吗?

相关问题