Android 動(dòng)態(tài)權(quán)限申請(qǐng)工具類

這個(gè)工具類優(yōu)點(diǎn):可以在能拿到Context的任意地方去申請(qǐng)權(quán)限,不用依賴activity的onRequestPermissionsResult回調(diào)方法獲取返回結(jié)果。

使用的代碼看下面:
//可以一次申請(qǐng)一個(gè)或多個(gè)權(quán)限字币,而且只需下面這一段代碼就行了延赌,
//不需要在其他地方額外再加代碼,很簡(jiǎn)單有木有
AppPermissionUtil.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new AppPermissionUtil.OnPermissionListener() {
                @Override
                public void onPermissionGranted() {
                    //授權(quán)
                }

                @Override
                public void onPermissionDenied() {
                    //沒有授權(quán)噩斟,或者有一個(gè)權(quán)限沒有授權(quán)
                }
            });

下面是工具類代碼库倘,一共兩個(gè)類

import android.content.Context;
import android.os.Build;

/**
 * 新版動(dòng)態(tài)權(quán)限申請(qǐng)類
 * 說明:不用依賴activity接收回調(diào)临扮,可以再任意地方請(qǐng)求權(quán)限
 * Created by yangqin on 2018/5/28.
 */

public class AppPermissionUtil {

    /**
     * 去請(qǐng)求所有權(quán)限
     * @param context
     * @param permissions 需要請(qǐng)求的權(quán)限列表
     * @param listener 請(qǐng)求權(quán)限回調(diào)
     */
    public static void requestPermissions(Context context, String[] permissions, OnPermissionListener listener) {
        if(context==null||listener==null){
            throw new NullPointerException("context參數(shù)為空,或者listener參數(shù)為空");
        }

        if (Build.VERSION.SDK_INT <= 22) {
            //SDK小于22之前的版本之前發(fā)返回權(quán)限允許
            listener.onPermissionGranted();
        } else {
            //打開一個(gè)一像素的activity去請(qǐng)求權(quán)限教翩,并回調(diào)返回結(jié)果
            RequestPermissionsHelpActivity.start(context,permissions,listener);
        }
    }

    public interface OnPermissionListener {

        void onPermissionGranted();//授權(quán)

        void onPermissionDenied();//拒絕
    }
}

import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 動(dòng)態(tài)請(qǐng)求權(quán)限幫助activity杆勇,與AppPermissionUtil聯(lián)用。
 * 注:這個(gè)不是我們app的頁面饱亿,所有不要輕易改動(dòng)蚜退。
 */
public class RequestPermissionsHelpActivity extends AppCompatActivity {

    private int requestCode;

    //設(shè)計(jì)兩個(gè)OnPermissionListener的原因是闰靴,有效緩解并發(fā)請(qǐng)求權(quán)限時(shí),OnPermissionListener公用一個(gè)會(huì)引發(fā)回調(diào)錯(cuò)亂或沒法回調(diào)的問題
    private static AppPermissionUtil.OnPermissionListener transferOnPermissionListener;//這個(gè)靜態(tài)變量充當(dāng)一個(gè)傳遞者的角色,傳遞給mOnPermissionListener變量后关霸,就釋放引用了

    private AppPermissionUtil.OnPermissionListener mOnPermissionListener;//這個(gè)才是我們每次權(quán)限請(qǐng)求使用的回調(diào)監(jiān)聽

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //1像素的activity
        Window window = getWindow();
        window.setGravity(Gravity.LEFT | Gravity.TOP);
        WindowManager.LayoutParams params = window.getAttributes();
        params.x = 0;
        params.y = 0;
        params.height = 1;
        params.width = 1;
        window.setAttributes(params);

        //獲取界面?zhèn)鬟^來的值
        getIntentData();
    }

    private void getIntentData(){
        //獲取傳遞過來回調(diào)監(jiān)聽
        mOnPermissionListener=transferOnPermissionListener;
        transferOnPermissionListener=null;
        //傳過來的需要申請(qǐng)的權(quán)限
        String[] permissions=getIntent().getStringArrayExtra("permissions");
        if(permissions!=null&&permissions.length>0){
            requestPermissions(permissions);
        }else {
            //手動(dòng)報(bào)錯(cuò)提示
            throw new NullPointerException("申請(qǐng)的權(quán)限列表不能為空!");
        }
    }

    /**
     * 去申請(qǐng)所有權(quán)限
     * @param permissions
     */
    @TargetApi(Build.VERSION_CODES.M)
    private void requestPermissions(String[] permissions){
        Random random=new Random();
        requestCode=random.nextInt(1000);
        List<String> deniedPermissions = getDeniedPermissions(permissions);
        if (deniedPermissions.size() > 0) {
            //沒有授權(quán)過杰扫,去申請(qǐng)一下
            requestPermissions(deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
        } else {
            //都已經(jīng)授權(quán)過了
            if(mOnPermissionListener!=null)
                mOnPermissionListener.onPermissionGranted();
            if(!isFinishing()) {
                finish();
            }
        }
    }

    /**
     * 請(qǐng)求權(quán)限結(jié)果
     */
    public void requestPermissionsResult(int requestCode, int[] grantResults) {
        if (requestCode != -1 && requestCode == requestCode) {
            if (verifyPermissions(grantResults)) {
                //都授權(quán)了
                if(mOnPermissionListener!=null)
                    mOnPermissionListener.onPermissionGranted();
                finish();
            } else {
                //有一個(gè)未授權(quán)或者多個(gè)未授權(quán)
                if(mOnPermissionListener!=null)
                    mOnPermissionListener.onPermissionDenied();
                finish();
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //申請(qǐng)權(quán)限結(jié)果返回
        requestPermissionsResult(requestCode,grantResults);
    }

    /**
     * 獲取請(qǐng)求權(quán)限中需要授權(quán)的權(quán)限,有的可能已經(jīng)授權(quán)過了
     */
    private List<String> getDeniedPermissions(String[] permissions) {
        List<String> deniedPermissions = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED) {
                deniedPermissions.add(permission);
            }
        }
        return deniedPermissions;
    }

    /**
     * 驗(yàn)證所有權(quán)限是否都已經(jīng)授權(quán)
     */
    private static boolean verifyPermissions(int[] grantResults) {
        for (int grantResult : grantResults) {
            if (grantResult != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mOnPermissionListener=null;
    }

    /**
     * 啟動(dòng)activity队寇,并帶些必要參數(shù)過來
     * @param context
     * @param permissions 申請(qǐng)權(quán)限列表
     * @param listener 結(jié)果回調(diào)
     */
    public static void start(Context context, String[] permissions, AppPermissionUtil.OnPermissionListener listener){
        Intent intent = new Intent(context, RequestPermissionsHelpActivity.class);
        intent.putExtra("permissions",permissions);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);

        transferOnPermissionListener=listener;
    }
}
manifest也需要配置一下:
<activity
            android:name=".RequestPermissionsHelpActivity"
            android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
            android:theme="@style/transparencyActivityStyle" />
這個(gè)是activity的透明樣式:
 <style name="transparencyActivityStyle" parent="Theme.AppCompat">
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoDisplay">false</item>
        <item name="android:windowDisablePreview">true</item>
    </style>
最后就是一點(diǎn)透明顏色:
<color name="transparent">#00000000</color>

作者獨(dú)白:建一棟高樓,高樓的結(jié)構(gòu)沒有研究清楚章姓,卻一直在研究如何節(jié)省時(shí)間砌好一面墻佳遣。 哈哈哈,跑偏了 凡伊, 捂臉零渐。。系忙。诵盼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市银还,隨后出現(xiàn)的幾起案子风宁,更是在濱河造成了極大的恐慌,老刑警劉巖蛹疯,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戒财,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捺弦,警方通過查閱死者的電腦和手機(jī)饮寞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來列吼,“玉大人幽崩,你說我怎么就攤上這事∧浚” “怎么了歉铝?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凑耻。 經(jīng)常有香客問我太示,道長(zhǎng),這世上最難降的妖魔是什么香浩? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任类缤,我火速辦了婚禮,結(jié)果婚禮上邻吭,老公的妹妹穿的比我還像新娘餐弱。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布膏蚓。 她就那樣靜靜地躺著瓢谢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驮瞧。 梳的紋絲不亂的頭發(fā)上氓扛,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音论笔,去河邊找鬼采郎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狂魔,可吹牛的內(nèi)容都是我干的蒜埋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼最楷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼整份!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起籽孙,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤皂林,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蚯撩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體础倍,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年胎挎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沟启。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡犹菇,死狀恐怖德迹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揭芍,我是刑警寧澤胳搞,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站称杨,受9級(jí)特大地震影響肌毅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姑原,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一悬而、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锭汛,春花似錦笨奠、人聲如沸袭蝗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽到腥。三九已至,卻和暖如春蔚袍,著一層夾襖步出監(jiān)牢的瞬間乡范,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工页响, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篓足,地道東北人段誊。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓闰蚕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親连舍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子没陡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354