在app的build.gradle文件的dependencies中,添加依賴:java
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(); } } }