Android 敏感權限申請


動態權限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用戶當前APP所需要的權限,防止濫用。這些權限一般分為三種: (1)普通權限:直接manifest清單文件中寫上注冊就行了 (2)危險權限:需要動態申請 (3)特殊權限:此處暫不說明。
注意:這里我們就按照原生,和git上比較出名的第三方權限管理工具,EasyPermissions和RxPermissions


Android 權限管理(原生、EasyPermissions、RxPermissions)
https://www.jianshu.com/p/734ad53eb7b7

以下是EasyPermissions的代碼樣例:基本形成閉環,就是禁止后二次打開彈框太丑,谷歌代碼的鍋

package com.example.testperms;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.List;

import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.EasyPermissions;
import pub.devrel.easypermissions.PermissionRequest;

public class MainActivity extends AppCompatActivity  implements EasyPermissions.PermissionCallbacks {

    private String TAG = "MainActivity";
    private static final int REQUEST_CODE_RUNTIME_PERMS = 0;
    boolean isDenied = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        methodRequiresTwoPermission();
    }

    @AfterPermissionGranted(REQUEST_CODE_RUNTIME_PERMS)
    private void methodRequiresTwoPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (EasyPermissions.hasPermissions(this, perms)) {
                // Already have permission, do the thing
                // ...
            } else {
                // Do not have permissions, request them now
                EasyPermissions.requestPermissions(this, "文件讀寫權限",
                        REQUEST_CODE_RUNTIME_PERMS, perms);
//                EasyPermissions.requestPermissions(
//                        new PermissionRequest.Builder(this, REQUEST_CODE_RUNTIME_PERMS, perms)
//                                .setRationale(R.string.str_rw_perms)
//                                .setPositiveButtonText(R.string.rationale_ask_ok)
//                                .setNegativeButtonText(R.string.rationale_ask_cancel)
////                                .setTheme(R.style.Theme_AppCompat)
//                                .build());
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
        if (requestCode == REQUEST_CODE_RUNTIME_PERMS) {
            // 成功獲取運行時授權
        } else {
            // 獲取運行時權限失敗
        }
    }

    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());

    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
//        methodRequiresTwoPermission();
        Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());

        // (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
        // This will display a dialog directing them to enable the permission in app settings.
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            new AlertDialog.Builder(this)
                    .setTitle("權限提示")
                    .setMessage("本項認證需要外置存儲權限,點擊確認后在新頁面滑動到最下方,在權限管理處,開啟外置存儲權限")
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    })
                    .setPositiveButton("確認", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 跳轉到APP設置頁面
                            Intent intent = new Intent();
                            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getPackageName(), null);
                            intent.setData(uri);
                            startActivity(intent);
                        }
                    })
                    .create().show();
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM