Android之API 23動態獲取許可權完美解決
阿新 • • 發佈:2019-02-02
首先感謝CSDN給予我們這個共同交流,共同學習的機會。 其次感謝其他大神技術的共享。 下面呢就開始我們的學習之旅啦,開車了。
Android 6.0 相比之前的Android版本有一個很大的不同點,就是動態獲取許可權。今天自己在做拍照功能時,正好遇到這個問題, 順便記錄下在Android 6.0 上如何動態獲取許可權。
1:需要建立,許可權檢查工具類。
public class PermissionsChecker {
private final Context mContext;
public PermissionsChecker(Context context) {
mContext = context.getApplicationContext();
}
// 判斷許可權集合
public boolean lacksPermissions(String... permissions) {
for (String permission : permissions) {
if (lacksPermission(permission)) {
return true;
}
}
return false;
}
// 判斷是否缺少許可權
private boolean lacksPermission(String permission) {
return ContextCompat.checkSelfPermission(mContext, permission) ==
PackageManager.PERMISSION_DENIED;
}
}
2:建立一個許可權授權activity,像之前動態授權,如果使用者不同意授權就會,退出軟體,我這塊呢做了一個彈框,如果拒絕彈出提示,並且點選點選設定可以跳轉到系統許可權設定頁面進行設定,按返回並且,可以回到軟體。
- 1.執行在6.0裝置,動態確認許可權
2.當用戶點選拒絕,彈出框提示使用者
3點選設定進入,系統許可權設定頁面
如果這裡使用者沒有設定許可權,返回的話,就會把以上的步驟重新來一遍,如果全部設定許可權之後,返回後直接進入APP。
public class PermissionsActivity extends AppCompatActivity {
public static final int PERMISSIONS_GRANTED = 0; // 許可權授權
public static final int PERMISSIONS_DENIED = 1; // 許可權拒絕
private static final int PERMISSION_REQUEST_CODE = 0; // 系統許可權管理頁面的引數
private static final String EXTRA_PERMISSIONS =
"me.chunyu.clwang.permission.extra_permission"; // 許可權引數
private static final String PACKAGE_URL_SCHEME = "package:"; // 方案
private PermissionsChecker mChecker; // 許可權檢測器
private boolean isRequireCheck; // 是否需要系統許可權檢測
// 啟動當前許可權頁面的公開介面
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需要使用靜態startActivityForResult方法啟動!");
}
setContentView(授權介面的view);
mChecker = new PermissionsChecker(this);
isRequireCheck = true;
}
@Override protected void onResume() {
super.onResume();
if (isRequireCheck) {
String[] permissions = getPermissions();
if (mChecker.lacksPermissions(permissions)) {
requestPermissions(permissions); // 請求許可權
} else {
allPermissionsGranted(); // 全部許可權都已獲取
}
} else {
isRequireCheck = true;
}
}
// 返回傳遞的許可權引數
private String[] getPermissions() {
return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
}
// 請求許可權相容低版本
private void requestPermissions(String... permissions) {
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
}
// 全部許可權均已獲取
private void allPermissionsGranted() {
setResult(PERMISSIONS_GRANTED);
finish();
}
/**
* @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;
allPermissionsGranted();
} else {
isRequireCheck = false;
showMissingPermissionDialog();
}
}
// 所有全部的許可權
private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
// 顯示缺失許可權提示
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);
builder.setTitle("提示");
builder.setMessage("當前應用缺少必要許可權。請點選設定-許可權-開啟所有許可權。最後點選兩次後退按鈕,即可返回。");
// 拒絕, 退出應用
builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setResult(PERMISSIONS_DENIED);
finish();
}
});
builder.setPositiveButton("設定", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
});
builder.show();
}
// 啟動應用的設定
private void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
startActivity(intent);
}
}
3:現在是在所需許可權的Activity的加入的程式碼
//這些許可權呢,是在所需的Activity建立陣列並寫入(在manifests中一定要加入對應許可權否則會報錯)
static final String[] PERMISSIONS = new String[]{
Manifest.permission.CAMERA
};
@Override
protected void onResume() {
super.onResume();
// 缺少許可權時, 進入許可權配置頁面
if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
startPermissionsActivity();
}
}
//開啟上面有彈框的activity
private void startPermissionsActivity() { PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 拒絕時,程式退出
if (requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {
finish();
}
}
大家在使用以下許可權過程,一定要記得動態獲取。
今天就到這裡,有什麼不足,大家可以儘管評論在下方。 謝謝大家的支援。