其实早早就了解了6.0的新特性,只是没用去仔细琢磨,直到今天学到如何用代码去获取动态权限,下面就和我一起去看看吧,,,
首先介绍下6.0的有关新特性
android 6.0新特性
6.0新特性:
1.指纹识别
2.动态获取权限
3.FloatingActionButton
4.Tablayout
5.低电耗模式和应用待机模式
动态获取权限
虽然是要用代码获取权限可是还是要添加权限的不然会崩的~~~
添加打电话的权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
然后activity_main代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.permissiontest.MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="call"
android:text="打110"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"/>
</android.support.constraint.ConstraintLayout>
使用ConstraintLayout拖拽一个button,添加点击事件call方法
BaseActivity代码
package com.example.permissiontest.base;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.pm.ActivityInfoCompat;
import android.widget.Toast;
/**
* Created by 亮亮 on 2017/9/11.
*/
public abstract class BaseActivity extends Activity {
private int permissionRequestCode=0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initData();
}
public abstract void initData() ;
public abstract void initView() ;
public void ifHasPermission(String Permission,int code){
permissionRequestCode=code;
int permissionStatus = ContextCompat.checkSelfPermission(this, Permission);
//判断是否开启了
if(permissionStatus== PackageManager.PERMISSION_GRANTED){
//打电话
dosomething();
}else{
//如果没有,就需要去申请
/**
* 参数1 activity
* 参数2 权限 需要声明权限写成string数组
* 参数3 请求码
*/
ActivityCompat.requestPermissions(this,new String[]{Permission},permissionStatus);
}
}
//需要让子类去实现的方法
public void dosomething(){
}
//当调用了 ActivityCompat.requestPermissions 这个回调方法就会被调用
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(permissionRequestCode==requestCode){
//如果允许了
if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
dosomething();
}else{
Toast.makeText(this, "此功能需要打开您的打电话权限,请在设置页面手动开启", Toast.LENGTH_SHORT).show();
}
}
}
}
做了一个抽取
MainActivity代码
package com.example.permissiontest;
import android.Manifest;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.example.permissiontest.base.BaseActivity;
public class MainActivity extends BaseActivity {
public void call(View v) {
/**
* 1.先检查到底有没有打电话权限
* 2.如果没有,那么去申请打电话权限 ,如果有直接打电话
* 3.写一个申请权限的回调
* 4.在申请失败的回调中去提示用户手动开启权限,如果申请成功就直接打电话
*/
//拿到当前打电话的权限的状态
//如果sdk 版本小于23的话 不需要做这个判断和申请
if (Build.VERSION.SDK_INT >= 23) {
ifHasPermission(Manifest.permission.CALL_PHONE, Constants.CALLPHONE_REQUEST);
} else {
callPhone();
}
}
@Override
public void dosomething() {
callPhone();
}
private void callPhone() {
Toast.makeText(this, "我要打电话了~~~", Toast.LENGTH_SHORT).show();
}
@Override
public void initData() {
}
@Override
public void initView() {
setContentView(R.layout.activity_main);
}
}
Constants 接口代码
package com.example.permissiontest;
/**
* Created by 亮亮 on 2017/9/11.
*/
public interface Constants{
int CALLPHONE_REQUEST=100;
int WRITESD_REQUEST=101;
}
………………..
下面看下效果图:
好的,就这样,下会写用框架动态获取的。。。