1. 程式人生 > >Android開發6.0許可權的封裝

Android開發6.0許可權的封裝

import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;


import java.util.ArrayList;
import java.util.List;


/**
 * Created by changquan on 2016-11-16.
 */


public class MPermissionsActivity extends AppCompatActivity {
    private final String TAG = "MPermissions";
    private int REQUEST_CODE_PERMISSION = 0x00099;


    /**
     * 請求許可權
     *
     * @param permissions 請求的許可權
     * @param requestCode 請求許可權的請求碼
     */
    public void requestPermission(String[] permissions, int requestCode) {
        this.REQUEST_CODE_PERMISSION = requestCode;
        if (checkPermissions(permissions)) {
            permissionSuccess(REQUEST_CODE_PERMISSION);
        } else {
            List<String> needPermissions = getDeniedPermissions(permissions);
            ActivityCompat.requestPermissions(this, needPermissions.toArray(new String[needPermissions.size()]), REQUEST_CODE_PERMISSION);
        }
    }


    /**
     * 檢測所有的許可權是否都已授權
     *
     * @param permissions
     * @return
     */
    private boolean checkPermissions(String[] permissions) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }


        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) !=
                    PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }


    /**
     * 獲取許可權集中需要申請許可權的列表
     *
     * @param permissions
     * @return
     */
    private List<String> getDeniedPermissions(String[] permissions) {
        List<String> needRequestPermissionList = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) !=
                    PackageManager.PERMISSION_GRANTED ||
                    ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
                needRequestPermissionList.add(permission);
            }
        }
        return needRequestPermissionList;
    }




    /**
     * 系統請求許可權回撥
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_PERMISSION) {
            if (verifyPermissions(grantResults)) {
                permissionSuccess(REQUEST_CODE_PERMISSION);
            } else {
                permissionFail(REQUEST_CODE_PERMISSION);
                showTipsDialog();
            }
        }
    }


    /**
     * 確認所有的許可權是否都已授權
     *
     * @param grantResults
     * @return
     */
    private boolean verifyPermissions(int[] grantResults) {
        for (int grantResult : grantResults) {
            if (grantResult != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }


    /**
     * 顯示提示對話方塊
     */
    private void showTipsDialog() {
        new AlertDialog.Builder(this)
                .setTitle("提示資訊")
                .setMessage("當前應用缺少必要許可權,該功能暫時無法使用。如若需要,請單擊【確定】按鈕前往設定中心進行許可權授權。")
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                })
                .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startAppSettings();
                    }
                }).show();
    }


    /**
     * 啟動當前應用設定頁面
     */
    private void startAppSettings() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivity(intent);
    }


    /**
     * 獲取許可權成功
     *
     * @param requestCode
     */
    public void permissionSuccess(int requestCode) {
        Log.d(TAG, "獲取許可權成功=" + requestCode);


    }


    /**
     * 許可權獲取失敗
     * @param requestCode
     */
    public void permissionFail(int requestCode) {
        Log.d(TAG, "獲取許可權失敗=" + requestCode);
    }
}

相關推薦

Android開發6.0許可權封裝

import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri;

android開發6.0許可權適配

寫部落格只是為了方便記憶,希望自己能夠堅持下去。 在android開發中,如果專案的targetSdkVersion >= 23,在手機版本為android6.0+的手機上執行時,某些危險的許可權需要使用者授權,如果使用者不同意,而直接執行某些程式碼

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

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

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

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

Android 6.0許可權機制及開發流程詳解

許可權機制變更的背景 在Android6.0之前,app在安裝時會提示使用者此app需要使用哪些許可權,但使用者只能選擇同意或拒絕安裝,而不能單獨對某項許可權進行授予或拒絕。只要使用者選擇了安裝,即表示使用者接受了app對這些許可權的使用,如果使用者不希望app獲取某些涉及隱

Android 6.0 許可權的申請 與 封裝

Android 6.0 以後最大的改變就是對於許可權的管理這一塊了,以前某個App 想使用什麼許可權 只要在 manifest 檔案裡面新增申請就可以了。 Android 6.0 以後不但要在manifest 裡面新增執行的時候還會彈出一個對話方塊讓使用

android 6.0許可權開發---拍照,開啟相簿問題

android6.0的許可權機制改得跟ios類似,兩個系統之間互相模仿也是好事,取長補短。在某些許可權需要用到的時候,要先詢問使用者。 國內各大android系統對於許可權的設定機制都不大一樣,但大部分都是一些常用的許可權預設是開啟的,一些是預設關閉了,即使你在Andr

Android開發——Android 6.0許可權管理機制詳解

0.前言最近在研究所實習,我負責維護Android手機取證專案的Android客戶端,有客戶反映我們的APP在Android6.0無響應,經過除錯發現SD卡讀寫許可權許可權被拒絕。但明明是在AndroidManifest.xml檔案中宣告過的。查了很多資料才知道Android

Android開發必知:6.0許可權,官方分析

1.這個新的執行時許可權僅當我們設定targetSdkVersion 23(這意味著你已經在23上測試通過了)才起作用,當然還要是M系統的手機。app在6.0之前的裝置依然使用舊的許可權系統。 如果app的targetSdkVersion 低於 23,那將被認

Android 6.0許可權管理及其封裝

前言 Android M出來很久了,N都快釋出了,儘管如此還是要整理一下這塊。6.0的許可權機制變更為Runtime Permissions,執行時要請求許可權,如果使用者不授權的話,可能會導致崩潰。 本篇文章分三部分,一是許可權的分類,二是執行時請求的基本

AndroidAndroid 6.0許可權機制及開發流程詳解

許可權機制變更的背景 在Android6.0之前,app安裝時會提示使用者此app需要使用哪些許可權,但使用者不能單獨對某項許可權進行授權或拒絕,只要使用者選擇了安裝,即表示使用者接受了app對這些許可權的使用,如果使用者不希望app獲取某些涉及隱私的資訊,例如讀取

Android進階封裝之一個類實現相容Android 6.0許可權、適配Android7.0 拍照!

Android進階封裝之“史無前例”一個類實現相容Android 6.0許可權、適配Android 拍照7.0: 相機與相簿上傳圖片就用我好啦! 一、前言。 本篇部落格從基本的AndroidN開始說怎麼適配其拍照,其與7.0以下有何區別

Location許可權,因系統版本不同,6.0許可權對話方塊沒有,7.0,8.0正常,開發時要注意

1、一個獲取Location許可權引發的刺激,就這三個Location許可權 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission an

android 6.0許可權管理

轉載 https://blog.csdn.net/android2me/article/details/69525975 private void checkPermission() { //檢查許可權(NEED_PERMISSION)是否被授權 PackageManager.

android 6.0 + 許可權之 打電話

下面看看我怎麼調出去的… 第一步,我們還是要在AndroidManifolest.xml裡面新增 如果你沒有判斷請求許可權會報以下錯誤 AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jie.demo, PI

android 6.0許可權,onRequestPermissionsResult回撥不執行問題

許可權是目前APP必不可少的,這裡介紹一下onRequestPermissionsResult回撥不執行問題。 一,正常使用android 6.0許可權: 思路: 1.檢查判斷 如果應用具有此許可權,方法將返回PackageManager.PERMISSION_GRA

android 6 0許可權全面詳細分析和解決方案

原文: http://www.2cto.com/kf/201512/455888.html http://blog.csdn.net/yangqingqo/article/details/48371123 http://inthecheesefactory.com/blog/things-y

Android 關於6.0,7.0許可權的那點事

前言:最近把專案 targetSdkVersion 從22直接升級到27,因此就需要對新的動態許可權相關問題進行一籮筐的操作。寫這篇文章總結一下。 我在專案裡用的是EasyPermission工具類進行的動態許可權判斷。首先,在build.gradle中新增依賴: imp

Android 6.0許可權管理以及動態申請,以定位許可權為例

前言: 我們都知道現在手機系統已經到了很高的版本,在我們的Android6.0以後很多許可權都被列入危險許可權,都需要使用者手動去確認 1.我們先來看一下6.0以後被列為危險級別的一些許可權

android 6.0許可權判斷 音訊 拍照 相簿

/*------------------------------------------開啟音訊許可權------------------------------------------------*/ if (PackageManager.PERMISSION_GRANT