android6.0 動態申請許可權問題總結
詳細介紹可以看看大神的文章http://blog.csdn.net/lmj623565791/article/details/50709663 ,本文只是記錄一些使用邏輯,以後再用直接複製了(本人比較懶)
一.許可權動態申請總體邏輯如下:(複製大神的)
// Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } }
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } } }
二.activity中申請許可權例子(以獲取裝置id為例),很簡單
三.fragment 中如何申請許可權呢?其實略有不同,思路一樣private TextView mTvDeviceId; /** * 前面是點選了一個button,開始申請許可權 */ private void requestPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {//沒有許可權 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE)) {//說明被拒絕過,需要解釋原因 ExplainFragment.getInstance().show(getFragmentManager(), ""); } else {//沒有許可權 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_REQUEST_CODE); } } else {//有許可權,讀取id mTvDeviceId.setText(getIMEI()); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == MY_REQUEST_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { mTvDeviceId.setText(getIMEI()); } else { Toast.makeText(this, "不好意思,您沒有許可權檢視...", Toast.LENGTH_SHORT).show(); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } //解釋為什麼要開啟許可權 public static class ExplainFragment extends DialogFragment { public static ExplainFragment getInstance() { return new ExplainFragment(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setMessage("請允許該app獲取您的裝置標識許可權,這樣能更好的為您服務") .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_PHONE_STATE}, MY_REQUEST_CODE); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getActivity(), "不好意思,您沒有許可權檢視...", Toast.LENGTH_SHORT).show(); } }) .create(); } } public String getIMEI() { return ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); }
/**
* 前面一樣也是隻有一個button點選開始請求許可權
*/
private void requestPermission() {
if(ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){//沒有許可權
if(FragmentCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_PHONE_STATE)){//被拒絕過
ExplainFragment.getInstance().show(getFragmentManager(),"");
}else{//第一次請求
FragmentCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE},MY_REQUEST_CODE);
}
}else{//有許可權
mTvDeviceId.setText(getIMEI());
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode==MY_REQUEST_CODE){
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
mTvDeviceId.setText(getIMEI());
}else{
Toast.makeText(getActivity(),"對不起,您沒有許可權讀取",Toast.LENGTH_SHORT).show();
}
}
}
public static class ExplainFragment extends DialogFragment {
public static ExplainFragment getInstance() {
return new ExplainFragment();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage("請允許該app獲取您的裝置標識許可權,這樣能更好的為您服務")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
FragmentCompat.requestPermissions(permissionFragment, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_REQUEST_CODE);
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(), "不好意思,您沒有許可權檢視...", Toast.LENGTH_SHORT).show();
}
})
.create();
}
}
public String getIMEI() {
return ((TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
}
這裡需要注意的是fragment不要倒v4包裡的,還有就是builde檔案要加入依賴: compile "com.android.support:support-v13:24.1.1"
四,是不是很簡單,然並卵,我覺得每次都要寫這麼一堆東西是不是很不爽?如果要是所有頁面都要有申請許可權的那還不累死,所以需要封裝了,如下:
package com.example.permissiondemo;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.view.KeyEvent;
/**
* Created by jeffzhang on 2016/11/24.
*/
public class RequestPermissionActivity extends FragmentActivity {
/**
* 請求許可權code
*/
private static final int MY_REQUEST_CODE = 1;
/**
* 獲取所有許可權的集合
*/
private static final String REQUEST_PERMISSIONS_LIST = "requestpermission";
/**
* 向用戶解釋需要許可權
*/
private static final String EXPLAIN_OPEN_PERMISSION = "explain";
private String[] mRequestPermissionList;
private String mExplainOpenPermissionMsg;
/**
* @param activity 啟動此activity的activity
* @param requestPermissions 需要申請的許可權資料
* @param explainMsg 再次申請許可權的解釋用語
* @return
*/
public static Intent getIntent(Activity activity, String[] requestPermissions, String explainMsg) {
Intent intent = new Intent(activity, RequestPermissionActivity.class);
intent.putExtra(REQUEST_PERMISSIONS_LIST, requestPermissions);
intent.putExtra(EXPLAIN_OPEN_PERMISSION, explainMsg);
return intent;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
mRequestPermissionList = intent.getStringArrayExtra(REQUEST_PERMISSIONS_LIST);
mExplainOpenPermissionMsg = intent.getStringExtra(EXPLAIN_OPEN_PERMISSION);
requestPermission();
}
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {//沒有許可權
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE)) {//說明被拒絕過,需要解釋原因
if (null != mExplainOpenPermissionMsg) {
ExplainFragment.getInstance(mExplainOpenPermissionMsg).show(getFragmentManager(), "");
} else {
setResult(RESULT_CANCELED);
finish();
}
} else {//沒有被拒絕過
ActivityCompat.requestPermissions(this, mRequestPermissionList, MY_REQUEST_CODE);
}
} else {//有許可權
setResult(RESULT_OK);
finish();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == MY_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
setResult(RESULT_OK);
finish();
} else {
setResult(RESULT_CANCELED);
finish();
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
public static class ExplainFragment extends DialogFragment {
private static final String EXPLAIN_MSG = "explainmsg";
public static ExplainFragment getInstance(String explainMsg) {
ExplainFragment explainFragment = new ExplainFragment();
Bundle bundle = new Bundle();
bundle.putString(EXPLAIN_MSG, explainMsg);
explainFragment.setArguments(bundle);
return explainFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
.setMessage(getArguments().getString(EXPLAIN_MSG))
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_PHONE_STATE}, MY_REQUEST_CODE);
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getActivity().setResult(RESULT_CANCELED);
getActivity().finish();
}
})
.create();
alertDialog.setCanceledOnTouchOutside(false);
alertDialog.setCancelable(false);
alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
return true;
} else {
return false;
}
}
});
return alertDialog;
}
}
}
注意點就是這個activity的theme要單獨設定一下,要設定成透明的,因為我們這個activity沒有任何佈局,所以透明的
<style name="MyTheme" parent="AppTheme">
<item name="android:windowBackground">@color/color_translate</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
</style>
那麼怎使用呢?很簡單:
startActivityForResult(RequestPermissionActivity.getIntent(this,new String[]{Manifest.permission.READ_PHONE_STATE},"請允許該app獲取您的裝置標識許可權,這樣能更好的為您服務"),1);
然後
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==1&&resultCode==RESULT_OK){//獲取許可權了
mTvDeviceId.setText(getIMEI());
}else{//沒有獲取成功
Toast.makeText(this,"不好意思您沒有許可權",Toast.LENGTH_SHORT).show();
}
super.onActivityResult(requestCode, resultCode, data);
}
大功告成,就這麼簡單。。。
最後原始碼已經上傳到資源中,可以去下載
相關推薦
android6.0 動態申請許可權問題總結
詳細介紹可以看看大神的文章http://blog.csdn.net/lmj623565791/article/details/50709663 ,本文只是記錄一些使用邏輯,以後再用直接複製了(本人比較懶) 一.許可權動態申請總體邏輯如下:(複
Android6.0動態申請許可權的兩種辦法
Android 6.0 動態申請許可權的兩種辦法 最近在寫專案中被安卓6.0動態申請許可權所困惑,有一些自己糾結的問題,今天閒著沒事就想著寫篇部落格來分享自己遇到的問題和解決辦法。 一開始我在網上找到的申請許可權的程式碼是ContextCom
Android6.0動態申請許可權的框架RxPermission
1.專案的git地址 https://github.com/lantian0314/StudioTest.git 2.首先配置app中的build.gradle以及manifest compile 'com.tbruyelle.rxpermissions:rxpermis
android6.0 動態申請許可權
android6.0 之前,app許可權的申請都是在manifest中宣告即可。 android6.0開始增加許可權動態監測和申請。 尤其是使用androidstudio開發程式,如果在呼叫許可權介面之前,沒有申請許可權,就無法編譯 以gps 為例,許可權申請方式如下:
安卓6.0動態申請許可權
現在安卓6.0申請許可權的開原始碼也很多,但是不想專案裡引用的東西太多,能不搬的就不搬了,自己寫了一個申請許可權的,在Gerymontion上測試,還能用,如果有需要改善的,請留言. 1 寫一個介面 public interface PermissionLi
Android 6.0動態申請許可權時,許可權框閃一下就消失的問題;
Android 藍芽BLE開發需要位置許可權,不然掃描不到周圍的藍芽資訊; 位置許可權申請: if (Build.VERSION.SDK_INT < 23){return;} //判斷是否有許可權 if (ContextCompat.checkSelfPermis
【android 6.0 動態申請許可權的基本方法和框架使用】
基本的使用: 先提供一下goog官方的學習文件: int selfPermission = ContextCompat.checkSelfPermission(Main2Activity.this, Manifest.permission.CA
Android 6.0動態申請許可權(一次申請多個)
Android一次申請多個動態許可權 昨天做一個錄音功能的程式,發現在開啟Mic的時候發生了程式崩潰,但是錯誤提示裡面居然沒有提示許可權禁止。 解決的方法有:1.手動去選擇“應用”–>“程式”–>找到那個程式新增許可權,後面程式就可以正常使用了 2.設定動態請
Android 6.0 動態申請許可權無效問題
Android動態許可權新增的流程一般如下: 1.在AndroidManifest.xml檔案中新增相應的許可權,如下:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&g
android6.0動態許可權申請工具類
一、分析 android6.0後,僅在manifest.xml清單中配置相關許可權時,如果將targetSdkVersion設定為23及以上,部分敏感許可權需要動態申請後才能使用;如果不想處理6.0以上的適配,請將targetSdkVersion設定為22
Android6.0 動態許可權申請步驟以及需要注意的一些坑
因為工作需要,簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。後期有別的問題,隨時更新~ 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就
Android6.0動態許可權申請步驟以及需要注意的一些坑
簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就預設整組許可權都可以使用了。 gro
android6.0動態許可權申請
android6.0之前,所有的許可權都要求同意之後,app才能被安裝。6.0之後,動態許可權申請很好的處理了之前的強制行為,對使用者更加的友好。 新的許可權機制,將許可權分為兩大類,一種普通許可權,一種為危險許可權。普通許可權,在manifest中申請後,無需再主動申請;
安卓開發——Android6.0動態許可權申請步驟以及需要注意的一些坑
因為工作需要,簡單研究了一下Android6.0許可權申請,在Google提供的sample的基礎上,寫了一個簡單的demo。算是自己的筆記吧,可能會比較混亂,主要是方便以後檢視。後期有別的問題,隨時更新~ 6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要
Android6.0寫入儲存動態申請許可權
由於安卓6.0的限制,特殊許可權在AndroidManifest檔案中設定不起效果,需要在程式碼中動態設定。下面的程式碼是用於申請訪問或寫入儲存的許可權,如下圖.需要在AndroidManifest檔案中配置許可權。(必須) <uses-permission andro
android6.0手機動態申請許可權的問題
1.申請許可權 ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, RequestCodeConstant.RESQUETCODE08);
動態一次獲取多種android6.0以上的許可權
原文地址:https://blog.csdn.net/qq_27634797/article/details/76617334 android6.0及以上版本區分了:普通許可權和危險許可權。普通許可權可以直接在清單檔案裡面申請, 危險許可權不僅要在清單檔案裡面申請,還要在程式碼
解決android6.0開啟攝像頭許可權"Failed to connect to camera service"的問題 ,動態獲取許可權
android6.0使用camera.open()時需要在onCreate()裡面新增如下程式碼,否則會報錯"Failed to connect to camera service": if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
android6.0動態獲取系統許可權
介紹:Google公司在android API23之後為了保護用的隱私和敏感資訊,一些許可權必須要使用者同意才能使用 1、不僅僅靜態註冊還需要動態獲取的許可權 如何獲取呢? 2、獲取的兩種方式 1)可參考時光與夢s的文章 使用文件地址:https://www.jianshu
Android6.0動態許可權適配&XMPermissions
Android6.0動態許可權 簡介 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行