Android 6.0權(quán)限適配問(wèn)題

在Android開(kāi)發(fā)中經(jīng)常會(huì)遇到Android系統(tǒng)適配問(wèn)題,出現(xiàn)這一問(wèn)題是因?yàn)锳ndroid6.0以后對(duì)系統(tǒng)的一些權(quán)限進(jìn)行了限制,而在開(kāi)發(fā)中經(jīng)常會(huì)用到這些權(quán)限,網(wǎng)上有 許多做法都是用到哪個(gè)權(quán)限就獲取哪個(gè)權(quán)限,這樣的做法會(huì)造成代碼的紊亂,今天帶來(lái)一種方法在獲取到系統(tǒng)權(quán)限的同時(shí)又不會(huì)造成系統(tǒng)業(yè)務(wù)代碼, 邏輯代碼的紊亂。

創(chuàng)建一個(gè)類(判斷是否缺少權(quán)限):

public class PermissionsChecker {
private final Context mContext;

public PermissionsChecker(Context context) {
    mContext = context.getApplicationContext();
}

// 判斷權(quán)限集合
public boolean lacksPermissions(String... permissions) {
    for (String permission : permissions) {
        if (lacksPermission(permission)) {
            return true;
        }
    }
    return false;
}

// 判斷是否缺少權(quán)限
private boolean lacksPermission(String permission) {
    return ContextCompat.checkSelfPermission(mContext, permission) ==
            PackageManager.PERMISSION_DENIED;
}


}

通過(guò)這個(gè)類的實(shí)例對(duì)象調(diào)用lacksPermissions()方法判斷是否缺少所需權(quán)限。

然后創(chuàng)建一個(gè)Activity,通過(guò)這個(gè)Activity彈出系統(tǒng)增加的權(quán)限的彈窗以及界面:

public class PermissionsActivity extends AppCompatActivity {
public static final int PERMISSIONS_GRANTED = 0; // 權(quán)限授權(quán)
public static final int PERMISSIONS_DENIED = 1; // 權(quán)限拒絕

private static final int PERMISSION_REQUEST_CODE = 0; // 系統(tǒng)權(quán)限管理頁(yè)面的參數(shù)
private static final String EXTRA_PERMISSIONS =
        "me.chunyu.clwang.permission.extra_permission"; // 權(quán)限參數(shù)
private static final String PACKAGE_URL_SCHEME = "package:"; // 方案

private PermissionsChecker mChecker; // 權(quán)限檢測(cè)器
private boolean isRequireCheck; // 是否需要系統(tǒng)權(quán)限檢測(cè)

// 啟動(dòng)當(dāng)前權(quán)限頁(yè)面的公開(kāi)接口
public static void startActivityForResult(Activity activity, int requestCode, String... permissions) {
    Intent intent = new Intent(activity, PermissionsActivity.class);
    intent.putExtra(EXTRA_PERMISSIONS, permissions);
    ActivityCompat.startActivityForResult(activity, intent, requestCode, null);
}

@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getIntent() == null || !getIntent().hasExtra(EXTRA_PERMISSIONS)) {
        throw new RuntimeException("PermissionsActivity需要使用靜態(tài)startActivityForResult方法啟動(dòng)!");
    }
    setContentView(R.layout.activity_permissions);

    mChecker = new PermissionsChecker(this);
    isRequireCheck = true;
}

@Override protected void onResume() {
    super.onResume();
    if (isRequireCheck) {
        String[] permissions = getPermissions();
        if (mChecker.lacksPermissions(permissions)) {
            requestPermissions(permissions); // 請(qǐng)求權(quán)限
        } else {
            allPermissionsGranted(); // 全部權(quán)限都已獲取
        }
    } else {
        isRequireCheck = true;
    }
}

// 返回傳遞的權(quán)限參數(shù)
private String[] getPermissions() {
    return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
}

// 請(qǐng)求權(quán)限兼容低版本
private void requestPermissions(String... permissions) {
    ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
}

// 全部權(quán)限均已獲取
private void allPermissionsGranted() {
    setResult(PERMISSIONS_GRANTED);
    finish();
}

/**
 * 用戶權(quán)限處理,
 * 如果全部獲取, 則直接過(guò).
 * 如果權(quán)限缺失, 則提示Dialog.
 *
 * @param requestCode  請(qǐng)求碼
 * @param permissions  權(quán)限
 * @param grantResults 結(jié)果
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
        isRequireCheck = true;
        allPermissionsGranted();
    } else {
        isRequireCheck = false;
        showMissingPermissionDialog();
    }
}

// 含有全部的權(quán)限
private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
    for (int grantResult : grantResults) {
        if (grantResult == PackageManager.PERMISSION_DENIED) {
            return false;
        }
    }
    return true;
}

// 顯示缺失權(quán)限提示
private void showMissingPermissionDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);
    builder.setTitle(R.string.help);
    builder.setMessage(R.string.string_help_text);

    // 拒絕, 退出應(yīng)用
    builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {
        @Override public void onClick(DialogInterface dialog, int which) {
            setResult(PERMISSIONS_DENIED);
            finish();
        }
    });

    builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
        @Override public void onClick(DialogInterface dialog, int which) {
            startAppSettings();
        }
    });

    builder.show();
}

// 啟動(dòng)應(yīng)用的設(shè)置
private void startAppSettings() {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
    startActivity(intent);
}

}

所需的Strings文件如下:

<string name="help">幫助</string>
<string name="string_help_text">當(dāng)前應(yīng)用缺少必要權(quán)限。\n\n請(qǐng)點(diǎn)擊\"設(shè)置\"-\"權(quán)限\"-打開(kāi)所需權(quán)限。\n\n最后點(diǎn)擊兩次后退按鈕,即可返回。</string>
<string name="quit">退出</string>
<string name="settings">設(shè)置</string>

所需的layout文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.maywide.cmms.gcableboss.util.PermissionsActivity">
</android.support.constraint.ConstraintLayout>

一般在程序啟動(dòng)時(shí)進(jìn)行權(quán)限判斷:

//權(quán)限數(shù)組
static final String[] PERMISSIONS = new String[]{
  Manifest.permission.WRITE_EXTERNAL_STORAGE,
  Manifest.permission.CAMERA,
  Manifest.permission.READ_EXTERNAL_STORAGE,
};
//檢測(cè)權(quán)限
private PermissionsChecker permissionsChecker;
private int REQUEST_CODE = 0;


permissionsChecker = new PermissionsChecker(this);

// 缺少權(quán)限時(shí), 進(jìn)入權(quán)限配置頁(yè)面
if (permissionsChecker.lacksPermissions(PERMISSIONS)) {
     startPermissionsActivity();
}


 /**
 * 權(quán)限檢測(cè)
 */
private void startPermissionsActivity() {
    PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容