写给初学者29_android_安卓权限机制

来源:互联网 发布:java设计实训学校 编辑:程序博客网 时间:2024/06/01 11:45

安卓29_安卓权限机制


很多人普片都知道访问一些系统资源的时候,或者一些系统设置的时候,比如网络设置,我们需要去申请权限,但是普片都不知道为什么安卓要设置这样的东西,又为什么会提出运行时权限。

安卓权限机制

一些操作是风险操作,也就是会涉及的用户安全问题上的操作,那么来进行这些操作的时候,安卓会以权限的形势来做,在6.0以前,我们安装一个程序可以在安装界面就发现很多的权限申请,而且如果我们拒绝某一项的话,APP就安装不了,十分的蛋疼。所以在6.0以后提出了运行时权限,当用户的操作需要权限的时候,我们再申请,这样的方式更加合理,用户体验也更加的好。

权限分类

  • 普通权限
  • 危险权限
  • 特殊权限

特殊权限可以不作考虑,所有的权限都可以在安卓的开发者网站上查看到,这里给一个中文的连接https://developer.android.google.cn/guide/topics/security/permissions.html

分类的目的是提升体验,不是所有东西都会涉及到安全问题的,用户也不想翻来覆去不挺的授权,系统会对普通权限自动授权,而危险权限就需要注意了,这是应该询问用户的操作。

那么我们需要注意的是,危险权限在6.0之前在manifest中声明就好,而在6.0以后,注入了运行权限机制以后,我们就需要全新的写法,不然就会发现程序要6.0以前完美运行,6.0以后直接爆炸、

运行权限写法

这里以危险权限种的CALL_PHONE作为例子

6.0以前的写法

1.申请权限

<uses-permission android:name="android.permission.CALL_PHONE"/>

2.启动系统拨号界面

private void callPhone(String phoneNumber) throws SecurityException{    Intent intent = new Intent(Intent.ACTION_CALL);    Intent intent1 = intent.setData(Uri.parse("tel:" + phoneNumber));    startActivity(intent);}

6.0以前的手机都能很好的运行这段代码,但是6.0以后就不可以了,会直接出错。因为6.0以后我们需要使用运行时权限的写法了。也很容易理解,这里打电话都还好,如果发短信这样的权限,在安装时就允许,而且一些粗心的用户根本也不看,那么后面出现安全问题,问题就很严重了,也可以看出安卓这么做实在是用心良苦。

6.0以后的写法

public class NextActivity extends AppCompatActivity {    final int REQUEST_CAllPHONE_CODE = 1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_next);        findViewById(R.id.callBtn).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (ContextCompat.checkSelfPermission(NextActivity.this, Manifest.permission.CALL_PHONE)                    != PackageManager.PERMISSION_GRANTED) {                    ActivityCompat.requestPermissions(NextActivity.this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CAllPHONE_CODE);                } else                    callPhone("10000");            }        });    }    private void callPhone(String phoneNumber) throws SecurityException {        Intent intent = new Intent(Intent.ACTION_CALL);        intent.setData(Uri.parse("tel:" + phoneNumber));        startActivity(intent);    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case REQUEST_CAllPHONE_CODE:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)                    callPhone("10000");                else                    Toast.makeText(this, "没有允许该权限", Toast.LENGTH_SHORT).show();                break;        }    }}   

流程解析

多数人会觉得参数好多,很麻烦,前面不太懂为什么的话,理解参数的意义就会好很多了。

0 0
原创粉丝点击