6.0的权限有了新的机制,需要动态的去告诉用户我需要你的权限,
还是清单文件中依旧要配置这个需要的权限,首先就是兼容低版本,其次声明本应用需要的所有权限
他的思路是这样的,
首先ContextCompat.checkSelfPermission检查权限,如果有权限,直接写你正常的代码逻辑。
若是没有权限 ActivityCompat.requestPermissions申请权限,
申请完成后回调onRequestPermissionsResult查看用户是否给了权限,有则继续直接写你正常的代码逻辑。
没有则不进行,你可以说明一些原因等,看你的需求跟想法了,
其中有个问题暂未理解吧ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);//该方法作用不理解中。。。。
这个暂时不知道它的作用,不写目前不影响,看其他的博客介绍说是在用户拒绝之后通知用户申请这个权限的原因,懵逼中,
还有就是这只是简单的使用方式,我们可以封装起来,自己写个activity进行封装,生命回调方法等,逻辑留给子类实现,
还有就是一个叫做
PermissionGen慕课网推荐的,
简单易用代码在https://github.com/lovedise/PermissionGen
import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView textView; private Button button; private RelativeLayout activity_main; //申请的权限权限 private static String[] PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}; //申请权限的请求码 final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 99; private static final String TAG = "lizhanqi"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { //找到控件设置点击事件 button = (Button) findViewById(R.id.button); activity_main = (RelativeLayout) findViewById(R.id.activity_main); button.setOnClickListener(this); } /** 权限申请完成后的回调 */ @Override public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) { //根据请求权限的码判断是那次的申请, switch (requestCode){ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //获得到了权限 // 正常处理接下来的逻辑代码等 Toast.makeText(this, "已经有了权限", Toast.LENGTH_SHORT).show(); } else { //用户拒绝未得到权限 Toast.makeText(this, "用户拒绝", Toast.LENGTH_SHORT).show(); } break; } } @Override public void onClick(View v) { // ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);//该方法作用不理解中。。。。
//下面这里也可以直接在页面创建的时候申请
if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
//未获得权限 //申请WRITE_EXTERNAL_STORAGE权限 //上下文, 权限, 申请权限的请求码 ActivityCompat.requestPermissions(this, PERMISSIONS,MY_PERMISSIONS_REQUEST_READ_CONTACTS); }else { //获得到了权限 // 正常处理接下来的逻辑代码等 Toast.makeText(this, "已经有了权限", Toast.LENGTH_SHORT).show(); } } }