手動擷取判斷處理許可權,擷取判斷許可權
主要用到的幾個方法:
//檢查許可權int checkSelfPermission(String)//申請許可權void requestPermissions(int, String...)//是否應該顯示請求許可權的說明boolean shouldShowRequestPermissionRationale(String)//處理許可權結果回調void onRequestPermissionsResult(int,String[],int[])
是否有許可權常量標識:
PackageManager.PERMISSION_DENIED:拒絕了。PackageManager.PERMISSION_GRANTED:授權了
上述四個方法中,前三個方法在support-v4的ActivityCompat中都有,建議使用相容庫中的方法。最後一個方法是使用者授權或者拒絕某個許可權組時系統會回調Activity或者Fragment中的方法。
1. checkSelfPermission(String)
檢查許可權
1. 檢查某一個許可權的目前狀態,你應該在請求某個許可權時檢查這個許可權是否已經被使用者授權,已經授權的許可權重複申請可能會讓使用者產生厭煩。
2. 該方法有一個參數是許可權名稱,有一個int的傳回值,用這個值與上面提到的兩個常量做比較可判斷檢查的許可權當前的狀態。
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 沒有許可權,可以在這裡重新申請許可權。}else{ // 有許可權了。}
2. requestPermissions(int, String…)
申請許可權
請求使用者授權幾個許可權,調用後系統會顯示一個請求使用者授權的提示對話方塊,App不能配置和修改這個對話方塊,如果需要提示使用者這個許可權相關的資訊或說明,需要在調用 requestPermissions() 之前處理
該方法有兩個參數:
int requestCode: 會在回調onRequestPermissionsResult()時返回,用來判斷是哪個授權申請的回調。
String[] permissions: 許可權數組,你需要申請的的許可權的數組。
由於該方法是非同步,所以無傳回值,當使用者處理完授權操作時,會回調Activity或者Fragment的onRequestPermissionsResult()方法。
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, MMM);
3. onRequestPermissionsResult(int,String[],int[])
處理許可權結果回調
1. 該方法在Activity/Fragment中應該被重寫,當使用者處理完授權操作時,系統會自動回調該方法
2. 該方法有三個參數:
int requestCode: 在調用requestPermissions()時的第一個參數。
String[] permissions: 許可權數組,在調用requestPermissions()時的第二個參數。
int[] grantResults: 授權結果數組,對應permissions,具體值和上方提到的PackageManager中的兩個常量做比較。
@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MMM: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 許可權被使用者同意,可以做你要做的事情了。 } else { // 許可權被使用者拒絕了,可以提示使用者,關閉介面等等。 } return; } }}
4. shouldShowRequestPermissionRationale(String)
是否應該顯示請求許可權的說
1.第一次請求許可權時,使用者拒絕了,調用shouldShowRequestPermissionRationale()後返回true,應該顯示一些為什麼需要這個許可權的說明。
2.使用者在第一次拒絕某個許可權後,下次再次申請時,授權的dialog中將會出現“不再提醒”選項,一旦選中勾選了,那麼下次申請將不會提示使用者。
3.第二次請求許可權時,使用者拒絕了,並選擇了“不在提醒”的選項,調用shouldShowRequestPermissionRationale()後返回false。
4.裝置的策略禁止當前應用擷取這個許可權的授權:shouldShowRequestPermissionRationale()返回false 。
5.加這個提醒的好處在於,使用者拒絕過一次許可權後我們再次申請時可以提醒該許可權的重要性,面得再次申請時使用者勾選“不再提醒”並決絕,導致下次申請許可權直接失敗。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {// 沒有許可權。 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) { // 使用者拒絕過這個許可權了,應該提示使用者,為什麼需要這個許可權。 } else { // 申請授權。 ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MMM); }}...@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MMM: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 許可權被使用者同意。 } else { // 許可權被使用者拒絕了。 } return; } }}