在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();
}
arrow
arrow
    文章標籤
    Android
    全站熱搜

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()