動態獲取許可權的封裝
阿新 • • 發佈:2018-11-25
一. PermissionUtil 申請許可權工具類
沒有處理的問題:
1.將請求碼和Callback放到Map中,不會被覆蓋
2.沒有處理使用者點選許可權不再詢問時,做出相應的提示
import android.app.Activity; import android.content.pm.PackageManager; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.util.Log; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class PermissionUtil { private Activity mActivity; private int mReqCode;//請求碼 private CallBack mCallBack; public static interface CallBack { void grandAll();//所有必要許可權已經申請了,可以跳到主介面 void denied();//存在沒有獲取的許可權,則直接退出程式 } public PermissionUtil(Activity activity) { mActivity = activity; } /** * 申請許可權的方法 * * @param needPermissions * @param reqCode * @param callBack */ @RequiresApi(api = Build.VERSION_CODES.M) public void request(List<String> needPermissions, int reqCode, CallBack callBack) { if (mActivity == null) { throw new IllegalArgumentException("activity is null"); } //如果機器sdk小於23不需要動態獲取許可權 if (Build.VERSION.SDK_INT < 23) { callBack.grandAll();//預設全部許可權已經授予 return; } mReqCode = reqCode; mCallBack = callBack; //存放仍需要獲取的許可權 List<String> reqPermissions = new ArrayList<>(); for (String permission : needPermissions) { Log.e("TAG", needPermissions + "0"); if (mActivity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { //如果許可權還沒被獲取,則新增進來 reqPermissions.add(permission); Log.d("TAG", reqPermissions + "1"); } } //如果存放仍需要獲取的許可權為空,則意味著所有許可權都被授予了 if (reqPermissions.isEmpty()) { callBack.grandAll(); Log.d("TAG", reqPermissions + "2"); return; } //如果不為空,要將這個需要請求的許可權,提示授予 mActivity.requestPermissions(reqPermissions.toArray(new String[]{}), reqCode); } /** * 處理許可權後返回的回撥 * 1.當用戶執行完獲取許可權的操作後的回撥 * 提示它還有哪些許可權沒有被獲取 */ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == mReqCode) { boolean grantAll = true; for (int i = 0; i < grantResults.length; i++) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { grantAll = false; Toast.makeText(mActivity, permissions[i] + "未授權", Toast.LENGTH_SHORT).show(); break; } } if (grantAll) {//如果全部都授權了 mCallBack.grandAll(); } else { mCallBack.denied(); } } } }
二、閃屏頁的許可權判斷,授予了所有必要許可權才會跳轉到主介面
SplashActivity.java
import android.Manifest; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import java.util.ArrayList; import java.util.List; /** * 動態申請許可權的介面 * 1.放在第一個啟動的介面(在AndroidManifest.xml中配置) */ public class SplashActivity extends AppCompatActivity { //定義所有需要申請的許可權 public static List<String> sNeedReqPermissions = new ArrayList<>(); private PermissionUtil mPermissionUtil; static { //靜態程式碼塊中新增許可權 sNeedReqPermissions.add(Manifest.permission.READ_PHONE_STATE); sNeedReqPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION); sNeedReqPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); sNeedReqPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); sNeedReqPermissions.add(Manifest.permission.ACCESS_WIFI_STATE); sNeedReqPermissions.add(Manifest.permission.READ_PHONE_STATE); sNeedReqPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE); } @RequiresApi(api = Build.VERSION_CODES.M) @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPermissionUtil = new PermissionUtil(this); mPermissionUtil.request(sNeedReqPermissions, 100, new PermissionUtil.CallBack() { @Override public void grandAll() { toMainActivity(); finish(); } @Override public void denied() { finish();//直接finish } }); } //跳轉到第二個節目 private void toMainActivity() { startActivity(new Intent(this, BaiduMapActivity.class)); } /** * 用來返回給申請工具類來做具體回撥 * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); mPermissionUtil.onRequestPermissionsResult(requestCode, permissions, grantResults); } }