在Android 6.0 以後由於安全性之考量,較為敏感之權限須特別告知請使用者同意開啟該權限.
而此一更動,導致開發者須自行針對不同權限需求進行確認.
稍有不慎就會導致APP崩潰.
因此本實驗透過讀取Androidmanifest.xml中請求之權限加以確認後,逐一詢問使用者是否允許該權限之開通.
以下為程式碼以及使用範例.
Code
package com.dev.lungyu; import android.Manifest; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; import android.os.Build; import android.support.annotation.RequiresApi; import android.support.v4.app.ActivityCompat; import android.util.Log; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * Created by lungyu on 9/13/17. */ public class PermissionManagement { private Context context; public PermissionManagement(Context context){ this.context = context; } //for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE" @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) public boolean hasPermission(String permission) { try { PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); if (info.requestedPermissions != null) { for (String p : info.requestedPermissions) { Log.d("requestedPermissions",p); if (p.equals(permission)) { return true; } } for (int ps : info.requestedPermissionsFlags) { Log.d("requestedPermissions",ps+""); } } } catch (Exception e) { e.printStackTrace(); } return false; } public List<String> getNotAllowPermission(){ PackageInfo info = null; List<String> notAllowList = new LinkedList<String>(); try { info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); if (info.requestedPermissions != null) { for (String permissionName : info.requestedPermissions) { Log.d("requestedPermissions",permissionName); if(!IsAllowPermission(permissionName)){ notAllowList.add(permissionName); } } } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return notAllowList; } private boolean IsAllowPermission(String permissionName){ int permission = ActivityCompat.checkSelfPermission(context, permissionName); if (permission != PackageManager.PERMISSION_GRANTED) { // 無權限,向使用者請求 return false; } return true; } }
使用範例
透過permissionManagment取得尚未被允許之權限清單.
若清單為空(無未允許之權限),則跳轉至其他畫面.
若尚有須允許之權限,則重組成String[] 後透過requestPermissions請求使用者同意開通權限
private static final int REQUEST_CODE_ASK = 1055; private void checkAllowAllPermission(){ PermissionManagement permissionManagement = new PermissionManagement(this); List<String> list = permissionManagement.getNotAllowPermission(); if(list.size() == 0){ directActivity(); return; } String[] reqs = new String[list.size()]; for(int i=0;i<reqs.length;i++) reqs[i] = list.get(i); ActivityCompat.requestPermissions( this, reqs, REQUEST_CODE_ASK ); } private void directActivity(){ //Intent intent = new Intent(this,LoginActivity.class); Intent intent = new Intent(this,MainActivity.class); startActivity(intent); finish(); }
文章標籤
全站熱搜