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 }