1. 程式人生 > >動態新增許可權

動態新增許可權

請求單一許可權

為了請求單一許可權,我們可以使用checkSelfPermission()方法來檢查應用是否已經授予了該許可權。如下面程式碼所示,如果我們沒有授予該許可權,那麼就需要使用requestPermissions()方法來請求,將要申請的許可權以陣列型別作為引數傳入。


private static final int REQUEST_LOCATION = 1503;


private void requestSinglePermission() {
    String locationPermission = Manifest.permission.ACCESS_FINE_LOCATION;
    int hasPermission = checkSelfPermission(locationPermission);
    String[] permissions = new String[] { locationPermission };
    if (hasPermission != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(permissions, REQUEST_LOCATION);
    } else {
        // Phew - we already have permission!
    }
}


當呼叫requestPermissions()方法後,系統會彈出許可權請求對話方塊。一旦使用者對對話方塊做出迴應,
onRequestPermissionsResult()方法就會被呼叫,在該方法內可以檢查使用者做出的授予或者拒絕操作


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_LOCATION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Handle permission granted
            } else {
                // Handle permission denied
            }
            break;
        default: 
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

在上面程式碼中,通過requestCode 檢索到grantResults陣列中的許可權。如果此許可權已被授予就可以使用該許可權進行相應的操作。

另一方面,如果我們拒絕授予此許可權,那麼我們需要顯示一些資訊來告知使用者無法繼續操作。


請求多個許可權

在多許可權請求中,我們要做到事情和但許可權請求稍有不同。在下面的例子中,我是先檢查要申請的許可權是否已經或者其中有已經被授予的情況,如果沒有,我把沒有授予的許可權加到一個許可權列表中。接著我將這個列表以引數的形式傳遞給requestPermissions()方法。


private void requestMultiplePermissions() {
    String locationPermission = Manifest.permission.ACCESS_FINE_LOCATION;
    String calendarPermission = Manifest.permission.WRITE_CALENDAR;
    int hasLocPermission = checkSelfPermission(locationPermission);
    int hasCalPermission = checkSelfPermission(calendarPermission);
    List permissions = new ArrayList();
    if (hasLocPermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(locationPermission);
    }
    if (hasCalPermission != PackageManager.PERMISSION_GRANTED) {
        permissions.add(calendarPermission);
    }
    if (!permissions.isEmpty()) {
        String[] params = permissions.toArray(new String[permissions.size()]);
        requestPermissions(params, REQUEST_PERMISSIONS);
    } else {
        // We already have permission, so handle as normal
    }
}

在Android M上宣告許可權

對於只希望在Android-M裝置使用該許可權機制的應用,可以在Manifest檔案中單獨為Android M宣告:

<uses-permission-sdk-mandroid:name="android.permission.ACCESS_FINE_LOCATION"/>

這種形式的定義在M版本以下和普通定義的許可權一樣而不是隻在M版本的裝置上會進行許可權檢查。所以當你使用該方法進行更新應用時不必擔心版本相容性問題。這樣的許可權只會在M版本的裝置上可用在其他情況下是不會被請求的。

你真的需要許可權嗎?

記住在一些功能上可以是用

Intent請求框架,而不需要請求許可權親自去呼叫操作。這樣不用顯示許可權請求對話方塊可以大大提升使用者體驗。

  • ACTION_INSERT 只要滿足需求該action就可以替換一組許可權。設定所需的MIME TypeIntent Extras來插入日曆事件或聯絡人。這樣就不必請求日曆和聯絡人的許可權。
  • ACTION_PICK 該Action可以從聯絡人中選擇一個聯絡人,並選擇特定的資料(email, phone number, address),當在該應用中使用這個action時會授予一個臨時的READ_CONTACTS許可權用來讀取聯絡人資訊。
  • ACTION_VIEW 與ACTION_PICK共同使用時,此操作可用於檢視所選的詳細的聯絡人URI而不需要任何許可權的授予。這個Action也可以通過在一個有效的定位目的資料來啟動一個地圖Intent。
  • ACTION_EDIT 如果與ACTION_PICK一起使用,返回的聯絡人資訊中可以使用URI來編輯聯絡人的詳細資訊。
  • ACTION_DIAL 這個Action可以用來開啟一個撥號器或者已經指定好電話號碼的撥號介面。雖然它需要使用者按下呼叫按鈕(見ACTION_CALL),但它不需要使用任何相關的許可權。

相關推薦

解決Android 6.0動態新增許可權問題

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FE

動態新增許可權

請求單一許可權 為了請求單一許可權,我們可以使用checkSelfPermission()方法來檢查應用是否已經授予了該許可權。如下面程式碼所示,如果我們沒有授予該許可權,那麼就需要使用requestPermissions()方法來請求,將要申請的許可權以陣列型別作為引

android動態新增許可權6.0+--許可權操作jar簡化新增許可權步驟。

android動態新增許可權6.0+--記錄android開發過程遇到的一些問題 在android6.0以後即使在xml添加了許可權。 你也需要在程式碼中動態獲取許可權。但使用android自帶的許可

java實現動態許可權(選單管理)動態新增選單,動態新增角色SSM框架

首先是資料庫設計 Menu表(選單表) Role表(角色表) Role_Menu表(角色選單關係表) User表(使用者表) User_Role表(使用者角色關係表) 其他實體類就略過了 在Menu實體類中添加了一個List<Menu&

為bookStore新增許可權動態代理和註解】

前言 目前為止,我們已經學習了動態代理技術和註解技術了。於是我們想要為之前的bookStore專案新增許可權控制….. 只有使用者有許可權的時候,後臺管理才可以進行相對應的操作….. 實現思路 之前我們做許可權管理系統的時候,是根據使用者請求

批量動態新增分區表

range分區 麻煩 creat 條件篩選 exc interval errors pro rom mysql分區表人為添加不可控性太大,如果出現人員變動交接不利,或者遺忘,會導致業務數據丟失或寫入失敗,同時如果使用分區表較多,逐個添加分區也是挺麻煩的 推薦使用存儲過程+e

vue.set動態新增對象屬性,觸發dom渲染

bject tro 數據 his col def style this lec 當我們給一個props或者data中被觀測的對象添加一個新的屬性的時候,不能直接添加,必須使用Vue.set方法 /** * ==== 選擇產品 ==== * 因為vue實

runtime實戰(二)動態新增方法

runtime的實戰二就是動態新增方法 一:建立一個Person類 我們在Person類的標頭檔案宣告一個eat方法,並不去實現它,當我們呼叫時,會出現如下的崩潰棧 2017-05-01 20:43:06.483 SH_Runtime[2133:104550] -[Pers

Unity UGUI按鈕動態新增點選事件

使用程式碼的方式給按鈕新增點選事件需要引入兩個名稱空間: using UnityEngine.UI; using UnityEngine.Events; 先建立一個介面,並且在介面裡放置一個按鈕: 建立一個Test指令碼,程式碼如下: using

iOS動態新增和獲取屬性

我們可以利用 objc_setAssociatedObject objc_getAssociatedObject 來為類動態新增和獲取屬性 static char dynamicKey; NSArray *array = @[@"4", @"5", @"6"

Java動態生成類以及動態新增屬性

  有個技術實現需求:動態生成類,其中類中的屬性來自引數物件中的全部屬性以及來自引數物件propertities檔案。   那麼技術實現支援:使用cglib代理。   具體的實現步驟:   1.cglib的jar包(cgl

【unity】NavMesh 執行時動態新增 OffMeshLink 線。

遊戲裡 有一些場景內的傳送陣,  做尋路時, 之前要美術預埋 OffMeshLink線。 但策劃會換位置, 兩邊就不一致了。 想著 OffMeshLink好像可以動態加。  網上沒有相關資料,  試了一下是可以的。 編輯器下可以動態加, 程式裡也基本可以

Python-動態新增屬性和方法

class Person():   Country='CN'   def __init__(self,nm)     self.nm=nm 動態新增例項屬性及例項方法: p=Person() p.age=18 #直接賦值,動態新增例項屬性 def set_age(self,age) #定義帶se

安卓6.0動態申請許可權

現在安卓6.0申請許可權的開原始碼也很多,但是不想專案裡引用的東西太多,能不搬的就不搬了,自己寫了一個申請許可權的,在Gerymontion上測試,還能用,如果有需要改善的,請留言. 1 寫一個介面    public interface PermissionLi

動態獲取許可權工具類(方法)

直接上程式碼,大家應該能看懂 private static List<String> permissionList; public static void getPermission(Activity context,String... permission) {

html中元素動態新增與刪除

<div class="unit" > <label>產品引數</label> <input type="button" value="新增" onclick="addProduc

解決android6.0開啟攝像頭許可權"Failed to connect to camera service"的問題 ,動態獲取許可權

android6.0使用camera.open()時需要在onCreate()裡面新增如下程式碼,否則會報錯"Failed to connect to camera service": if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)

QML之Menu的動態新增MenuItem

選單是很常用的一個控制元件。可以利用ListView自定義實現,也可以利用Menu直接實現。 本文利用的是QtQuick.Controls 2.3(Qt版本是在Qt5.7之後引入)下面的Menu。 效果如下: 程式碼如下: import QtQuick 2.9 import Qt

web 動態新增城市和二級聯動的實現

動態新增城市 需求: 點選一個按鈕, 動態實現新增城市; 實現步驟: 確定事件型別onclick 對於事件繫結一個函式addLiElement() 獲取到使用者在input輸入框中填寫的資訊; city = d

JS中div的動態新增

新建html檔案,body中加入如下程式碼 //新增一個500*500的div快 <div id="aa" style="width:500px;height:500px;background-color:#999;"> </div> //新增一