EasyPermissions的流程


在app的build.gradle文件的dependencies中,添加依賴:

implementation 'pub.devrel:easypermissions:1.3.0'

 

import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import java.util.List;

import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{

    private static final int RC_LOCATION = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //進來之后,手動調用申請權限的方法,
        //建議在用到相關功能的時候,才去請求相關權限,提高用戶體驗
        RequestLocationAndCallPermission();
    }

    //帶有這個注釋的方法,會在某一次請求的所有權限都通過后,才回調
    @AfterPermissionGranted(RC_LOCATION)
    private void RequestLocationAndCallPermission() {
//        Toast.makeText(this, "RequestLocationAndCallPermission,out", Toast.LENGTH_SHORT).show();
        String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.CALL_PHONE};
        if (EasyPermissions.hasPermissions(this, perms)) {
            //用戶同意了權限
            //進行后面的操作
        } else {
            //用戶拒絕了權限
            //正常情況(沒有勾選《拒絕后不再詢問》)會先彈下面這個框一,點擊確定會出現系統的框二
            //非正常情況(有勾選《拒絕后不再詢問》)框一和系統的框二都不會出現
            //無論哪種情況,最終,都會根據用戶的選擇同意還是拒絕,而回調對應的方法;(勾選過《拒絕后不再詢問》,這種情況也是屬於拒絕,所以他也會走拒絕的回調)
            EasyPermissions.requestPermissions(this, "請求定位權限和撥打電話權限",RC_LOCATION, perms);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // Forward results to EasyPermissions
        // 把請求權限的操作轉交給EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }


    //一次請求中,只要有一個權限允許了,就會走這個方法
    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        //用戶同意了部分權限,你可以對權限做判斷,根據通過的權限,開放相應功能
    }

    //一次請求中,只要有一個權限拒絕了,就會走這個方法
    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        //如果曾經有勾選《拒絕后不再詢問》,則會進入下面這個條件
        //建議做一個判斷,判斷用戶是不是剛剛勾選的《拒絕后不再詢問》,如果是,就不做下面這個判斷,而只進行相應提示,這樣就可以避免再一次彈框,影響用戶體驗
        //否則就是用戶可能在之前曾經勾選過《拒絕后不再詢問》,那就可以用下面這個判斷,強制彈出一個對話框
        if(EasyPermissions.somePermissionPermanentlyDenied(this,perms)){
            //但是這個api有個問題,他會顯示一個對話框,但是這個對話框,點空白區域是可以取消的,如果用戶點了空白區域,你就沒辦法進行后續操作了
            new AppSettingsDialog.Builder(this).build().show();
        }

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //EasyPermissions會有一個默認的請求碼,根據這個請求碼,就可以判斷是不是從APP的設置界面過來的
        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
            // Do something after user returned from app settings screen, like showing a Toast.
            //在這兒,你可以再對權限進行檢查,從而給出提示,或進行下一步操作
            Toast.makeText(this,"從設置中返回", Toast.LENGTH_SHORT).show();
        }
    }
}

 

注意,要在清單文件中,添加權限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>

官方網站: https://github.com/googlesamples/easypermissions



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM