1. 程式人生 > >目前最流行的執行時許可權請求框架PermissionsDispatcher、RxPermissions和easypermissions的使用和對比

目前最流行的執行時許可權請求框架PermissionsDispatcher、RxPermissions和easypermissions的使用和對比

前言

  今天是2017年6月23日,到目前為止,Android6.0已經發布了兩年的時間,隨著時間的推移,Android6.0肯定會越來越普及,而6.0版本的一個重大改動就是增加了執行時許可權(動態許可權):一些危險的許可權不單止要在AndroidMainifest檔案宣告,還要在執行的時候使用程式碼來申請,讓使用者同意才進行授權。
  由於Android自帶的API使用起來(怎麼使用就不寫了,網上很多)比較麻煩,所以網上出現了一大堆簡化這個過程的開源庫,這裡選取目前最流行的三個開源庫(GitHub上Star最多)PermissionsDispatcher、RxPermissions和easypermissions進行體驗並對比他們的用法,瞭解一下這三個庫的功能,方便做出選擇。

本文篇幅較長,如果不想看下面對這三個庫的的使用的話,可以直接跳到結論。

準備工作

  這裡的demo使用一個Activity來測試每一種動態許可權請求框架,分別測試它們的請求單個許可權和請求多個許可權的功能:

  這裡檢查許可權的方法我採用了一個工具類封裝(由於PermissionsDispatcher、RxPermissions都沒帶有單純檢查許可權的功能,只有easypermissions有,這裡用一個工具類封裝一下檢查許可權的方法,返回我想要的字串):

public class PermissionsLogUtils {
    private static
StringBuffer logStringBuffer = new StringBuffer(); // 檢視許可權是否已申請 public static String checkPermissions(Context context,String... permissions) { logStringBuffer.delete(0,logStringBuffer.length()); for (String permission : permissions) { logStringBuffer.append(permission); logStringBuffer.append(" is applied? \n "
); logStringBuffer.append(isAppliedPermission(context,permission)); logStringBuffer.append("\n\n"); } return logStringBuffer.toString(); } //使用EasyPermissions檢視許可權是否已申請 public static String easyCheckPermissions(Context context,String ... permissions) { logStringBuffer.delete(0,logStringBuffer.length()); for (String permission : permissions) { logStringBuffer.append(permission); logStringBuffer.append(" is applied? \n "); logStringBuffer.append(EasyPermissions.hasPermissions(context,permission)); logStringBuffer.append("\n\n"); } return logStringBuffer.toString(); } // 檢視許可權是否已申請 private static boolean isAppliedPermission(Context context,String permission) { return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED; } }

  然後,還要在AndroidMainifest檔案宣告demoAPP用到的許可權,不在這裡申明的話,無論後面在程式碼怎麼動態申請,返回的結果都是許可權拒絕並不再詢問。

基於註解的PermissionsDispatcher

整合方式

  在app的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:2.4.0'
}

注意是把${latest.version}這整個換成最新版本號。

  或者直接使用外掛新增依賴,怎麼用外掛?下面有講。

使用

  PermissionsDispatcher是基於註解來寫的庫,基本原理就是你給你寫的一個方法加上一個註解,然後它就會在適當的時候呼叫這個被註解的方法(這種方法很有趣,讓程式碼變得簡潔和清晰,以後可以學一下)。
  目前PermissionsDispatcher支援5個註解,先看看GitHub主頁的介紹:

  • @RuntimePermissions註解:這是必須使用的註解,用於標註在你想要申請許可權的Activity或者Fragment上,如demo裡面的PermissionsDispatcherActivity:
@RuntimePermissions
public class PermissionsDispatcherActivity extends AppCompatActivity implements View.OnClickListener {
}
  • @NeedsPermission註解:這也是必須使用的註解,用於標註在你要獲取許可權的方法,註解括號裡面有引數,傳入想要申請的許可權。也就是說你獲取了相應的許可權之後就會執行這個方法
    //獲取單個許可權
    @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
    public void getSingle() {
        Toast.makeText(this, "getSingle", Toast.LENGTH_SHORT).show();
    }

    //獲取多個許可權
    @NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})
    public void getMulti() {
        Toast.makeText(this, "getMulti", Toast.LENGTH_SHORT).show();
    }
  • @OnShowRationale註解:這個不是必須的註解,用於標註申請許可權前需要執行的方法,註解
    括號裡面有引數,傳入想要申請的許可權,而且這個方法還要傳入一個PermissionRequest物件,這個物件有兩種方法:proceed()讓許可權請求繼續,cancel()讓請求中斷。也就是說,這個方法會攔截你發出的請求,這個方法用於告訴使用者你接下來申請的許可權是幹嘛的,說服使用者給你許可權。
 @OnShowRationale({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})
    //給使用者解釋要請求什麼許可權,為什麼需要此許可權
    void showRationale(final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setMessage("使用此功能需要WRITE_EXTERNAL_STORAGE和RECORD_AUDIO許可權,下一步將繼續請求許可權")
                .setPositiveButton("下一步", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.proceed();//繼續執行請求
                    }
                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.cancel();//取消執行請求
                    }
                })
                .show();
    }

    @OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
        //給使用者解釋要請求什麼許可權,為什麼需要此許可權
    void showSingleRationale(final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setMessage("使用此功能需要WRITE_EXTERNAL_STORAGE,下一步將繼續請求許可權")
                .setPositiveButton("下一步", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.proceed();//繼續執行請求
                    }
                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                request.cancel();//取消執行請求
            }
        })
                .show();
    }
  • @OnPermissionDenied註解:這個也不是必須的註解,用於標註如果許可權請求失敗,但是使用者沒有勾選不再詢問的時候執行的方法,註解括號裡面有引數,傳入想要申請的許可權。也就是說,我們可以在這個方法做申請許可權失敗之後的處理,如像使用者解釋為什麼要申請,或者重新申請操作等。
    @OnPermissionDenied({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})//一旦使用者拒絕了
    public void multiDenied() {
        Toast.makeText(this, "已拒絕一個或以上許可權", Toast.LENGTH_SHORT).show();
    }


    @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)//一旦使用者拒絕了
    public void StorageDenied() {
        Toast.makeText(this, "已拒絕WRITE_EXTERNAL_STORAGE許可權", Toast.LENGTH_SHORT).show();
    }
  • @OnNeverAskAgain註解:這個也不是必須的註解,用於標註如果許可權請求失敗,而且使用者勾選不再詢問的時候執行的方法,註解括號裡面有引數,傳入想要申請的許可權。也就是說,我們可以在這個方法做申請許可權失敗並選擇不再詢問之後的處理。例如,可以告訴作者想開啟許可權的就從手機設定裡面開啟。

    注意,有些系統的不再詢問勾選項是要使用者拒絕授權一次才顯示出來的。


    @OnNeverAskAgain({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})//使用者選擇的不再詢問
    public void multiNeverAsk() {
        Toast.makeText(this, "已拒絕一個或以上許可權,並不再詢問", Toast.LENGTH_SHORT).show();
    }
    @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)//使用者選擇的不再詢問
    public void StorageNeverAsk() {
        Toast.makeText(this, "已拒絕WRITE_EXTERNAL_STORAGE許可權,並不再詢問", Toast.LENGTH_SHORT).show();
    }

注意,這些註解的方法都不能是private,原因看下面。

  使用PermissionsDispatcher除了要實現註解之外,還要重寫Activity的onRequestPermissionsResult()方法,在裡面讓一個PermissionsDispatcher執行回撥。這個PermissionsDispatcher是什麼來的呢?
  原來只要我們實現了@RuntimePermissions@NeedsPermission這兩個必須的註解之後,再build一次project之後,編譯器就會在在app\build\intermediates\classes\debug目錄下與被註解的Activity同一個包下生成一個輔助類,名稱為 “被註解的Activity的名稱+PermissionsDispatcher” 的輔助類,用來呼叫被註解的Activity的方法(就是因為這個所以被註解的方法不能private,private方法的作用域不在其他的類)。所以,第一次用的話,要註解好之後,build一次,下面的方法裡面的PermissionsDispatcherActivityPermissionsDispatcher才不會令AS報紅。

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

  最後,申請許可權的時候,呼叫輔助類的方法(名字從下面可以看出是被@OnPermissionDenied註解的方法加上WithCheck,引數是這個Activity或者Fragment)就行了:

    //申請單個許可權
    PermissionsDispatcherActivityPermissionsDispatcher.getSingleWithCheck(this);
    //申請多個許可權
    PermissionsDispatcherActivityPermissionsDispatcher.getMultiWithCheck(this);

  來一個流程圖:

外掛

  覺得這麼多註解要自己一個一個弄不夠方便,PermissionsDispatcher還在AndroidStudio做了外掛,只要在setting設定裡的plugins介面裡搜尋PermissionsDispatcher就可以安裝了,安裝完重啟一下就能使用:

- 在所需的Activity或者Fragment的程式碼裡面右鍵,選擇Generate,然後就可以選擇Generate Runtime Permissions…(生成動態許可權的生成)或者下面的Add PermissionsDispatcher dependencies(新增PermissionsDispatcher依賴)

  • 點選Generate Runtime Permissions…出現如下介面,輸入方法名字就能生成,很簡單粗暴:

生成了這個,如果你沒onRequestPermissionsResult和@RuntimePermissions的話也會幫你加上:

    @NeedsPermission(Manifest.permission.CALL_PHONE)
    void call() {
    }

    @OnShowRationale(Manifest.permission.CALL_PHONE)
    void callshow(final PermissionRequest request) {
    }

效果

這裡的效果錄製時長有限,沒有展示出全部的情況,想了解全部情況的可以clone下我的demo來試試。

谷歌推出的easypermissions

整合方式

  在app的build.gradle檔案裡:

dependencies {
    compile 'pub.devrel:easypermissions:0.4.2'
}

使用

  easypermissions是谷歌給出的一個執行時許可權申請庫(連谷歌自己都覺得自己的API用起來麻煩),下面我們來開始使用(下面步驟除了最後一步申請許可權之外不分先後):

1.重寫要申請許可權的Activity或者Fragment的onRequestPermissionsResult()方法,在裡面呼叫EasyPermissions.onRequestPermissionsResult(),實現回撥。

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

2.讓需要申請許可權的Activity或者Fragment實現EasyPermissions.PermissionCallbacks介面,重寫裡面的方法:

public class EasyPermissionsActivity extends AppCompatActivity EasyPermissions.PermissionCallbacks{
}
  • onPermissionsGranted(int requestCode, List<String> list)方法:當權限被成功申請的時候執行回撥,requestCode是代表你許可權請求的識別碼,list裡面裝著申請的許可權的名字:
    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        switch (requestCode){
            case 0:
                Toast.makeText(this, "已獲取WRITE_EXTERNAL_STORAGE許可權", Toast.LENGTH_SHORT).show();
                break;
            case 1:
                Toast.makeText(this, "已獲取WRITE_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE許可權", Toast.LENGTH_SHORT).show();
                break;
        }
    }
  • onPermissionsDenied(int requestCode, List<String> perms)方法:當權限申請失敗的時候執行的回撥,引數意義同上。在這個方法裡面,官方還建議用EasyPermissions.somePermissionPermanentlyDenied(this, perms)方法來判斷是否有許可權被勾選了不再詢問並拒絕,還提供了一個AppSettingsDialog來給我們使用,在這個對話方塊裡面解釋了APP需要這個許可權的原因,使用者按下是的話會跳到APP的設定介面,可以去設定許可權(是不是很不要臉^_^),這個Dialog可以使用預設的樣式new AppSettingsDialog.Builder(this).build().show(),也可以定製,像下面的一樣:
    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        //處理許可權名字字串
        StringBuffer sb = new StringBuffer();
        for (String str : perms){
            sb.append(str);
            sb.append("\n");
        }
        sb.replace(sb.length() - 2,sb.length(),"");

        switch (requestCode){
            case 0:
                Toast.makeText(this, "已拒絕許可權" + perms.get(0), Toast.LENGTH_SHORT).show();
                break;
            case 1:
                Toast.makeText(this, "已拒絕WRITE_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE許可權"+ perms.get(0), Toast.LENGTH_SHORT).show();
                break;
        }
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            Toast.makeText(this, "已拒絕許可權" + sb + "並不再詢問" , Toast.LENGTH_SHORT).show();
            new AppSettingsDialog
                    .Builder(this)
                    .setRationale("此功能需要" + sb + "許可權,否則無法正常使用,是否開啟設定")
                    .setPositiveButton("好")
                    .setNegativeButton("不行")
                    .build()
                    .show();
        }
    }

3.(可選)檢查許可權

  easypermissions提供了EasyPermissions.hasPermissions(Context context, @NonNull String… perms)方法來檢測一個或者多個許可權是否被允許(當有一個許可權被拒絕就會返回false),可能是因為Android自帶的checkSelfPermission()比較方便(或者沒這個必要?),PermissionsDispatcher和RxPermissions沒有實現這個查詢功能。這裡我把它放到工具類裡面封裝了使用:

    //使用EasyPermissions檢視許可權是否已申請
    public static String easyCheckPermissions(Context context,String ... permissions) {
        logStringBuffer.delete(0,logStringBuffer.length());
        for (String permission : permissions) {
            logStringBuffer.append(permission);
            logStringBuffer.append(" is applied? \n     ");
            logStringBuffer.append(EasyPermissions.hasPermissions(context,permission));
            logStringBuffer.append("\n\n");
        }
        return logStringBuffer.toString();
    }

4.(可選)新增@AfterPermissionGranted()註解

  要傳入的引數是int型別的requestCode被這個註解標註的方法,當這個requestCode的請求成功的時候,會執行這個方法。其實就相當於在onPermissionsGranted()呼叫這個方法而已:

    @AfterPermissionGranted(0)
    private void afterGet(){
        Toast.makeText(this, "已獲取許可權,讓我們幹愛乾的事吧!", Toast.LENGTH_SHORT).show();
    }

5.呼叫申請許可權

  最後,就是呼叫EasyPermissions.requestPermissions()方法來申請許可權了:

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_check:
                String str = PermissionsLogUtils.easyCheckPermissions(this,
                        Manifest.permission.RECORD_AUDIO,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE);
                tv_log.setText(str);
                break;
            case R.id.btn_getSingle:
                EasyPermissions.requestPermissions(this,
                        "接下來需要獲取WRITE_EXTERNAL_STORAGE許可權",
                        R.string.yes,
                        R.string.no,
                        0,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE);
                break;
            case R.id.btn_getMulti:
                EasyPermissions.requestPermissions(this,
                        "接下來需要獲取WRITE_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE許可權",
                        R.string.yes,
                        R.string.no,
                        1,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.RECORD_AUDIO);
                break;
        }

這個流程比較簡單:

效果

這裡的效果錄製時長有限,沒有展示出全部的情況,想了解全部情況的可以clone下我的demo來試試。

基於RxJava的RxPermissions

整合方式

  在app的build.gradle檔案裡:

//Rxjava1.x用這個
dependencies {
    compile 'com.tbruyelle.rxpermissions:rxpermissions:[email protected]'
}
//Rxjava2.x用這個
dependencies {
    compile 'com.tbruyelle.rxpermissions2:rxpermissions:[email protected]'
}

  如果沒有加入RxJava的還要加入它,我這裡使用的是RxJava2,所以加上:

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.0'

使用

下面的程式碼例子都是使用的RxJava2,和1版本有些不同,不過會用RxJava的基本都能看懂吧。

  RxPermissions的使用比較簡單清晰,就在申請許可權的時候使用一個方法,再裡面實現邏輯就行了:

  • 申請單個或者多個許可權,不在乎是否不再詢問和哪個許可權申請失敗,只要有一個失敗就執行失敗操作:
    //請求許可權
    private void requestRxPermissions(String... permissions) {
        RxPermissions rxPermissions = new RxPermissions(this);
        rxPermissions.request(permissions).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(@NonNull Boolean granted) throws Exception {
                if (granted){
                    Toast.makeText(RxPermissionsActivity.this, "已獲取許可權", Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(RxPermissionsActivity.this, "已拒絕一個或以上許可權", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
  • 申請多個許可權,在乎是否不再詢問和哪個許可權申請失敗:
    private void requestEachRxPermission(String... permissions) {
        RxPermissions rxPermissions = new RxPermissions(this);
        rxPermissions.requestEach(permissions).subscribe(new Consumer<Permission>() {
            @Override
            public void accept(@NonNull Permission permission) throws Exception {
                if (permission.granted) {
                    Toast.makeText(RxPermissionsActivity.this, "已獲取許可權"+ permission.name , Toast.LENGTH_SHORT).show();
                } else if (permission.shouldShowRequestPermissionRationale){
                    //拒絕許可權請求
                    Toast.makeText(RxPermissionsActivity.this, "已拒絕許可權"+ permission.name , Toast.LENGTH_SHORT).show();
                } else {
                    // 拒絕許可權請求,並不再詢問
                    // 可以提醒使用者進入設定介面去設定許可權
                    Toast.makeText(RxPermissionsActivity.this, "已拒絕許可權"+ permission.name +"並不再詢問", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

效果

這裡的效果錄製時長有限,沒有展示出全部的情況,想了解全部情況的可以clone下我的demo來試試。

總結

共同點

  三者都簡化了Android6.0申請執行時許可權的流程,比使用Android自帶的API方便很多,可擴充套件性高。

不同點

功能 PermissionsDispatcher easypermissions RxPermissions
單獨檢查許可權功能
申請許可權前提示操作 有,可以自定義操作,彈出Dialog、Toast、SnackBar等等都行 有,而且定製了Dialog 無,需要自己實現
不再提示時的處理操作 有,而且可以使用Dialog讓使用者選擇跳到APP設定介面
一次申請多個許可權時,對單個失敗的許可權處理操作
結合RxJava
不能把方法私有

後話

  瞭解到這些之後,我們應該就可以按照自己的需求來選擇用什麼樣的動態許可權請求庫了。

以上經驗經過本人demo測試,API Level 25,如有錯漏,敬請指正。

參考資料

相關推薦

目前流行執行許可權請求框架PermissionsDispatcherRxPermissionseasypermissions的使用對比

前言   今天是2017年6月23日,到目前為止,Android6.0已經發布了兩年的時間,隨著時間的推移,Android6.0肯定會越來越普及,而6.0版本的一個重大改動就是增加了執行時許可權(動態許可權):一些危險的許可權不單止要在AndroidM

初次使用執行許可權請求框架PermissionsDispatcher碰到的問題

Android6.0版本的一個重大改動就是增加了執行時許可權(動態許可權):一些危險的許可權不止要在AndroidMainifest檔案中宣告,還要在執行的時候使用程式碼來申請,讓使用者同意才能進行授權

執行許可權請求框架PermissionsDispatcher

概述我們上一篇部落格講了Android6.0執行許可權,而Android給我們提供了很多執行時許可權請求框架的,我們這篇部落格就來講一下PermissionsDispatcher的使用。PermissionsDispatcher是基於註解來寫的庫,原理就是你給你寫的方法加一個

目前流行執行許可權請求框架

前言   今天是2017年8月01日,到目前為止,Android6.0已經發布了兩年的時間,隨著時間的推移,Android6.0肯定會越來越普及,而6.0版本的一個重大改動就是增加了執行時許可權(動態許可權):一些危險的許可權不單止要在AndroidMaini

Android 6.0執行許可權第三方庫的使用-----RxPermissions

執行時許可權的講解在前一篇部落格已經算是說的比較清楚了,這裡就不說了,如果對6.0這個新特性不是很瞭解的朋友建議先看看(地址:http://blog.csdn.net/qq_33923079/article/details/53428756),那麼本篇就直接說怎

目前流行的網站開發框架

htm targe 前端 tar dream log std net blog 最流行的五個前端框架:https://blog.csdn.net/phj_88/article/details/80782409 最流行的開源前端框架:https://jingyan.baidu

這可能是精簡的Android6.0執行許可權處理,70行程式碼的工具類。附:各種許可權詳細處理

0x00:前言 對於Android6.0執行時許可權的處理方式網上有很多,包括註解,RxJava等等。一直沒有正面提到我關心的問題--如果我不在Activity或者Fragment裡面,需要執行時許可權該怎麼去做?導致我開始一直以為執行時許可權的處理必需要在Activity

2017年流行的7款Java框架

雖然Java一直被唱衰,但是直到現在Java軟體開發也堅持霸主地位不動搖,毫無疑問,Java是目前最熱門的程式語言之一,所以好程式設計師為大家收集了目前較受歡迎的java框架訊息。千鋒Java培訓課程堅持稀有的全程面授課程,大牛講師通過四大課程階段,帶領學員把Java語言學到不可思議的高度。

web伺服器&應用伺服器(ApacheTomcatnginx) Apache HTTP Server,我們常常稱之為httpd,即常說的Apache。它是目前流行的web伺服器。

現在也沒有特別搞懂他們之間的區別,只是有個大概的理解,可能會有不對的地方,隨時更新吧。 前提得搞明白代理伺服器和反向代理伺服器的區別。 一、web伺服器 Apache HTTP Server,我們常常稱之為httpd,即常說的Apache。它是目前最流行的web伺服器。 Apache

Android 6.0執行許可權勾選不再詢問後該如何處理?

Android 6.0執行時許可權勾選不再詢問後該如何處理? 當第一次請求許可權申請被拒絕後再進行第二次申請時,對話方塊中會多出一個 不再詢問 的複選框。如果勾選了該複選框並且拒絕請求,那麼以後將無法再申請該許可權。也就是說在呼叫 requestPermissions() 後,onRequest

Android 6 0 執行許可權處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

FC 7.3.2 執行許可權及其獲取通訊錄例項

定義 24種執行時許可權 獲取通訊錄例項   執行時許可權(Dangerous Permissions) 在保護使用者隱私方面:Android6.0為了更好的保護個人隱私,添加了執行時許可權: 分為兩類,一類是Normal Permissions

2018年流行的vue前端UI框架

最近在逛各大網站,論壇,SegmentFault等程式設計問答社群,發現Vue.js異常火爆,重複性的提問和內容也很多,小編自己也趁著這個大前端的熱潮,著手學習了一段時間的Vue.js,目前用它正在做自己的公司專案。 學習的過程之中發現繼最熱的 React 元件庫和 Angular 元件庫之後,

Android 學習之《第一行程式碼》第二版 筆記(十五)執行許可權

一、執行時許可權功能 使用者不需要在安裝軟體的時候一次性授權所有申請的許可權,而是可以在軟體的使用過程中再對某一項許可權申請進行授權。 分類:普通許可權和危險許可權 我們在進行執行時許可權處理時使用的是許可權名,但是使用者一旦同意授權了,那麼該許可權所對應的

andorid 執行許可權

從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行更多控制;例如,使用者可以選擇為相機應用提供相機訪問許可權,而不提供裝置位置

android許可權請求框架

封裝的許可權請求框架,自己練手使用這一個中有兩套框架使用方法不同,可按需使用。 此文主要說明如何引用及使用方法 How to To get a Git project into your build: Step 1. Add the JitPack repos

Android 6 0 執行許可權處理完全解析

                     一、概述ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。當然非常推薦閱讀官網許可權相關文章:本文也是在上述文章基礎上理解、實驗以及封裝。二、執行時許可權的變化及特點對於6.0以下的許可權及在安裝的時候,根據許可權宣告產生一個

許可權請求框架

整合步驟 dependencies { implementation 'com.hjq:xxpermissions:5.2' } 一句程式碼搞定許可權請求,從未如此簡單 XXPermissions.with(this) //.constantRe

關於Android6.0以上動態獲取執行許可權及無法正常執行百度地圖API的問題

Google早在Android6.0的時候就全面修改了應用程式的許可權申請機制,除了需要在AndroidManifest.xml配置檔案中事先做好許可權配置之外,部分被認為是危險的系統許可權還需要在程式碼中專門去單獨申請。Google將這一改變稱為“執行時許可權(RunTi

以呼叫系統相機拍照為例瞭解Android 6.0執行許可權

首先扯點別的,聽說這個週末是好天氣,想約她一起去公園賞賞梅花,只有我自己估計她也不一定去啊,哈哈。 在android6.0及以上系統,Android在安裝一個應用的時候不再需要列出一大堆許可權,讓使用者點選同意以後才可以安裝。Instead, 當應用在執行的時