1. 程式人生 > >android6.0 動態申請許可權問題總結

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為例),很簡單
    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();
    }
三.fragment 中如何申請許可權呢?其實略有不同,思路一樣
    /**
     * 前面一樣也是隻有一個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)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為使用者在安裝或更新應用時不需要授予許可權。它還讓使用者可以對應用的功能進行