Android搞定權限申請


0x00 前言

使用EasyPermissions庫進行申請權限

打開App時就申請權限,如果用戶拒絕權限后,會循環申請

如果永久拒絕后,會跳轉到設置里繼續申請

效果圖:

效果圖

注:不講原理,先教你怎么實現


0x01 引入依賴

appbuild.gradle里面,添加EasyPermissions的依賴

implementation 'pub.devrel:easypermissions:2.0.0'

添加后點擊 File -> Sync Project with Gradle Files 重新構建一些項目


0x02 創建PermissionActivity

創建一個PermissionActivity用於獲取權限,布局隨意

可以把它設為啟動Activity,也可以由SplashActivity轉至PermissionActivity


創建完成后,讓PermissionActivity實現EasyPermissions.PermissionCallbacks,並重新下面三個方法

PermissionActivity復制下面的內容即可

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import java.util.List;

import pub.devrel.easypermissions.EasyPermissions;

public class PermissionActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
    }

    // 重新下面三個方法
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    @Override
    public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {

    }

    @Override
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {

    }
}

0x03 三個方法

其中onRequestPermissionsResult是權限申請后執行的方法,默認就寫成上面那樣就行

onPermissionsGranted是權限授權時的回調

onPermissionsDenied是權限被拒絕時的回調


0x04 申請權限

假如要申請存儲權限

首先在AndroidManifest.xml里面加上這兩行

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后,在PermissionActivity里定義兩個常量

// 指定申請存儲權限時,一個標識符,用於在成功或失敗回調中判斷申請成功的或失敗的是哪幾個權限
static final int STORAGE_CALL_BACK_CODE = 0;
// 存儲權限
static final String[] perms_storage = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

onCreate里面加上申請權限的代碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_permission);

    if (EasyPermissions.hasPermissions(this, perms_storage)) {
        Toast.makeText(this, "已經有存儲權限", Toast.LENGTH_SHORT).show();
    } else {
        EasyPermissions.requestPermissions(this, "請給我權限", STORAGE_CALL_BACK_CODE, perms_storage);
    }
}

0x05 處理授權成功

onPermissionsGranted方法

@Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
    //noinspection SwitchStatementWithTooFewBranches
    switch (requestCode) {
        // 如果存儲權限申請通過
        case STORAGE_CALL_BACK_CODE:
            Toast.makeText(this, "已同意存儲權限", Toast.LENGTH_SHORT).show();
            // pass為通過后執行的方法,注意下面有個finish(),pass()中就不要再加finish()了
            pass();
            finish();
            break;
    }
}

0x06 處理授權失敗

onPermissionsDenied方法

@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
    //noinspection SwitchStatementWithTooFewBranches
    switch (requestCode) {
        case STORAGE_CALL_BACK_CODE:
            Toast.makeText(this, "已拒絕存儲權限", Toast.LENGTH_SHORT).show();
            ActivityCompat.requestPermissions(this, perms_storage, STORAGE_CALL_BACK_CODE);
            break;
    }
    // 如果權限被永久拒絕,就提示到設置頁面中開啟
    if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
        Toast.makeText(this, "權限已被永久拒絕", Toast.LENGTH_SHORT).show();
        new AppSettingsDialog
            .Builder(this)
            .setTitle("權限已被永久拒絕")
            .setRationale("該應用需要此權限,否則無法正常使用,是否打開設置")
            .setPositiveButton("確定")
            .setNegativeButton("取消")
            .build()
            .show();
    }
}

0x07 完整代碼

PermissionActivity

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

import java.util.List;

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

public class PermissionActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {

    static final int STORAGE_CALL_BACK_CODE = 0;
    static final String[] perms_storage = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);

        if (EasyPermissions.hasPermissions(this, perms_storage)) {
            Toast.makeText(this, "已經有存儲權限", Toast.LENGTH_SHORT).show();
        } else {
            EasyPermissions.requestPermissions(this, "請給我權限", STORAGE_CALL_BACK_CODE, perms_storage);
        }
    }

    void pass() {
        startActivity(new Intent(this, MainActivity.class));
    }

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

    @Override
    public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
        //noinspection SwitchStatementWithTooFewBranches
        switch (requestCode) {
            // 如果存儲權限申請通過
            case STORAGE_CALL_BACK_CODE:
                Toast.makeText(this, "已同意存儲權限", Toast.LENGTH_SHORT).show();
                // pass為通過后執行的方法,注意下面有個finish(),pass()中就不要再加finish()了
                pass();
                finish();
                break;
        }
    }

    @Override
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
        //noinspection SwitchStatementWithTooFewBranches
        switch (requestCode) {
            case STORAGE_CALL_BACK_CODE:
                Toast.makeText(this, "已拒絕存儲權限", Toast.LENGTH_SHORT).show();
                ActivityCompat.requestPermissions(this, perms_storage, STORAGE_CALL_BACK_CODE);
                break;
        }
        // 如果權限被永久拒絕,就提示到設置頁面中開啟
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            Toast.makeText(this, "權限已被永久拒絕", Toast.LENGTH_SHORT).show();
            new AppSettingsDialog
                    .Builder(this)
                    .setTitle("權限已被永久拒絕")
                    .setRationale("該應用需要此權限,否則無法正常使用,是否打開設置")
                    .setPositiveButton("確定")
                    .setNegativeButton("取消")
                    .build()
                    .show();
        }
    }
}

0x08 項目代碼

項目在github上面,有用的話,可以給一個star

https://github.com/tanyiqu/android-permission-demo


免責聲明!

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



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