Android學習筆記(五十):聲明、請求和檢查許可

來源:互聯網
上載者:User

基於安全需求,應用對Android系統提供的content provider或者service的訪問需要在安裝時進行許可,這就是AndroidManifest.xml檔案中的permission中聲稱,之前已經很多例子。同樣如果其他應用要訪問我們的資料,我們也可以要求這些應用必須獲得使用者授權方可訪問我們的資料。

申請授權:請求permission

申請許可的格式為

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

Android系統所提供的均已android.permission開頭,具體的定義參見reference中Manifest.permission的定義。例如INTENET,WRITE_EXTERNAL_STORAGE, ACCESS_COARSE_LOCATION(粗定位)、ACCESS_FINE_LOCATION,CALL_PHONE。第三方應用將有他們定義自訂的許可。

在安裝的時候,系統會提示使用者是否同意許可。但是如果通過USB安裝,即開發模式,系統將不會出現提示。如果使用者不授權,將不被安裝和運行。如果在AndroidMenifest.xml中忘了申請授權,則會拋出SecurityException的異常資訊。

要求訪問者須獲得授權:聲明permission

如果應用有content provider或者服務,例如按有私人資訊,基於安全,同樣可要求對其他程式訪問進行安全控制。聲明permission比請求要複雜些,如下:

<!-- 包括三個部分:(1)android:name,為了避免出現衝突,使用應用的Java的命名空間作為首碼 -->
<permission android:name="com.wei.android.learning.READ_GRAVITY"
                     <!-- permission的標籤說明,簡單明了 -->
                     android:label="@string/read_gravity_label"
                     <!-- 對permission的進一步說明,比標籤要長和詳細 -->
                     android:description="@string/read_gravity_description" />

上面只是對這是個可能的permission進行定義,要真正起到保護還需要近一步聲明在那裡需要保護,可以通過下面兩種方式之一。

方式一:在AndroidManifest中表明要求強制許可

這種方式簡單。如果對於provider,有readPermission和writePermission,我們在上面已經將讀的許可進行了定義,可以被外部參考。例子如下:

<provider android:name=".GravityProvider" android:authorities="com.wei.android.learning.provider"
  android:readPermission="com.wei.android.learning.READ_GRAVITY"
  android:writePermission="com.wei.android.learning.WRITE_GRAVITY" />

若某個應用要通過這個content provider訪問資料,如果忘了在manifest中請求許可,運行則會報錯,如所示。


 

為了訪問該content provider,應用應在manifest中申請許可,在安裝時,使用者授權後,才能有許可權通過該provider來讀取資訊。本例如下:

<uses-permission android:name="com.wei.android.learning.READ_GRAVITY" />

除了provider之外,activity,service,receiver都可以申明要求許可,增加參數android:permission即可,以activity為例,如下:

<activity  android:name=".xxxxx"  android:label="yyyyyy"  android:permission="com.wei.android.learning.MY_PERMISSION">
  <intent-filter>     … …   </intent-filter>
</activity>

對於安全架構而言,如果要求了聲明了permission,對於activity,沒有許可,則無法啟動該activity;對於service,沒有許可,則無法啟動、停止、綁定activity;對於Intent receiver,沒有許可,則會忽略通過sendBroadcast( )發送的訊息。

方式二:在代碼中聲明

我們也可以在代碼中要求檢查許可權。請注意,仍需在manifest中對許可權進行聲明。我們仍以content Provider為例子。我們首先在manifest中聲明一個新的permission:<user-permission andriod:name="com.wei.android.learning.MYTEST">。我們將在讀資料時進行檢查。

public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder){ 
    if ( getContext().checkCallingPermision(“com.wei.android.leanring.MYTEST”) !=PackageManager.PERMISSION_GRNTED )  
       throw new SecurityException(“Required <com.wei.android.learning.MYTEST> Permission”);
    }
    … …
}

也可用於service,或者在sendBroadcast( )中進行檢查。對於service,如果提供多種層級的許可權,例如唯讀,讀寫,我們可以在代碼中根據許可權的層級進行處理,而在manifest中只能提供一種許可權,對於多種許可權,考慮在代碼中區分。對於sendBroadcast( ),如果沒有獲得許可權,則不能接收該廣播訊息。

一些注意

由於是否獲得許可不是在編譯時間檢查,而是在運行是發現,如果我們提供的API要求許可,包括content provider,service,將被其他activity調取的intent,都應當在文檔中聲明。另外,我們也應當詳細告知使用者,使他們在安裝時給予許可。這也就是為何在permission聲明中使用了@string/xxxx的方式,方便多國語言的使用。

Android系統有時會增加一些許可,而之前版本是沒有,這會造成以前編寫程式的許可授權問題。Android的解決方式如下,在manifest中定義最新版本x:<uses-sdk android:minSdkVersion="x">,例如x=3,表明應用定義的最低版本為Android 1.5版本,那麼在安裝時,系統自動將以後增添的許可全列上,請求使用者授權。

Android的許可方式也有一定的限制。例如所有的許可必須在安裝時被授權,哪怕極少使用到的許可,不能在以後授權;使用者授權只能同意或者不同意,沒有可選的授權方式,例如授權一部分,不授權另一部分。

相關連結:
我的Android開發相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.