Android動態許可權申請工具(包括懸浮窗)
為了保證APP正常執行, 動態許可權申請 是android比較常用的功能,由於每次都需要做申請、等待返回還有拒絕反饋等操作,比較麻煩,所以集成了一個比較簡單的動態許可權申請庫
整合方法:
Step 1. Add the JitPack repository to your build file
//Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
Step 2. Add the dependency
//Add the dependency dependencies { implementation 'com.github.tyhjh:PermissionUtil:v1.0.2' }
呼叫方法
傳入需要申請的許可權,然後在回撥中執行成功或者失敗的操作,用法如下:
PermissonUtil.checkPermission(MainActivity.this, new PermissionListener() { @Override public void havePermission() { Toast.makeText(MainActivity.this, "獲取成功", Toast.LENGTH_SHORT).show(); } @Override public void requestPermissionFail() { Toast.makeText(MainActivity.this, "獲取失敗", Toast.LENGTH_SHORT).show(); } }, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE});
以上的程式碼,實際效果如下

G_1120094339.gif-1951.8kB
需要動態申請的相關許可權
<!-- 聯絡人許可權 --> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 電話許可權 --> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.WRITE_CALL_LOG" /> <uses-permission android:name="android.permission.USE_SIP" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" /> <!-- 日曆許可權 --> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <!-- 相機許可權 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 感測器許可權 --> <uses-permission android:name="android.permission.SENSORS" /> <!-- 位置許可權 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 儲存許可權 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 錄音許可權 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 簡訊許可權 --> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" /> <uses-permission android:name="android.permission.RECEIVE_MMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.READ_CELL_BROADCASTS" />
具體實現
先判斷每個許可權是否已經拿到,都拿到的話就返回正確,沒有的話再進入 PermissionsActivity 去申請許可權
public static voidcheckPermission(Activity activity, PermissionListener listener, String... permissions) { permissionListener = listener; mPermissionsChecker = new PermissionsChecker(activity); // 缺少許可權時, 進入許可權配置頁面 if (permissions != null && mPermissionsChecker.lacksPermissions(permissions)) { PermissionsActivity.startActivityForResult(activity, PERMISSIONS_REQUEST_CODE, permissions); activity.overridePendingTransition(0, 0); return; } permissonResult(true); }
判斷是否已獲取許可權
// 判斷是否缺少許可權 private boolean lacksPermission(String permission) { return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_DENIED; }
在PermissionsActivity中取申請每個許可權
@Override protected void onResume() { super.onResume(); if (isRequireCheck) { String[] permissions = getPermissions(); if (mChecker.lacksPermissions(permissions)) { requestPermissions(permissions); // 請求許可權 } else { allPermissionsGranted(); // 全部許可權都已獲取 } } else { isRequireCheck = true; } } /** * 使用者許可權處理, * 如果全部獲取, 則直接過. * 如果許可權缺失, 則提示Dialog. * * @param requestCode請求碼 * @param permissions許可權 * @param grantResults 結果 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) { isRequireCheck = true; } else { isRequireCheck = false; showMissingPermissionDialog(); } }
在 onResume 中取申請每個許可權,在 onRequestPermissionsResult 方法中判斷許可權是否獲取完成。獲取完許可權則反饋完成,進行完成的操作;沒完全獲取則彈窗提示手動開啟,點選設定到應用設定介面設定許可權,返回時候會在 onResume 中再次判斷許可權;點選取消則獲取失敗,進行反饋,執行失敗後操作
// 請求許可權 private void requestPermissions(String... permissions) { ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE); }
懸浮窗許可權申請
使用方法
FloatWindowManager.getInstance().applyOrShowFloatWindow(MainActivity.this);
懸浮窗許可權有點特殊,而且根據不同的手機還不一樣,所以有些麻煩,也是網上找到的一個很好的工具,適配了很多的機型,這裡單獨寫了出來,也新增到我的許可權申請的工具裡面
總結
其實就是新建一個 Activity ,將主題設定為透明並且取消切換動畫,讓使用者感覺在同一個介面內,然後在這裡面來處理許可權申請,並且返回處理結果
專案地址: ofollow,noindex">https://github.com/tyhjh/PermissionUtil
參考文章: https://blog.csdn.net/self_study/article/details/52859790