android权限的变化
在Android6.0以前的版本的时候,Android的权限都是在安装的时候全部的配置完成的。然而这往往会造成一些安全的问题。
Google的解决办法:
将Android中的权限分为了两大类:
Normal:权限不会直接涉及到用户的隐私。如果你的应用在manifest清单文件中配置了此类的权限,那么系统会自动的同意。
Dangerous权限能够让应用去访问用户的隐私数据。如果你的应用在manifest中配置了此类的权限,那么久得需要用户同意此类权限。
注意:
如果你的应用需要一个dangerous权限,那么在每一次执行需要这个权限的操作时,你必须检查是否有这个权限。应用用户总是可以取消这个权限的,并不能认为一次同意永久拥有。
不管是 Normal 还是 Dangerous 权限 都需要在清单文件中进行配置
Demo代码:
1 package com.example.it.android_callphone; 2 3 import android.content.Intent; 4 import android.content.pm.PackageManager; 5 import android.net.Uri; 6 import android.support.annotation.NonNull; 7 import android.support.v4.app.ActivityCompat; 8 import android.support.v4.content.ContextCompat; 9 import android.support.v7.app.AppCompatActivity; 10 import android.os.Bundle; 11 import android.view.View; 12 import android.widget.Button; 13 import android.widget.EditText; 14 import android.widget.Toast; 15 16 import java.net.URI; 17 import java.security.Permission; 18 import java.util.jar.Manifest; 19 20 public class MainActivity extends AppCompatActivity { 21 22 int REQUEST_CALL_PHONE_PERMISSION=0; 23 Intent intent; 24 EditText txtNumber; 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 30 Button btnCall =(Button) findViewById(R.id.btnCall); 31 txtNumber =(EditText)findViewById(R.id.txtNumber); 32 33 btnCall.setOnClickListener(new View.OnClickListener() { 34 @Override 35 public void onClick(View v) { 36 //如果有权限直接执行 37 if(ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.CALL_PHONE)==PackageManager.PERMISSION_GRANTED){ 38 intent = new Intent(); 39 //添加打电话的动作 40 intent.setAction(Intent.ACTION_CALL); 41 //添加数据 42 String number = txtNumber.getText().toString().trim(); 43 intent.setData(Uri.parse("tel:"+number)); 44 startActivity(intent); 45 } 46 //如果没有权限那么申请权限 47 else{ 48 ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.CALL_PHONE},REQUEST_CALL_PHONE_PERMISSION); 49 } 50 } 51 }); 52 } 53 54 /* 55 * 当请求获取权限后会执行此回调方法,来执行自己的业务逻辑 56 * */ 57 @Override 58 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 59 if(requestCode==this.REQUEST_CALL_PHONE_PERMISSION){ 60 61 if(grantResults[0]==PackageManager.PERMISSION_GRANTED){ 62 //执行自己的业务逻辑 63 startActivity(intent); 64 }else{ 65 Toast.makeText(this, "拒绝了权限", Toast.LENGTH_SHORT).show(); 66 } 67 } 68 super.onRequestPermissionsResult(requestCode,permissions,grantResults); 69 } 70 }