版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linxinfa/article/details/89396663
Android 6.0以后,用户可以动态关闭应用的一些权限,假设现在我们有个功能要求有READ_PHONE_STATE权限,我们必须先判断用户是否开启了权限,如果没有开启,要提示用户进行开启。
代码如下
package com.linxinfa.demo;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MyActivity extends Activity
{
@TargetApi(Build.VERSION_CODES.M)
private void checkAndRequestPermission()
{
List<String> lackedPermission = new ArrayList<String>();
// 例:要求有Manifest.permission.READ_PHONE_STATE权限
if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED))
{
lackedPermission.add(Manifest.permission.READ_PHONE_STATE);
}
if (lackedPermission.size() == 0)
{
// 已经有了权限
}
else
{
// 请求所缺少的权限,在onRequestPermissionsResult中再看是否获得权限,如果获得权限就可以调用logAction,否则申请到权限之后再调用。
String[] requestPermissions = new String[lackedPermission.size()];
lackedPermission.toArray(requestPermissions);
requestPermissions(requestPermissions, 1024);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1024 && hasAllPermissionsGranted(grantResults))
{
// 获得用户授权
}
else
{
// 如果用户没有授权,那么应该说明意图,引导用户去设置里面授权。
Toast.makeText(this, "应用缺少必要的权限!请点击\"权限\",打开所需要的权限。", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
finish();
}
}
}