Android權限筆記

1、Android 是一個權限分隔的操作系統,其中每個應用都有其獨特的系統標識(Linux 用戶 ID 和組 ID)。

在安裝時,Android 爲每個軟件包提供唯一的 Linux 用戶 ID。

由於在進程級實施安全性,因此任何兩個軟件包的代碼通常都不能在同一進程中運行,因爲它們需要作爲不同的 Linux 用戶運行。您可以在每個軟件包的 AndroidManifest.xml 的 manifest 標記中使用 sharedUserId 屬性,爲它們分配相同的用戶 ID。這樣做以後,兩個軟件包將被視爲同一個應用,具有相同的用戶 ID 和文件權限。

2、應用存儲的任何數據都會被分配該應用的用戶ID,並且其他軟件包通常無法訪問這些數據。使用 getSharedPreferences(String, int)、openFileOutput(String,int) 或 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) 創建新文件時,可以使用MODE_WORLD_READABLE 和/或 MODE_WORLD_WRITEABLE 標記允許任何其他軟件包讀取/寫入文件。

3、添加權限:將<uses-permission> 元素置於應用清單manifest中,作爲頂級 <manifest> 元素的子項。

4、系統權限分爲兩類:正常權限和危險權限:

正常權限不會直接給用戶隱私權帶來風險。如果您的應用在其清單中列出了正常權限,系統將自動授予該權限。

危險權限會授予應用訪問用戶機密數據的權限。如果您列出了危險權限,則用戶必須明確批准您的應用使用這些權限(參見5)。

5、如果設備運行的是 Android 5.1或更低版本,或者應用的目標 SDK 爲 22 或更低:如果應用在manifest中列出了危險權限,則用戶必須在安裝應用時授予此權限;如果他們不授予此權限,系統根本不會安裝應用。

如果設備運行的是 Android 6.0 或更高版本,或者應用的目標 SDK 爲 23 或更高:如果應用在manifest中列出了危險權限,則它必須在運行時請求其需要的每項危險權限。用戶可以授予或拒絕每項權限,且即使用戶拒絕權限請求,應用仍可以繼續運行有限的功能。

6、檢查權限:ContextCompat.checkSelfPermission(,):

Context.checkCallingPermission (Stringpermission):檢查調用該方法的進程是否有該權限;

Context.checkPermission (String permission,int pid, int uid):檢查系統中特定的pid,uid是否有該權限;

PackageManager.checkPermission (StringpermName, String pkgName):檢查特定的包是否有該權限;

以上檢查權限的方法返回一個int,如果應用具有此權限,那麼方法將返回 PackageManager.PERMISSION_GRANTED,如果應用不具有此權限,那麼方法將返回PERMISSION_DENIED。

7、權限請求及響應

如果應用尚無所需的權限,則應用必須調用一個 requestPermissions() 方法,以請求適當的權限。

申請權限:ActivityCompat.requestPermissions( thisActivity, new  String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);

當用戶響應時,系統將調用應用的 onRequestPermissionsResult() 方法,向其傳遞用戶響應。因此應用程序必須實現onRequestPermissionsResult(int requestCode, String permissions[],  int[] grantResults)方法。

8、自動權限調整:Android 將根據爲targetSdkVersion 屬性提供的值決定應用是否需要權限。如果該值低於在其中添加權限的版本,則 Android 會自動添加該權限。

9、權限組:如果設備運行的是 Android6.0(API 級別 23),並且應用的 targetSdkVersion 是 23 或更高版本,則當用戶請求危險權限時,系統顯示的對話框說明了您的應用需要訪問的權限組,它不會列出具體權限。用戶只需要爲每個權限組授予一次權限。

10、此外,可以在所需的組件上使用android:permission 屬性,限制訪問系統或應用的全部組件。

Activity 權限(應用於<activity> 標記)限制誰可以啓動相關的 Activity。

Service 權限(應用於<service> 標記)限制誰可以啓動或綁定到相關的服務。

BroadcastReceiver 權限(應用於<receiver> 標記)限制誰可以發送廣播給相關的接收方。

ContentProvider 權限(應用於<provider> 標記)限制誰可以訪問 ContentProvider 中的數據。

11、自定義權限:在AndroidManifest.xml中使用一個或多個<permission> 元素聲明,可在組件上使用自定義權限。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章