Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 6.0 運行時權限處理,android6.0

Android 6.0 運行時權限處理,android6.0

編輯:關於android開發

Android 6.0 運行時權限處理,android6.0


在運行時請求權限

從Android 6.0(API級別23)開始,用戶權限授予應用程序在應用程序運行時,當他們安裝程序。這種方法簡化了應用程序的安裝過程,因為用戶不需要安裝或更新應用程序時授予權限。這也給了用戶更多的控制應用程序的功能;例如,一個用戶可以選擇給相機應用程序訪問相機而不是設備的位置。用戶可以隨時撤銷權限,通過將應用程序的設置屏幕。

 

系統權限分為兩類,普通和危險:

  • 正常的權限不直接用戶的隱私風險。如果你的應用程序清單列出了一個正常的權限,系統自動授予許可。
  • 危險的權限可以給應用程序訪問用戶的機密數據。如果你的應用程序清單列出了一個正常的權限,系統自動授予許可。如果你列出一個危險的許可,用戶必須顯式地給應用程序審批。 

 

在所有版本的Android系統,您的應用程序需要申報的正常和危險的權限需要在其應用程序清單,如聲明中所述的權限。然而,宣言的影響是不同的根據系統版本和SDK應用程序的目標水平:

  • 如果設備運行Android 5.1或更低,或應用程序的目標SDK是22或更低:如果你在清單列表一個危險的許可,用戶授予權限安裝應用程序時,如果他們不授予權限,系統沒有安裝應用程序。
  • 如果設備運行Android 6.0或更高版本,和你的應用程序的目標SDK是23或更高:應用列表的權限清單,它必須要求每個危險的權限需要在應用程序運行時。用戶可以授予或拒絕每一個權限,應用程序可以繼續運行能力有限,即使用戶拒絕權限請求。

注意:從Android 6.0(API級別23),用戶可以在任何時候從任何應用程序撤銷權限,即使應用程序API級別較低的目標。你應該測試你的應用程序,以確認它正確行為的時候丟失了一個需要許可,無論什麼API級別應用程序的目標。

 

這節課描述了如何使用Android支持庫檢查,和請求,權限。Android 6.0的Android框架提供了類似的方法(API級別23)。然而,使用支持庫比較簡單,因為應用程序不需要檢查哪個版本的Android上運行之前調用的方法。


 

 

檢查權限

 如果你的應用需要一個危險的許可,你必須檢查你是否有權限每次執行一個操作,要求許可。用戶總是可以撤銷許可,所以即使相機昨天使用的應用程序,它不能假設它今天仍有該權限。

檢查如果你有權限,調用ContextCompat.checkSelfPermission()方法。例如,這個代碼片段展示了如何檢查活動日歷上寫權限:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

如果應用程序許可,該方法返回PackageManager。PERMISSION_GRANTED,應用程序可以繼續運行。如果應用程序沒有許可,方法返回PERMISSION_DENIED,應用程序必須顯式地要求用戶許可。


請求的權限

如果你的應用需要一個應用程序清單中列出的危險的許可,它必須要求用戶授予權限。Android提供了幾種方法可用於請求許可。調用這些方法提出一個標准的Android對話框中,您不能定制。

解釋為什麼這個應用程序需要的權限

在某些情況下,您可能想要幫助用戶理解為什麼你的應用需要一個許可。攝影為例,如果一個用戶啟動一個應用程序,用戶可能不會感到驚訝,允許應用程序要求使用相機,但是用戶可能不理解為什麼這個應用程序要訪問用戶的位置或聯系人。在請求許可之前,你應該考慮為用戶提供一個解釋。記住,你不想淹沒用戶提供解釋,如果你提供太多的解釋,用戶可能會發現應用令人沮喪和刪除它。

您可以使用的一種方法是提供一個解釋只有在用戶已經拒絕了該權限的請求。如果用戶一直試圖使用功能需要一個許可,但一直拒絕許可的要求,這可能表明用戶不理解為什麼允許應用程序需要提供該功能。在這樣的情況下,它可能是一個好主意給一個解釋。

幫助找到的情況下,用戶可能需要一個解釋,Android提供了一種utiltity方法,shouldShowRequestPermissionRationale()。這個方法返回true,如果應用程序要求這個許可之前,用戶拒絕請求。

注意:如果用戶拒絕許可請求過去,再次選擇了不要問選項允許請求系統對話框中,這個方法返回false。該方法還返回false如果設備政策禁止應用程序擁有該權限。

請求所需要的權限

如果應用程序已經不允許它的需求,應用程序必須調用一個requestPermissions()方法來請求適當的權限。應用程序通過它想要的權限,以及一個整數要求您指定識別這個許可請求的代碼。這種方法異步函數:它返回,用戶響應對話框之後,系統調用應用程序的回調方法對結果的影響,通過相同的請求代碼,應用程序傳遞給requestPermissions()。

下面的代碼檢查應用程序允許讀取用戶的聯系,必要時請求許可:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

注意:當您的應用程序調用requestPermissions(),系統顯示一個標准對話框給用戶。應用程序不能配置或改變對話框。如果需要提供任何信息或向用戶解釋,你應該這樣做之前你叫requestPermissions(),解釋為什麼所述應用程序需要的權限。

 

處理權限請求響應

當應用程序請求權限,系統向用戶提供了一個對話框。當用戶響應,系統調用應用程序的onRequestPermissionsResult()方法,傳遞用戶響應。你的應用必須覆蓋那個方法來找出是否被授予許可。回調傳遞相同的請求代碼傳遞給requestPermissions()。例如,如果一個應用程序請求READ_CONTACTS訪問它可能回調方法如下:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

 

 

所示的對話框,系統描述了允許組織你的應用程序需要訪問;它不特定的權限列表。舉個例子,如果你請求READ_CONTACTS許可,該系統對話框只是說你的應用程序需要訪問設備的聯系人。一旦為每個用戶只需要許可權限組。如果你的應用程序請求的任何其他權限組(應用程序清單中列出),系統自動賦予他們。請求許可時,系統調用你onRequestPermissionsResult()回調方法和通過PERMISSION_GRANTED,以同樣的方式將如果用戶有明確授予你的要求通過系統對話框。

 

注意:應用程序仍然需要每個許可需要顯式地請求,即使用戶已經允許另一個在同一組。此外,權限分組的分組可能改變未來的Android版本。你的代碼不應該依賴於假設特定的權限或不在同一組。

例如,假設您在應用程序列表READ_CONTACTS和WRITE_CONTACTS清單。如果你請求READ_CONTACTS和用戶授予權限,然後你請求WRITE_CONTACTS,系統立即授予許可沒有與用戶交互。

如果用戶拒絕權限請求,應用程序應該采取適當的措施。例如,您的應用程序可能會顯示一個對話框解釋為什麼它不能執行用戶所請求的操作,需要許可。

當系統要求用戶授予權限,用戶可以選擇告訴系統不要求許可了。在這種情況下,任何時候一個應用程序使用requestPermissions()要求權限,系統立即否認了這一請求。系統調用你onRequestPermissionsResult()回調方法和通過PERMISSION_DENIED,以同樣的方式將如果用戶已經明確拒絕了你的請求。這意味著當你叫requestPermissions(),你不能假設任何直接與用戶交互。 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved