1. 程式人生 > >安卓6.0執行時許可權處理方案

安卓6.0執行時許可權處理方案

    許可權檢查一般放在APP的入口,比如說閃屏頁splashactivity中或者baseapplication中。

    其中需要兩個類,一個是PermissionChecker,一個是PermissionsActivity。第一個是用來檢測當前是否已經獲取到了申請的許可權,如果沒有則跳轉到許可權申請類PermissionsActivity中進行開啟所需許可權。

直接上程式碼吧,第一個PermissionChecker

package tv.talkweb.daddygowhere.util.permissioncheck;

import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;

/**
 *  檢查許可權的工具類
 * Created by su on 2017/1/22.
 */

public class PermissionsChecker {
	private final Context mContext;

	public PermissionsChecker(Context context) {
		mContext = context.getApplicationContext();
	}

	// 判斷許可權集合
	public boolean lacksPermissions(String... permissions) {
		for (String permission : permissions) {
			if (lacksPermission(permission)) {
				return true;
			}
		}
		return false;
	}

	// 判斷是否缺少許可權
	private boolean lacksPermission(String permission) {
		return ContextCompat.checkSelfPermission(mContext, permission) ==
				PackageManager.PERMISSION_DENIED;
	}
}

第二個是PermissionsActivity:
package tv.talkweb.daddygowhere.util.permissioncheck;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;

import tv.talkweb.daddygowhere.base.BaseActivity;
import tv.talkweb.daddygowhere.base.BaseApplication;
import tv.talkweb.dadwheregoing.R;

/**
 * 許可權獲取頁面
 * Created by su on 2017/1/22.
 */

public class PermissionsActivity extends BaseActivity {
	public static final int PERMISSIONS_GRANTED = 0; // 許可權授權
	public static final int PERMISSIONS_DENIED = 1; // 許可權拒絕

	private static final int PERMISSION_REQUEST_CODE = 0; // 系統許可權管理頁面的引數
	private static final String EXTRA_PERMISSIONS =
			"me.chunyu.clwang.permission.extra_permission"; // 許可權引數
	private static final String PACKAGE_URL_SCHEME = "package:"; // 方案

	private PermissionsChecker mChecker; // 許可權檢測器
	private boolean isRequireCheck; // 是否需要系統許可權檢測

	// 啟動當前許可權頁面的公開介面
	public static void startActivityForResult(Activity activity, int requestCode, String... permissions) {
		Intent intent = new Intent(activity, PermissionsActivity.class);
		intent.putExtra(EXTRA_PERMISSIONS, permissions);
		ActivityCompat.startActivityForResult(activity, intent, requestCode, null);
	}

	@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (getIntent() == null || !getIntent().hasExtra(EXTRA_PERMISSIONS)) {
			throw new RuntimeException("PermissionsActivity需要使用靜態startActivityForResult方法啟動!");
		}
		setContentView(R.layout.activity_permissions);

		mChecker = new PermissionsChecker(this);
		isRequireCheck = true;
	}

	@Override protected void onResume() {
		super.onResume();
		if (isRequireCheck) {
			String[] permissions = getPermissions();
			if (mChecker.lacksPermissions(permissions)) {
				requestPermissions(permissions); // 請求許可權
			} else {
				allPermissionsGranted(); // 全部許可權都已獲取
			}
		} else {
			isRequireCheck = true;
		}
	}

	// 返回傳遞的許可權引數
	private String[] getPermissions() {
		return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
	}

	// 請求許可權相容低版本
	private void requestPermissions(String... permissions) {
		ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
	}

	// 全部許可權均已獲取
	private void allPermissionsGranted() {
		setResult(PERMISSIONS_GRANTED);
		finish();
	}

	/**
	 * 使用者許可權處理,
	 * 如果全部獲取, 則直接過.
	 * 如果許可權缺失, 則提示Dialog.
	 *
	 * @param requestCode  請求碼
	 * @param permissions  許可權
	 * @param grantResults 結果
	 */
	@Override
	public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
		if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
			isRequireCheck = true;
			allPermissionsGranted();
		} else {
			isRequireCheck = false;
			showMissingPermissionDialog();
		}
	}

	// 含有全部的許可權
	private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
		for (int grantResult : grantResults) {
			if (grantResult == PackageManager.PERMISSION_DENIED) {
				return false;
			}
		}
		return true;
	}

	// 顯示缺失許可權提示
	private void showMissingPermissionDialog() {
		AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);
		builder.setTitle(R.string.help);
		builder.setMessage(R.string.string_help_text);

		// 拒絕, 退出應用
		builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {
			@Override public void onClick(DialogInterface dialog, int which) {
				setResult(PERMISSIONS_DENIED);
				BaseApplication.getInstance().exit();
			}
		});

		builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
			@Override public void onClick(DialogInterface dialog, int which) {
				startAppSettings();
			}
		});

		builder.show();
	}

	// 啟動應用的設定
	private void startAppSettings() {
		Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
		intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
		startActivity(intent);
	}
}

佈局檔案activity_permissions

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

</LinearLayout>
strings.xml檔案新增程式碼
    <string name="help">幫助</string>
    <string name="string_help_text">當前缺少必要許可權,請點選“設定”-“許可權”開啟所有許可權。</string>
    <string name="quit">退出</string>
    <string name="settings">設定</string>

在baseapplication中我使用了統一管理所有activity的用法,大家可以借鑑也可以用自己的一套處理方法
	//新增Activity到容器中
	public void addActivity(Activity activity) {
		activityList.add(activity);
	}
	//遍歷所有Activity並finish
	public void exit() {
		for (Activity activity : activityList) {
			activity.finish();
		}
		System.exit(0);
	}

        //退出單個Activity

        public void exit(Activity activity) {
                 activity.finish();
                 activityList.remove(activity);
        }

具體使用:

列出所有需要啟動的許可權

建立許可權檢測器成員變數

在onCreate中初始化成員變數

在onResume中檢測並處理缺少的許可權

public class ActivitySplash extends BaseActivity implements UmengUtil.MyUmengOnlineConfigListener{

    private Context context;
    private CountdownView splashCircleView;
    // 所需的全部許可權
    static final String[] PERMISSIONS = new String[]{
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.MODIFY_AUDIO_SETTINGS,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_NETWORK_STATE,
            Manifest.permission.ACCESS_WIFI_STATE,
            Manifest.permission.ACCESS_FINE_LOCATION
    };
    private static final int REQUEST_CODE = 0; // 請求碼

    private PermissionsChecker mPermissionsChecker; // 許可權檢測器

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.context = this;
        mPermissionsChecker = new PermissionsChecker(this);

    protected void onResume() {
        super.onResume();
        // 缺少許可權時, 進入許可權配置頁面
        if (Build.VERSION.SDK_INT > 22){
            if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
                startPermissionsActivity();
            }
        }
    }

    private void startPermissionsActivity() {
        PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
		}


相關推薦

6.0執行許可權處理方案

    許可權檢查一般放在APP的入口,比如說閃屏頁splashactivity中或者baseapplication中。     其中需要兩個類,一個是PermissionChecker,一個是PermissionsActivity。第一個是用來檢測當前是否已經獲取到了申請

Android 6 0 執行許可權處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 6 0 執行許可權處理完全解析

                     一、概述ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。當然非常推薦閱讀官網許可權相關文章:本文也是在上述文章基礎上理解、實驗以及封裝。二、執行時許可權的變化及特點對於6.0以下的許可權及在安裝的時候,根據許可權宣告產生一個

Android 6.0 執行許可權處理

執行時許可權介紹 Android 6.0在我們原有的AndroidManifest.xml宣告許可權的基礎上, 又新增了執行時許可權動態檢測,以下許可權都需要在執行時判斷: 執行時許可權處理 Android6.0系統預設為targetSdkVersion小於23的應用預設授予了所申請的所有許可權,

Android 6.0 執行許可權處理完全解析

一、概述 ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。 當然非常推薦閱讀官網許可權相關文章: 本文也是在上述文章基礎上理解、實驗以及封裝。 二、執行時許可權的變化及特點 對於6.0以下

Android 6.0執行許可權勾選不再詢問後該如何處理

Android 6.0執行時許可權勾選不再詢問後該如何處理? 當第一次請求許可權申請被拒絕後再進行第二次申請時,對話方塊中會多出一個 不再詢問 的複選框。如果勾選了該複選框並且拒絕請求,那麼以後將無法再申請該許可權。也就是說在呼叫 requestPermissions() 後,onRequest

6.0動態申請許可權

現在安卓6.0申請許可權的開原始碼也很多,但是不想專案裡引用的東西太多,能不搬的就不搬了,自己寫了一個申請許可權的,在Gerymontion上測試,還能用,如果有需要改善的,請留言. 1 寫一個介面    public interface PermissionLi

6.0動態獲取許可權

在配置清單檔案中寫了許可權之後發現安卓系統6.0及以上執行的時候許可權都是關著的,這個時候需要動態獲取 程式碼如下: package com.zzb.permission; import android.Manifest; import android.content

6.0 檔案儲存許可權管理

1. 應用 私有儲存(內建儲存) 獲取方式: Context.getFileDir() :獲取內建儲存下的檔案目錄,可以用來儲存不能公開給其他應用的一些敏感資料如使用者個人資訊 Context.getCacheDir() :獲取內建儲存下的快取目錄,可以用來儲存一些快取檔案如圖片,當內建儲存的空間不足時將系統

以呼叫系統相機拍照為例瞭解Android 6.0執行許可權

首先扯點別的,聽說這個週末是好天氣,想約她一起去公園賞賞梅花,只有我自己估計她也不一定去啊,哈哈。 在android6.0及以上系統,Android在安裝一個應用的時候不再需要列出一大堆許可權,讓使用者點選同意以後才可以安裝。Instead, 當應用在執行的時

談談Android 6.0執行許可權理解

前言  谷歌在2015年8月份時候,釋出了Android 6.0版本,代號叫做“棉花糖”(Marshmallow ),其中的很大的一部分變化,是在使用者許可權授權上,或許是感覺之前預設授權的不合理,現在6.0出來,使得使用者許可權授權變得合理。這可能也是參考IOS系統的,只有在使用者需要使用許可權的時候,才

Android 6.0執行許可權申請和一些坑

1.概述 大家知道在Android6.0(Api23)之前,使用者許可權的申請都是在AndroidManifest.xml 宣告的,而在6.0之後,對某些涉及到使用者隱私的許可權可在執行時根據使用者的需要動態授予。如果你的應用設定targetSdkVersio

Android6.0執行許可權處理-超簡單封裝

之前除錯的時候,出現了一個問題,就是當我開啟二維碼掃描介面的時候,對於一部分手機一直不會出現那個掃描框,這點我也很是鬱悶,這不好整啊,畢竟二維碼介面是用的別人的,怎麼改啊?這個時候我分析了一下原因,最後知道只有部分6.0的手機才會出現這種情況,那麼這就簡單了。下

這可能是最精簡的Android6.0執行許可權處理,70行程式碼的工具類。附:各種許可權詳細處理

0x00:前言 對於Android6.0執行時許可權的處理方式網上有很多,包括註解,RxJava等等。一直沒有正面提到我關心的問題--如果我不在Activity或者Fragment裡面,需要執行時許可權該怎麼去做?導致我開始一直以為執行時許可權的處理必需要在Activity

Android 6.0 執行許可權管理最佳實踐

這是一篇遲來的部落格,Android M已經發布一年多了(6.0的變化),在Android M中許可權系統被重新設計,發生了顛覆性的變化,很多人把握不好這個變化,一是對這個許可權策略和套路還沒有摸透,二是沒有一個很好的實踐來支撐,在我的技術開發群裡很多人問我

6.0執行許可權與targetSdkVersion選擇

targetSDKVersion 簡單來說就代表著你的App能夠適配的系統版本,意味著你的App在這個版本的手機上做了充分的 前向 相容性處理和實際測試。其實我們寫程式碼時都是經常幹這麼一件事,就是 if(Build.VERSION.SDK_INT >= 23) {

android 6.0執行許可權應用之相簿圖片選取

public class MainActivity extends AppCompatActivity { public static final int REQUEST_CODE=200; public static final int REQUEST_C

Android 6.0 執行許可權檢查分析

Android版本升級到6.0之後,為了一改往日安全受人詬病的形象,將許可權授權的安裝時授予的基礎上,對於一部分危險的許可權採用動態控制授權的方式。類似國內手機安全助手許可權控制的功能。一、許可權控制組: 以上的9組許可權在本次修改的範圍之內,可能有人要問了,明明有一些許可

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

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

6.0注意的許可權問題

Android 6.0對於許可權管理比較收緊,因此在適配android 6.0的時候就很有必要考慮一些許可權管理的問題。 如果你沒適配6.0的裝置並且許可權沒給的話,就會出現類似如下的問題: java.lang.SecurityException: Permission