android 6.0及以上權(quán)限申請和封裝

1.引入說明

  • 背景:Android6.0開始藍牙需要位置權(quán)限才能掃描到設(shè)備荠诬;位置權(quán)限屬于敏感權(quán)限妒潭,需要動態(tài)申請诺祸,用戶授權(quán)着帽;

2.官方權(quán)限說明使用

  • 1.判斷權(quán)限是否被授予杂伟,沒有則申請
 int checkCameraPermission =  ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA);

    if (checkCameraPermission != PackageManager.PERMISSION_GRANTED) {
    /*
        用戶未授權(quán),谷歌推薦標(biāo)準(zhǔn)流程
    */
    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.CAMERA)) {
        //Show an expanation to the user asynchronously.說明請求原因,之前被用戶拒絕過
        showRequestPermissionRationale("請授權(quán)", new DialogInterface.OnClickListener(){
            @Override 
            public void onClick(DialogInterface dialog, int which) {
                //點擊確定時再次申請權(quán)限
                requestPermissions(new String[] { Manifest.permission.CAMERA},REQUEST_PERMISSION_CAMERA);
                    }
                });
    } else {
        //第一次申請時,請求授權(quán)
        requestPermissions(new String[] { Manifest.permission.CAMERA },REQUEST_PERMISSION_CAMERA);
    }
}

注意:shouldShowRequestPermissionRationale()方法仍翰,用戶在設(shè)置里取消了授權(quán), 或之前拒絕請求過 時返回true赫粥。第一次詢問 , check了不再詢問 時返回false。

  • 2.onRequestPermissionsResult方法中接受返回值并進行判斷:
@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_PERMISSION_CAMERA:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted,
                LogUtil.d("Camera Granted");
            } else {
                // permission denied
                LogUtil.d("Camera Denied");
                Toast.makeText(mContext, "未授權(quán)", Toast.LENGTH_SHORT).show();
                }
            }
            break;
    }
}

3.封裝權(quán)限開源介紹

貼一下使用sample代碼予借,下載使用代碼程序運行一遍看下流程越平,然后根據(jù)注解使用查看即可:

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,
                                                               EasyPermissions.RationaleCallbacks{

    private static final String TAG = "MainActivity";
    private static final String[] LOCATION_AND_CONTACTS =
            {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CONTACTS};

    private static final int RC_CAMERA_PERM = 123;
    private static final int RC_LOCATION_CONTACTS_PERM = 124;

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

        // Button click listener that will request one permission.
        findViewById(R.id.button_camera).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cameraTask();
            }
        });

        // Button click listener that will request two permissions.
        findViewById(R.id.button_location_and_contacts).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                locationAndContactsTask();
            }
        });
    }

    private boolean hasCameraPermission() {
        return EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA);
    }

    private boolean hasLocationAndContactsPermissions() {
        return EasyPermissions.hasPermissions(this, LOCATION_AND_CONTACTS);
    }

    private boolean hasSmsPermission() {
        return EasyPermissions.hasPermissions(this, Manifest.permission.READ_SMS);
    }

    private boolean hasStoragePermission() {
        return EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }

    @AfterPermissionGranted(RC_CAMERA_PERM)
    public void cameraTask() {
        if (hasCameraPermission()) {
            // Have permission, do the thing!
            Toast.makeText(this, "TODO: Camera things", Toast.LENGTH_LONG).show();
        } else {
            // Ask for one permission
            EasyPermissions.requestPermissions(
                    this,
                    getString(R.string.rationale_camera),
                    RC_CAMERA_PERM,
                    Manifest.permission.CAMERA);
        }
    }

    @AfterPermissionGranted(RC_LOCATION_CONTACTS_PERM)
    public void locationAndContactsTask() {
        if (hasLocationAndContactsPermissions()) {
            // Have permissions, do the thing!
            Toast.makeText(this, "TODO: Location and Contacts things", Toast.LENGTH_LONG).show();
        } else {
            // Ask for both permissions
            EasyPermissions.requestPermissions(
                    this,
                    getString(R.string.rationale_location_contacts),
                    RC_LOCATION_CONTACTS_PERM,
                    LOCATION_AND_CONTACTS);
        }
    }

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

        // EasyPermissions handles the request result.
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

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

    @Override
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
        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 AppSettingsDialog.Builder(this).build().show();
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
            String yes = getString(R.string.yes);
            String no = getString(R.string.no);

            // Do something after user returned from app settings screen, like showing a Toast.
            Toast.makeText(
                    this,
                    getString(R.string.returned_from_app_settings_to_activity,
                              hasCameraPermission() ? yes : no,
                              hasLocationAndContactsPermissions() ? yes : no,
                              hasSmsPermission() ? yes : no),
                    Toast.LENGTH_LONG)
                    .show();
        }
    }

    @Override
    public void onRationaleAccepted(int requestCode) {
        Log.d(TAG, "onRationaleAccepted:" + requestCode);
    }

    @Override
    public void onRationaleDenied(int requestCode) {
        Log.d(TAG, "onRationaleDenied:" + requestCode);
    }
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末频蛔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秦叛,更是在濱河造成了極大的恐慌晦溪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣跋,死亡現(xiàn)場離奇詭異三圆,居然都是意外死亡,警方通過查閱死者的電腦和手機避咆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門舟肉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人查库,你說我怎么就攤上這事度气。” “怎么了膨报?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長适荣。 經(jīng)常有香客問我现柠,道長,這世上最難降的妖魔是什么弛矛? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任够吩,我火速辦了婚禮,結(jié)果婚禮上丈氓,老公的妹妹穿的比我還像新娘周循。我一直安慰自己,他們只是感情好万俗,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布湾笛。 她就那樣靜靜地躺著,像睡著了一般闰歪。 火紅的嫁衣襯著肌膚如雪嚎研。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天库倘,我揣著相機與錄音临扮,去河邊找鬼。 笑死教翩,一個胖子當(dāng)著我的面吹牛杆勇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饱亿,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚜退,長吁一口氣:“原來是場噩夢啊……” “哼闰靴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起关霸,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤传黄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后队寇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膘掰,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年佳遣,在試婚紗的時候發(fā)現(xiàn)自己被綠了识埋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡零渐,死狀恐怖窒舟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诵盼,我是刑警寧澤惠豺,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站风宁,受9級特大地震影響洁墙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戒财,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一热监、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饮寞,春花似錦孝扛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慌申,卻和暖如春盈简,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背太示。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工柠贤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人类缤。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓臼勉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親餐弱。 傳聞我的和親對象是個殘疾皇子宴霸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容