Android新特性 - 6.0动态获取权限

来源:互联网 发布:restful api例子 java 编辑:程序博客网 时间:2024/06/06 02:48

本篇为大家带来的是6.0的主要特性,也就是动态权限,我们都知道在6.0以前我们只需要在AndroidMainfest中配置权限就可以,但是在6.0之后Google考虑到了用户的隐私性方面增添了动态权限,现在我们首先在AndroidMainfest中注册权限,当涉及到用户的隐私时(包含9类27种,其中就有拨打电话,读取信息的权限),我们就是先查看是否授权,如无授权我们就像用户发起请求,大多时候会出现的是一个弹框,在用户同意与拒绝的时候执行各自操作,当用户授权之后就不会再次请求让用户授权。

AndroidMainfest权限添加:

<!--声明权限-->    <uses-permission android:name="android.permission.CALL_PHONE" />

ManiActivity Code:

package com.example.administrator.permisson;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.app.NotificationCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;import java.security.Permission;import java.util.jar.Manifest;import static android.R.attr.onClick;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView mCall = (TextView) findViewById(R.id.tv_call);        mCall.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //申请授权        /*        *首先我们查看自己的权限是否已经授权,如果没有的话,我们发起授权的请求        * */                if(ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED){     //在动态权限中有一个方法shouldShowRequestPermissionRationale用来监听用户拒绝时候的操作,有时候我们在这里会进行二次弹框,让用户进行授权(有时候有点偏强制),然后发起请求授权,这里我们并没有写出,大家可以按需求进行写入               ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.CALL_PHONE},1);                }else{                    //执行拨打电弧操作                    call();                }            }        });    }    //当拥有拨打权限的时候,直接执行拨打电话的操作    private void call() {        Intent intent=new Intent(Intent.ACTION_CALL);        intent.setData(Uri.parse("tel:10010"));        try {            startActivity(intent);        }catch (SecurityException e){            e.printStackTrace();;        }    }    //请求权限的结果-进行回调    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode){            case 1:                //我们发现,上面我们请求权限的时候是以数组的形式请求的,所以这里我们首先判断了授权数组的长度,同时校验角标为0的值是否是我们上面申请的权限(其实因为是数据容器,我们可以多个权限请求,但是我们并不建议这样做)                if(grantResults.length>0&&grantResults[0]==getPackageManager().PERMISSION_GRANTED){                    call();                }else{                    Toast.makeText(this,"权限已经打开",Toast.LENGTH_LONG).show();                }                break;            default:                break;        }    }}

MainActivity Xml Code:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.administrator.permisson.MainActivity">    <TextView        android:id="@+id/tv_call"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="6.0电话权限测试" /></RelativeLayout>

注意:
其实当我们编译使用的是sdk23以前版本的话是有一定几率规避动态权限的问题,不会使程序奔溃,当然学习动态权限只是早晚的问题,我们仍需努力。

0 0
原创粉丝点击