从6.0开始,谷歌从苹果那里学习了iOS的动态申请权限这一套(或者是从其他ROM那里借鉴的)。于是,我们的app就不能安装上就一劳永逸了,需要在运行过程要用到某个权限的时候先检查权限是否获取,否的话还要动态申请。
下面整理用代码说明一下整个过程。首先仍然要在menifest.xml中标明需要申请的权限,这里以读取联系人为例。App需要设置target SDK为23(Android6.0)。
<uses-permission android:name="android.permission.READ_CONTACTS" />
在需要用在权限的地方
package com.example.stone.permisson6demo;
import android.Manifest;
...
public class MainActivity extends AppCompatActivity {
// 这里有个坑,一般我们的code会设置为int类型,但是如果这个值设置为大于255的话会报错提示这个code只会用到8 bits!
private static final char MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 当用户曾经拒绝过授权申请,则系统会建议你explain一下申请权限的原因,弹框说明。
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.READ_CONTACTS)) {
showPermissionDialog();
} else {
showMessage("不用问直接请求?");
// 不用explain的话直接申请了,系统会弹标准的对话框申请,我们要自己设置一个requestCode,后边会用到。
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
} else {
showMessage("可以看通信录了");
}
}
});
}
private void showPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setPositiveButton("阔以", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
}).setNegativeButton("不滴", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
showMessage("搞毛");
}
}).setTitle("老子要看通讯录").create().show();
}
...
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 判断是否成功授权,不用解释了
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
if(grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showMessage("阔以读取了");
} else {
showMessage("尼玛。。。");
}
} else {
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void showMessage(String message) {
Toast.makeText(MainActivity.this,
message, Toast.LENGTH_SHORT).show();
}
}