1. 程式人生 > >Android--許可權申明第三方庫

Android--許可權申明第三方庫

一、Android現在申請許可權比較麻煩,在github查詢到一個比較好用的庫:AndPermission

依賴:

implementation 'com.yanzhenjie:permission:2.0.0-rc4'

在Fragment中要加上下面的語句,Activity中則可以省略,但我處理方式是都加上了,本身就是一個父類的重寫方法,activity中用不用看自己。

// 在Fragment中這句話不能註釋,否則Fragment接收不到獲取許可權的通知。
super.onRequestPermissionsResult(requestCode,permissions,grantResults);

獲取多個許可權:

// 先判斷是否有許可權。
if(AndPermission.hasPermission(this, Manifest.permission.READ_SMS)) {
    // 有許可權,直接do anything.
} else {
    // 申請許可權。
    AndPermission.with(this)
        .requestCode(100)
        .permission(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_SMS)
        .send();
}

必須在初始化階段呼叫,例如onCreate()方法中

依賴:

compile 'com.tbruyelle.rxpermissions2:rxpermissions:[email protected]'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.5'

申請單個許可權:

RxPermissions rxPermissions = new RxPermissions(MainActivity.this);
        rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE)
                .subscribe(new Observer<Boolean>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Toast.makeText(MainActivity.this, "應用需要讀寫許可權", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onNext(Boolean value) {
                        if(value){
                            Toast.makeText(MainActivity.this, "同意權限", Toast.LENGTH_SHORT).show();
                        }else {
                            Toast.makeText(MainActivity.this, "拒絕許可權", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

同時申請多個許可權並且分別判斷許可權是否授予:

RxPermissions rxPermission = new RxPermissions(getActivity());
        rxPermission
                .requestEach(Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_CALENDAR,
                        Manifest.permission.READ_CALL_LOG,
                        Manifest.permission.READ_CONTACTS,
                        Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.READ_SMS,
                        Manifest.permission.RECORD_AUDIO,
                        Manifest.permission.CAMERA,
                        Manifest.permission.CALL_PHONE,
                        Manifest.permission.SEND_SMS)
                .subscribe(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) throws Exception {
                        if (permission.granted) {
                            // 使用者已經同意該許可權
                            Log.d(TAG, permission.name + " is granted.");
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            // 使用者拒絕了該許可權,沒有選中『不再詢問』(Never ask again),那麼下次再次啟動時,還會提示請求許可權的對話方塊
                            Log.d(TAG, permission.name + " is denied. More info should be provided.");
                        } else {
                            // 使用者拒絕了該許可權,並且選中『不再詢問』
                            Log.d(TAG, permission.name + " is denied.");
                        }
                    }
                });

三、國產手機5.0、6.0許可權適配框架/編譯時註解框架

引用

project 中的 build.gradle:

buildscript {
  // ...
}

allprojects {
  repositories {
    // 請新增如下一行
    maven { url 'https://jitpack.io' }
  }
}
app 中的 build.gradle:

dependencies {
  compile 'com.github.jokermonn:permissions4m:2.1.2-lib'
  annotationProcessor 'com.github.jokermonn:permissions4m:2.1.2-processor'
}

多個許可權申請:

Permissions4M.get(NormalFragment.this)
        .requestPermissions(Manifest.permission.BODY_SENSORS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CALENDAR)
        .requestCodes(SENSORS_CODE, LOCATION_CODE, CALENDAR_CODE)
        .requestListener(new Wrapper.PermissionRequestListener() {
            @Override
            public void permissionGranted(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("地理位置許可權授權成功 in fragment with annotation");
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("感測器許可權授權成功 in fragment with annotation");
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("讀取日曆許可權授權成功 in fragment with annotation");
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void permissionDenied(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("地理位置許可權授權失敗 in fragment with annotation");
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("感測器許可權授權失敗 in fragment with annotation");
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("讀取日曆許可權授權失敗 in fragment with annotation");
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void permissionRationale(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("請開啟地理位置許可權 in fragment with annotation");
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("請開啟感測器許可權 in fragment with annotation");
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("請開啟讀取日曆許可權 in fragment with annotation");
                        break;
                    default:
                        break;
                }
            }
        })
        .requestCustomRationaleListener(new Wrapper.PermissionCustomRationaleListener() {
            @Override
            public void permissionCustomRationale(int code) {
                switch (code) {
                    case LOCATION_CODE:
                        ToastUtil.show("請開啟地理位置許可權 in fragment with annotation");
                        Log.e("TAG", "permissionRationale: 請開啟地理位置許可權 ");

                        new AlertDialog.Builder(getActivity())
                                .setMessage("地理位置許可權許可權申請:\n我們需要您開啟地理位置許可權(in fragment with " +
                                        "annotation)")
                                .setPositiveButton("確定", new DialogInterface
                                        .OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Permissions4M.get(NormalFragment.this)
                                                .requestOnRationale()
                                                .requestPermissions(Manifest.permission
                                                        .ACCESS_FINE_LOCATION)
                                                .requestCodes(LOCATION_CODE)
                                                .request();
                                    }
                                })
                                .show();
                        break;
                    case SENSORS_CODE:
                        ToastUtil.show("請開啟感測器許可權 in fragment with annotation");
                        Log.e("TAG", "permissionRationale: 請開啟感測器許可權 ");

                        new AlertDialog.Builder(getActivity())
                                .setMessage("感測器許可權申請:\n我們需要您開啟感測器許可權(in fragment with " +
                                        "annotation)")
                                .setPositiveButton("確定", new DialogInterface
                                        .OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Permissions4M.get(NormalFragment.this)
                                                .requestOnRationale()
                                                .requestPermissions(Manifest.permission
                                                        .BODY_SENSORS)
                                                .requestCodes(SENSORS_CODE)
                                                .request();
                                    }
                                })
                                .show();
                        break;
                    case CALENDAR_CODE:
                        ToastUtil.show("請開啟讀取日曆許可權 in fragment with annotation");
                        Log.e("TAG", "permissionRationale: 請開啟讀取日曆許可權 ");

                        new AlertDialog.Builder(getActivity())
                                .setMessage("日曆許可權申請:\n我們需要您開啟日曆許可權(in fragment with " +
                                        "annotation)")
                                .setPositiveButton("確定", new DialogInterface
                                        .OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Permissions4M.get(NormalFragment.this)
                                                .requestOnRationale()
                                                .requestPermissions(Manifest.permission
                                                        .READ_CALENDAR)
                                                .requestCodes(CALENDAR_CODE)
                                                .request();
                                    }
                                })
                                .show();
                        break;
                    default:
                        break;
                }

            }
        })
        .request();


總起來說,第三個庫更加方便簡明,建議使用。

相關推薦

Android--許可權申明第三方

一、Android現在申請許可權比較麻煩,在github查詢到一個比較好用的庫:AndPermission 依賴: implementation 'com.yanzhenjie:permission:2.0.0-rc4' 在Fragment中要加上下面的語句,Activ

Android 無法解決第三方依賴問題

最近做第三方授權登入的時候,經常需要依賴一些第三方庫,但是在 build.gradle 檔案中添加了如下語句後, //新浪微博認證授權 implementation 'com.sina.weibo.sdk:core:4.3.0:[email protected]' 總

Android studio 引入第三方(github開源

現在github越來越火,也是個人的招牌了。很多很好的公開庫,都可以直接使用,可以使自己的app效果更加的炫,還可以縮短開發週期。 這裡就主要說下,如何匯入github上的專案,並如何引用。一開始匯入,會遇到挺多問題,也不知道咋處理,慢慢摸索了兩天,終於弄好了。 一、下載g

Android studio新增第三方和so

原文: 以下兩種方式二選一 方法一: 1.在src/main中新建jniLibs資料夾 ,把.so複製進去即可 方法二: 1.在app/中新建libs資料夾,把.so複製進去 2.在app/build.gradle中新增以下五行指令碼即可(注:以下指令碼意思是會把

Android Studio 新增第三方的6種方式(Jar,module,so等)

前幾篇我們講過了AS3種新增外掛的方式,以及最常用的一些快捷鍵的用法,這篇我們講講新增第三方庫的方法,我這裡講的是最實用、最簡單也是最有效的方法,網上很多方法雜七雜八的而且有的已盡很老了在新的版本中根本不起作用,好了開始教程: 點選專案設定按鈕 依次選擇

Android studio新增第三方和so

原文: 以下兩種方式二選一 方法一: 1.在src/main中新建jniLibs資料夾 ,把.so複製進去即可 方法二: 1.在app/中新建libs資料夾,把.so複製進去 2.在app/build.gradle中新增以下五行指令碼即

Eclipse中Android開發引用第三方

Android.mk檔案編寫 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := IDataEncapsulation #生成的庫名 LOCAL_CPPFLAGS := -

Android開發OKSocket第三方的使用

最近看GitHub發現有一個不錯的第三方庫oksocket,封裝的很好,自帶連線響應和心跳包等,確實很不錯 地址:https://github.com/xuuhaoo/OkSocket 大家有興趣可以去看看,話不多說,直接上程式碼,一些基礎的設定大家可以按官方

Android常用的第三方整理

Android開源庫 自己一直很喜歡Android開發,就如部落格簽名一樣, 我是程式猿,我為自己代言 。 在摸索過程中,GitHub上搜集了很多很棒的Android第三方庫,推薦給在苦苦尋找的開發者,而且我會 不定期的更新 這篇文章。 Android下的優秀開發庫數

Android Studio匯入第三方(SlidingMenu)教程

注意:本教程針對像SlidingMenu這樣使用Android Studio結構的第三方庫。可以免去繁瑣的gradle修改 開始: 第一步,去GitHub下載SlidingMenu (下載地址:https://github.com/jfeinstein1

Android日誌系統第三方------Logger

Logger GitHub的小搬運工~~~~ 為什麼要使用第三方log庫,和android自帶的Log有什麼優點? Logger不必每次輸入TAG Logger打印出當前執行緒名

Android Studio匯入第三方SDK(jar)的方法

Android Studio匯入第三方庫SDK(.jar)的方法: 1.把第三方庫SDK(.jar)拷貝到專案的app\libs目錄,舉例volley.jar庫說明 2.選單點選File->ProjectStructure 3.選擇app->Dependen

Android Studio 匯入第三方

匯入“***.jar”檔案(以UniversalImageLoader為例) 1、將“***.jar”檔案複製至專案中“libs”資料夾中; 2、將“***.jar”檔案右鍵單擊Add As Libr

Android 動態許可權 第三方總結

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

Android-版本6.0許可權申請第三方開源

AndPermission AndroidStudio使用方法,gradle一句話遠端依賴compile 'com.yanzhenjie:permission:1.0.5'11 Or Maven: <dependency> <groupId>

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

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

Xamarin.Android Binding 源自github第三方的綁定(中級教學)----aar文件

over 人的 height type 事件 apps rar you imp 今天來個稍微復雜一點的源自github的android第三方庫:CarouselView (今天我們依然不用在metadata.xml裏面寫代碼,雖然在build時不會有error出現,但是會

Xamarin.Android Binding 源自github第三方的綁定(高級教學)----aar文件

復制 git png 簡單的 picasso roc 這一 高級 終極 初級教學(包含Xamarin.GradleBindings插件的安裝) 中級教學 今天我們來到了高級教學,今天要綁定一個Github上將近4000star的一個項目---------Android圖片輪

android可以嘗試的25個第三方

Lottie 這是一個動畫庫。通過Adobe After Effects做出動畫效果,然後通過Bodymovin(AE的外掛)匯出JSON資料,然後通過該庫生成原生動畫效果。 Github地址:https://github.com/airbnb/lottie-android 效果圖如下:

android如何新增第三方依賴

android開發中經常會需要引用第三方的程式包,一般有兩種方式:一種是將依賴包直接拷貝到本地工程的libs目錄下;另一種是線上依賴,即通過gradle指令碼新增依賴關係,在工程編譯時通過pom檔案去下載對應的依賴包。 今天主要講第二種依賴方式,如果我想依賴某一固定版本的程式包,可以採用如下