Android 6.0(API 23) 運行時權(quán)限(二)之權(quán)限申請

Android M

上一篇中簡單介紹了運行時權(quán)限借跪,今天就講講怎么去申請權(quán)限。這個項目中本來用了一個第三方的權(quán)限框架酌壕,但是不太好用掏愁,我就在github上選擇了start最多的PermissionsDispatcher 歇由。這個框架非常好用,下面來了解下它的用法果港。

配置

首先呢就是在項目的build.gradle文件里添加

dependencies {
  compile("com.github.hotchemi:permissionsdispatcher:${latest.version}") {
      // if you don't use android.app.Fragment you can exclude support for them
      exclude module: "support-v13"
  }
  annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:${latest.version}"
}
repositories {
  jcenter()
  maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
}

其中${latest.version}要換成版本號沦泌,當(dāng)前最新的版本號為3.0.1 。Rebuild一下工程就好了辛掠。

介紹

注解 是否必須 描述
@RuntimePermissions ? 注冊一個 Activity 或 Fragment 用于處理權(quán)限
@NeedsPermission ? 注解一個方法谢谦,說明需要什么權(quán)限(一個或多個)
@OnShowRationale 注解一個方法,解釋為什么需要這些權(quán)限
@OnPermissionDenied 注解一個方法萝衩,當(dāng)用戶拒絕授權(quán)時將調(diào)用該方法
@OnNeverAskAgain 注解一個方法回挽,當(dāng)用戶選擇了 "不再提醒" 將調(diào)用該方法

示例

@RuntimePermissions
public class UserInfoTokenActivity extends BaseActivity{
    ...
    @NeedsPermission(Manifest.permission.CAMERA)
    void openCamera() {
        UtilTools.getImageFromCamera(this);
    }

    @OnShowRationale(Manifest.permission.CAMERA)
    void showRationale(final PermissionRequest request) {
        request.proceed();
    }

    @OnPermissionDenied(Manifest.permission.CAMERA)
    void showDeniedForStorage() {
        AppUtils.showRequestPermissionDialog(this, String.format(
                getString(R.string.camera_permission_message), getString(R.string.app_name)));
    }

    @OnNeverAskAgain(Manifest.permission.CAMERA)
    void showNeverAskForStorage() {
        AppUtils.showRequestPermissionDialog(this, String.format(
                getString(R.string.camera_permission_message), getString(R.string.app_name)));
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        UserInfoTokenActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }
    ...
}

注意:

  • 類前加RuntimePermissions注解;
  • 加注解的方法千萬不要寫成private
  • OnShowRationale注解的方法有參數(shù)猩谊,開始我沒注意千劈,怎么也不能生成UserInfoTokenActivityPermissionsDispatcher這個類;
  • 不要直接調(diào)用注解的方法牌捷,要通過如下方式調(diào)用:
UserInfoTokenActivityPermissionsDispatcher.
                                        openCameraWithPermissionCheck(UserInfoTokenActivity.this);

效果

調(diào)用需要權(quán)限的方法(用NeedsPermission注解的)時墙牌,如果已經(jīng)授予該權(quán)限,直接執(zhí)行這個方法暗甥,如果沒有該權(quán)限喜滨,會彈出授權(quán)提示框:


權(quán)限請求

點擊按鈕會執(zhí)行OnShowRationale注解的方法,我這個里邊就讓方法繼續(xù)執(zhí)行了撤防,即顯示拍照虽风。如果點擊“拒絕”就會執(zhí)行OnPermissionDenied注解的方法,我這個方法里是仿照微信寫的即碗,彈出提示框焰情,如下:


拒絕提示框

其中,AppUtils代碼如下:
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.provider.Settings;
import android.support.v4.content.ContextCompat;

/**
 * 作者:WangJintao
 * 時間:2017/10/13
 * 郵箱:wangjintao1988@163.com
 */

public class AppUtils {

    public static void showRequestPermissionDialog(final Context context, String message) {
        AlertDialog dialog = new AlertDialog.Builder(context).setPositiveButton(context.getString(R.string.go_setting), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //打開應(yīng)用列表
                AppUtils.openAppSettingList(context);
                dialog.dismiss();
            }
        })
                .setNegativeButton(context.getString(R.string.cancel), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setCancelable(false)
                .setMessage(message)
                .setTitle(R.string.permission_title)
                .show();
        //設(shè)置按鈕顏色
      dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(context, R.color.black));
      dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.main_color));
    }
    public static void openAppSettingList(Context context) {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

點擊“不再詢問”執(zhí)行OnNeverAskAgain注解的方法剥懒,參考微信執(zhí)行的也是彈出提示框内舟。

關(guān)于應(yīng)用安裝時權(quán)限申請的說明

在我這個APP里,定位和電話權(quán)限是必須的初橘,所以安裝后就必須申請验游,PermissionsDispatcher可以同時申請多個權(quán)限,但是我沒這樣用保檐,我還是用的一個個申請耕蝉,先去申請電話權(quán)限,如果用戶點擊“拒絕”彈出提示框夜只,用戶再點擊提示框中的取消垒在,就關(guān)閉這個APP,點擊去設(shè)置再跳轉(zhuǎn)到設(shè)置界面扔亥,如果開始用戶就點擊了“允許”场躯,然后再去申請定位權(quán)限谈为,運行效果與微信一致。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踢关,一起剝皮案震驚了整個濱河市伞鲫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌签舞,老刑警劉巖秕脓,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儒搭,居然都是意外死亡吠架,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門师妙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诵肛,“玉大人,你說我怎么就攤上這事默穴≌荩” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵蓄诽,是天一觀的道長薛训。 經(jīng)常有香客問我,道長仑氛,這世上最難降的妖魔是什么乙埃? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮锯岖,結(jié)果婚禮上介袜,老公的妹妹穿的比我還像新娘。我一直安慰自己出吹,他們只是感情好遇伞,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捶牢,像睡著了一般鸠珠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秋麸,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天渐排,我揣著相機與錄音,去河邊找鬼灸蟆。 笑死驯耻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播可缚,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼孽水,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了城看?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤杏慰,失蹤者是張志新(化名)和其女友劉穎测柠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘滥,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡轰胁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朝扼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赃阀。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖擎颖,靈堂內(nèi)的尸體忽然破棺而出榛斯,到底是詐尸還是另有隱情,我是刑警寧澤搂捧,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布驮俗,位于F島的核電站,受9級特大地震影響允跑,放射性物質(zhì)發(fā)生泄漏王凑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一聋丝、第九天 我趴在偏房一處隱蔽的房頂上張望索烹。 院中可真熱鬧,春花似錦弱睦、人聲如沸百姓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓣戚。三九已至,卻和暖如春焦读,著一層夾襖步出監(jiān)牢的瞬間子库,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工矗晃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仑嗅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像仓技,于是被迫代替她去往敵國和親鸵贬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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