1,依然要在清单文件中添加权限(不但需要在代码中动态请求权限,在清单文件中依旧需要设置):
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2,代码实现动态申请:
首先是个简单的布局文件
<TextView android:id="@+id/camera_permission" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="权限获取:" android:textSize="16sp" android:textColor="#ff4081"/> <Button android:id="@+id/number_permission" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="权限获取:" android:textSize="16sp" android:textColor="#ff4081"/>
3,逻辑代码:
3.1首先介绍下几个方法:
a,检查是否已经得到需要的权限:
ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
b,根据用户的选择返回true或者false
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
第一次安装app的时候,这个方法返回的是false,如果用户点击了”否“,那么这个将一直返回true,知道用户点击确定为止。
所以,当app第一次请求权限被拒绝的时候,程序员可以通过
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {。。。}来进行第二次申请,这个时候如果客户点击确定,使app获取权限,那么这个方法将会返回false。
c,当首次申请权限被拒绝的时候,程序员用代码进行再次申请申请权限。
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1(注:自定义CODE,int类型))
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); permission_bt = (Button) findViewById(R.id.number_permission); permission_bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { getPermission(); } }); } public void get Permission(){if (Build.VERSION.SDK_INT >= 23) {
requestPermission();
}
}
public static final int CAMERA_REQUEST_CODE = 0x01;
private void requestPermission() { Log.d("requestPermission", "*****" + ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)); if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { Log.d("requestPermission", "需要获取权限" + ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)); // 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true // 向用户解释为什么需要这个权限 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { Log.d("requestPermission", "打开dialog获取权限"); new AlertDialog.Builder(MainActivity.this).setMessage("申请相机权限").setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //申请相机权限 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE); } }).show(); } else { //申请相机权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE); } } else { cameraTv.setText("相机权限已申请"); } }
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { Log.d("requestPermission", "onRequestPermissionsResult反应了吗" + ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)); if (requestCode == CAMERA_REQUEST_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { cameraTv.setText("相机权限已申请"); Log.d("requestPermission", "onRequestPermissionsResult" + ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)); } else { Log.d("requestPermission", "没有权限,下面在判断下就弹吐司了" + ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)); //用户勾选了不再询问 //提示用户手动打开权限 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { Toast.makeText(this, "相机权限已被禁止,请在设置中打开", Toast.LENGTH_SHORT).show(); } } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
至此,权限申请完毕,各位给个赞哦。