編輯:關於Android編程
隨著android版本的不斷升級,現在開發App肯定都是需要適配6.0及其以上的版本了,Google對手機安全的越來越重視,我們開發者所要應對的主要就是新版本SDK帶來的一些變化,首先關注的就是權限機制的變化。關於權限機制的變化網上的內容很多參考android6.0運行權限處理本篇文章主要根據源碼來分析申請權限時一些注意的事項。
1、Activity.checkSelfPermission(String permission)
2、Activity.requestPermissions(@NonNull String[] permissions, int requestCode)
3、Activity.shouldShowRequestPermissionRationale(@NonNull String permission)
4、Activity.onRequestPermissionsResult(int requestCode, @NonNull String[] permissions@NonNull int[] grantResults)
第一個方法是解析你當前需要申請的權限是否是被通過的,如果是允許的就返回 PERMISSION_GRANTED,第二個方法是請求權限,第三個方法是判斷當前的權限狀態是否是已經被拒過一次了,它在你第一次拒絕請求權限之後和永遠拒絕權限之前這段時間內全部返回true,所以當用戶第一次拒絕權限之後再次請求時給用戶提示為什麼app需要這個權限、打消用戶的顧慮。第四個方法就不多說了,返回的是請求的結果。
本文主要分析的是requestPermissions這個 函數及其一些注意事項!
*/ public final void requestPermissions(@NonNull String[] permissions, int requestCode) { if (mHasCurrentPermissionsRequest) { Log.w(TAG, "Can reqeust only one set of permissions at a time"); // Dispatch the callback with empty arrays which means a cancellation. onRequestPermissionsResult(requestCode, new String[0], new int[0]); return; } Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions); startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null); mHasCurrentPermissionsRequest = true; }
這是android7.0的源碼裡面的。mHasCurrentPermissionsRequest這個是一個布爾值的flag,標記當前是否有正在請求的權限。因為方法是異步執行的,所以如果你在申請權限的時候連續兩次執行此方法,你會在方法第二次請求的時候他會直接執行onRequestPermissionsResult方法,返回的 permissions和grantResults都是長度為0的空數組,這是如果你在onRequestPermissionsResult不判斷長度直接取值會奔潰報數組越位,所以大家在返回結果處理的時候最好做一下長度不為0的判斷,最好不要在上次請求結果沒有返回的時候就再次執行新的權限請求,因為這樣是沒有意義的!
private void dispatchRequestPermissionsResult(int requestCode, Intent data) { mHasCurrentPermissionsRequest = false; // If the package installer crashed we may have not data - best effort. String[] permissions = (data != null) ? data.getStringArrayExtra( PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES) : new String[0]; final int[] grantResults = (data != null) ? data.getIntArrayExtra( PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS) : new int[0]; onRequestPermissionsResult(requestCode, permissions, grantResults); }
dispatchRequestPermissionsResult方法分發處理的結果,這時mHasCurrentPermissionsRequest重新置為false,表示當前沒有正在請求的權限!所以為了防止同時多次調用requestPermissions方法可以添加一個布爾值作判斷,實現代碼如下
private isRequesting=false; //做請求的統一入口 private void requestMyPermission(String[] permissions, int requestCode) { if (!isRequesting) { isRequesting = true; ActivityCompat.requestPermissions(this, permissions, requestCode); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(isRequesting&&permissions.length!=0){ isRequesting=false; //do you want } }
這樣就能避免連續多次請求導致無效請求和處理出錯的情況!
Added in API level 23
void requestPermissions (String[] permissions, int requestCode),需要api23及其之上才能使用的。而v4包中的requestPermissions方法沒有版本要求,end~
項目下載地址:https://github.com/Aiushtha/android-PictureSelector最早使用android調用系統拍照然後遇到很多空指針等
本來這篇文章是要寫寫我在設計高級跑馬燈程序的心得的,但是編寫過程中花了近一天多的時間搞明白canvas.drawText中的第三個參數[float y]代表的真實含義。學
一、閒話: Android原生的進度條可以根據不同的主題有不同的視覺效果,但任何一種主題下的進度條和應用程序的視覺配合起來都顯得格格不入,所以多數時候我們需要自定義Pro
一、概述本文之前,先提一下關於上篇博文的100多萬訪問量請無視,博文被刷,我也很郁悶,本來想把那個文章放到草稿箱,結果放不進去,還把日期弄更新了,實屬無奈。