1. 程式人生 > >Android中的許可權問題

Android中的許可權問題

在Android程式中,在執行形如訪問網路、讀取聯絡人時都要宣告許可權,在 Android 系統版本小於6.0時,所有的許可權只需要在AndroidManifest檔案中宣告就可以使用對應的功能了。 但是在Android6.0版本以上,Android將許可權分為了普通許可權和危險許可權,其中普通許可權的使用和以前的Android版本一樣,直接在AndroidManifest檔案中宣告就行了,系統會自動幫我們授權,但是危險許可權不僅要在AndroidManifest檔案中宣告,還需要在使用許可權的時候通過程式碼來判斷使用者授權並且對使用者授權的結果進行對應的處理。那麼哪些許可權是危險許可權呢,下面給出了Android所有的危險許可權,那麼除了下表中的危險許可權,其它的許可權就都是Android普通許可權了:

我們可以通過許可權組的方式大致記一下危險許可權:

1、讀寫日曆:android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR

2、使用相機: android.permission.CAMERA

3、讀寫聯絡人:android.permission.READ_CONTACTS android.permission.WRITE_CONTACTS
android.permission.GET_ACCOUNTS

4、位置服務:android.permission.ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

5、電話:android.permission.READ_PHONE_STATE android.permission.CALL_PHONE android.permission.READ_CALL_LOG android.permission.WRITE_CALL_LOG android.permission.ADD_VOICEMAIL android.permission.USE_SIP android.permission.PROGRESS_OUTGOING_CALLS

6、使用感測器:android.permission.BODY_SENSORS

7、簡訊:android.permission.SEND_SMS android.permission.RECEIVE_SMS android.permission.READ_SMS android.permission.RECEIVE_WAP_PUSH RECEIVE_MMS

8、讀寫手機儲存:android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE

好了,以上就是Android的所有危險許可權,我們在使用這些許可權的時候不僅要在AndroidManifest檔案中宣告,還需要在程式碼中對使用者的授權情況進行處理,下面以一個簡單的例子來看一下如何在程式碼中處理危險許可權:
新建一個Android工程:
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:gravity="center_horizontal"
    tools:context="com.example.administrator.blogandroidpermissiondeal.MainActivity">

    <EditText
        android:id="@+id/phonenumberEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="輸入你想撥打的電話號碼" />
    <Button
        android:id="@+id/callPhoneButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="撥打"/>

</LinearLayout>

很簡單的佈局檔案,一行EditText控制元件用於,電話號碼,一行Button用於撥打電話::
接下來是MainActivity.java:

package com.example.administrator.blogandroidpermissiondeal;

import android.Manifest;
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.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button button = null;
    private EditText editText = null;
    private static final int PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.phonenumberEditText);
        button = (Button) findViewById(R.id.callPhoneButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                 * 先判斷使用者以前有沒有對我們的應用程式允許過打電話的許可權,
                 * 如果有,那麼直接打電話,如果沒有,那麼向用戶申請,並且回撥onRequestPermissionResult方法
                 */
                if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
                        != PackageManager.PERMISSION_GRANTED) {
                    /*
                     * 下面是對許可權進行申請,第二個引數填入許可權名,如果有多個許可權,那麼第二個引數String陣列加入多個許可權引數
                     */
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.CALL_PHONE}, PERMISSION_REQUEST_CODE);
                } else {
                    callPhonenumber();
                }
            }
        });
    }

    private void callPhonenumber() {
        try {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:" + editText.getText().toString()));
            startActivity(intent);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * 當我們向用戶申請許可權的時候,使用者操作的結果會呼叫這個方法,無論使用者允許或者禁止,
     * 我們要在這個方法裡面做出對應的處理
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            /*
             * 對傳入的requestCode進行判斷
             */
            case PERMISSION_REQUEST_CODE:
                // 如果使用者授權
                if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    callPhonenumber();
                } else {
                    Toast.makeText(this, "打電話許可權已被使用者拒絕", Toast.LENGTH_SHORT).show();
                }
        }
    }

}

在MainActivity.java中我們對我們需要的許可權進行了處理,
最後別忘了在AndroidManifest檔案中宣告打電話許可權:

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

下面來執行一下:
這裡寫圖片描述
我們輸入一個號碼,點選“撥打”按鈕:
這裡寫圖片描述
因為我們是第一次執行這個程式,所以使用者以前並沒有對我們的程式進行授權,因此出現許可權申請對話方塊,我們點選DENY(否):
這裡寫圖片描述
成功彈出了提示框,那麼我們再試一次點選ALLOW(允許)試試:
這裡寫圖片描述
成功的進入撥打電話的介面並且撥打我們輸入的電話號碼!

當我們允許了之後,那麼程式以後就不需要再經過使用者授權了,即可以直接撥打電話(除非使用者在應用程式管理中收回了我們的打電話的許可權)。

OK,危險許可權和使用者授權是Android6.0的新特性,也是為了讓使用者更加安全的使用程式,好了,如果部落格中有什麼不正確的地方,還請多多指點。

謝謝觀看。。。