1. 程式人生 > >FC 7.3.2 執行時許可權及其獲取通訊錄例項

FC 7.3.2 執行時許可權及其獲取通訊錄例項

  • 定義
  • 24種執行時許可權
  • 獲取通訊錄例項

 

執行時許可權(Dangerous Permissions)

在保護使用者隱私方面:Android6.0為了更好的保護個人隱私,添加了執行時許可權:

  • 分為兩類,一類是Normal Permissions,這類許可權不涉及個人隱私,不需要使用者進行授權,比如手機震動,訪問網路;
  • 一類是Dangerous Permissions,這類許可權涉及個人隱私,需要使用者進行授權,比如讀取SD卡,訪問通訊錄等。

在使用者操作方面:當執行敏感操作之前彈出對話方塊,請求許可權,可以拒絕,可以同意;可以在設定頁面對APP的許可權進行檢視,以及對單個許可權進行授權或者解除授權。

 

執行時許可權包括如下(九組24個):

group:android.permission-group.CONTACTS 通訊錄方面 
permission:android.permission.WRITE_CONTACTS 寫入通訊錄 
permission:android.permission.GET_ACCOUNTS 訪問通訊錄許可權 
permission:android.permission.READ_CONTACTS 讀取通訊錄

group:android.permission-group.PHONE 電話方面 
permission:android.permission.READ_CALL_LOG 看電話記錄 
permission:android.permission.READ_PHONE_STATE 讀取手機狀態 
permission:android.permission.CALL_PHONE 打電話 
permission:android.permission.WRITE_CALL_LOG 編寫呼叫日誌 
permission:android.permission.USE_SIP 使用SIP 
permission:android.permission.PROCESS_OUTGOING_CALLS 過程輸出呼叫 permission:com.android.voicemail.permission.ADD_VOICEMAIL 新增語音信箱

group:android.permission-group.CALENDAR 日曆 
permission:android.permission.READ_CALENDAR 讀取日曆 
permission:android.permission.WRITE_CALENDAR 寫入日曆 

group:android.permission-group.CAMERA 照相機 
permission:android.permission.CAMERA

group:android.permission-group.SENSORS 感測器 
permission:android.permission.BODY_SENSORS 體感測器

group:android.permission-group.LOCATION 位置 
permission:android.permission.ACCESS_FINE_LOCATION 獲取好位置 
permission:android.permission.ACCESS_COARSE_LOCATION 

獲取粗定位group:android.permission-group.STORAGE 儲存 
permission:android.permission.READ_EXTERNAL_STORAGE 讀取外部儲存器 permission:android.permission.WRITE_EXTERNAL_STORAGE 寫外部儲存器

group:android.permission-group.MICROPHONE 擴音器;麥克風 
permission:android.permission.RECORD_AUDIO 錄音

group:android.permission-group.SMS 資訊 
permission:android.permission.READ_SMS 讀取資訊 
permission:android.permission.RECEIVE_WAP_PUSH 收到WAP推送 
permission:android.permission.RECEIVE_MMS 接收彩信 
permission:android.permission.RECEIVE_SMS 收資訊 
permission:android.permission.SEND_SMS 發信息 

獲取通訊錄例項

  • 主介面新增一個listview
  • 配置檔案新增許可權<uses-permission android:name="android.permission.READ_CONTACTS" />
  • MainActivity中編寫程式碼
    • ContextCompat.checkSelfPermission方法判斷使用者是不是給我們授權了,裡邊的第一個引數是context,第二個引數是具體的許可權名,使用方法的返回值和PackageManager.PERMISSION_GRANTED作比較,相等就說明使用者已經授權,否則就沒有授權
    • 如果已經授權了,直接執行邏輯即可。如果之前沒有授權,則呼叫ActivityCompat.requestPermissions方法
      來向用戶申請授權。第一個引數是Activity例項,第二個引數是String陣列,這裡把要申請的許可權放到數組裡即可,第三個引數是請求碼,只要是唯一的值就行了,這裡傳入1
    • 呼叫完requestPermissions方法後,彈出許可權申請的對話方塊,使用者可以同意或者拒絕,結果會回撥onRequestPermissionsResult方法,所以我們重寫了這個方法,我們判斷授權結果,如果授權了就執行邏輯,沒有授權就彈出提示框。
public class MainActivity extends AppCompatActivity {
    ArrayAdapter<String> adapter;
    List<String> contactsList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView contactsView = (ListView) findViewById(R.id.contacts_view);
        adapter = new ArrayAdapter<String>(this, android.R.layout. simple_list_item_1, contactsList);
        contactsView.setAdapter(adapter);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.READ_CONTACTS }, 1);
        } else {
            readContacts();
        }
    }

    private void readContacts() {
        Cursor cursor = null;
        try {
            // 查詢聯絡人資料
            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            if (cursor != null) {
                while (cursor.moveToNext()) {
                    // 獲取聯絡人姓名
                    String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    // 獲取聯絡人手機號
                    String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    contactsList.add(displayName + "\n" + number);
                }
                adapter.notifyDataSetChanged();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    readContacts();
                } else {
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }
}