国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android動態(tài)獲取權(quán)限(詳細教程附代碼)

這篇具有很好參考價值的文章主要介紹了Android動態(tài)獲取權(quán)限(詳細教程附代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概述

如果是android6.0以下的版本,只需要在manifest聲明對應(yīng)的權(quán)限即可。但是這樣會大大降低系統(tǒng)的安全性。所以在android6.0及其以后,app獲取權(quán)限需要得到用戶的反饋才可以。

動態(tài)獲取權(quán)限

動態(tài)獲取權(quán)限,可以分為兩種情況。情況一,操作到app特定的功能,需要某些權(quán)限時進行動態(tài)獲取,這種情況即為“懶漢式”獲取。情況二,在初始情況時(在onCreate中獲?。?,直接獲取到所有需要的權(quán)限,這種情況即為“餓漢式”。

具體實現(xiàn)

比如某個app在使用的時候需要獲取到到通訊錄讀寫權(quán)限,短信讀取發(fā)送權(quán)限。

注意:讀通訊錄是一個權(quán)限,寫通訊錄是一個權(quán)限。這是兩個權(quán)限。
短信的讀取是一個權(quán)限,短信的發(fā)送是操作短信的另一個權(quán)限。

layout布局代碼

<?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"
    android:gravity="center_horizontal"
    >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_contact"
        android:text="獲取通訊錄的讀寫權(quán)限"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_sms"
        android:text="獲取短信的查看發(fā)送權(quán)限"/>
</LinearLayout>

獲取通訊錄的讀寫權(quán)限按鈕的id是:btn_contact
獲取短信的查看發(fā)送權(quán)限按鈕的id是:btn_sms

android動態(tài)獲取權(quán)限,Android,android,java,開發(fā)語言

回調(diào)函數(shù)onRequestPermissionsResult

該回調(diào)函數(shù)會在用戶點擊完動態(tài)獲取權(quán)限的彈窗后執(zhí)行。當彈出動態(tài)獲取權(quán)限的窗口后,用戶在該窗口進行選擇“允許”或“不允許”,當選擇完后,即可在該回調(diào)函數(shù)中進行相應(yīng)的判斷,判斷用戶是否允許了權(quán)限。

該函數(shù)在MainActivity類中

//點擊申請權(quán)限彈框后的回調(diào)函數(shù)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

權(quán)限判斷工具類

public class PermissionUtil {

    //檢查某個功能的多個權(quán)限,返回true表示已完全啟用權(quán)限,返回false表示未完全啟用權(quán)限
    //比如通訊錄這個功能,需要獲取它有的多個權(quán)限[讀權(quán)限,寫權(quán)限]
    //act:當前的Activity 
    //permissions:某個功能的權(quán)限集合,如通訊錄的[讀,寫]
    //requestCode:標識一下“某個功能”
    public static boolean checkPermission(Activity act, String[] permissions, int requestCode){

        //判斷android的版本
        //Build.VERSION.SDK_INT:當前android的版本
        //Build.VERSION_CODES.M:android6.0
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//安卓版本在6.0及以后才需要判斷  M就是6.0
           
           //check的含義:權(quán)限是否開啟
           //這里給了默認值PackageManager.PERMISSION_GRANTED,意思是開啟權(quán)限
            int check = PackageManager.PERMISSION_GRANTED;//默認授權(quán)的值
            for (String permission:permissions){
                //返回結(jié)果為是否授權(quán)
                check = ContextCompat.checkSelfPermission(act, permission);
                //如果沒有授權(quán),則退出
                if (check!=PackageManager.PERMISSION_GRANTED){
                    break;
                }
            }
            //未開啟該權(quán)限,則請求系統(tǒng)彈窗,好讓用戶選擇是否立即開啟權(quán)限
            if (check!=PackageManager.PERMISSION_GRANTED){
                //彈窗,用戶操作
                ActivityCompat.requestPermissions(act,permissions,requestCode);
                return false;
            }

        }

        return true;
    }

    //grantResults:是用戶點“授權(quán)”完彈窗后的授權(quán)結(jié)果數(shù)組
    //檢查權(quán)限結(jié)果數(shù)組,返回true表示都已經(jīng)獲得授權(quán)。返回false表示至少有一個未獲得授權(quán)
    public static boolean checkGrant(int[] grantResults) {

        if (grantResults!=null){

            //遍歷權(quán)限結(jié)果數(shù)組中的每條選擇結(jié)果
            for (int grant:grantResults){
                //未獲得授權(quán)
                if (grant!=PackageManager.PERMISSION_GRANTED){
                    return false;
                }

            }
            return true;
        }

        return false;
    }
}

清單文件

聲明權(quán)限權(quán)限(必須聲明)

<!--    聲明讀寫通訊錄權(quán)限-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!--聲明讀發(fā)短信權(quán)限-->
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>

android動態(tài)獲取權(quán)限,Android,android,java,開發(fā)語言

方式一:懶漢式

上面說過,懶漢式,是在app操作到特定功能時從獲取相應(yīng)權(quán)限,在這里的“特定功能”就是在點擊按鈕時,動態(tài)獲取權(quán)限。

定義權(quán)限數(shù)組

//通信錄的讀寫權(quán)限
    private static final String[] PERMISSIONS_CONTACTS=new String[]{
            Manifest.permission.READ_CONTACTS,//讀通訊錄
            Manifest.permission.WRITE_CONTACTS//寫通訊錄
    };

    //短信的發(fā)送、讀取權(quán)限
    private static final String[] PERMISSIONS_SMS=new String[]{
            Manifest.permission.SEND_SMS,//發(fā)送短信
            Manifest.permission.READ_SMS//讀取短信
    };

標識碼

//標識通訊錄
    private static final int REQUEST_CODE_CONTACTS=1;
    //標識短信
    private static final int REQUEST_CODE_SMS=2;

點擊事件監(jiān)聽
實現(xiàn)View.OnClickListener,并實現(xiàn)onClick方法

@Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_contact:
                PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_CONTACTS);
                break;
            case R.id.btn_sms:
                PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_SMS);
                break;
        }
    }

我們可以看到,如果沒有授權(quán)就會執(zhí)行到工具類PermissionUtil中的如下語句:

ActivityCompat.requestPermissions(act,permissions,requestCode);

它會出現(xiàn)彈窗,給用戶選擇是否獲取所有權(quán)限
android動態(tài)獲取權(quán)限,Android,android,java,開發(fā)語言
用戶選擇完后就會回調(diào)Activity中的,所以我們可以在該函數(shù)中進行是否授權(quán)的判斷

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

MainActivity完整代碼

package com.example.demo8;

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

import android.Manifest;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.example.demo8.util.PermissionUtil;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //通信錄的讀寫權(quán)限
    private static final String[] PERMISSIONS_CONTACTS=new String[]{
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS
    };

    //短信的發(fā)送、讀取權(quán)限
    private static final String[] PERMISSIONS_SMS=new String[]{
            Manifest.permission.SEND_SMS,
            Manifest.permission.READ_SMS
    };

    //標識通訊錄
    private static final int REQUEST_CODE_CONTACTS=1;
    //標識短信
    private static final int REQUEST_CODE_SMS=2;

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

        //設(shè)置監(jiān)聽事件
        findViewById(R.id.btn_contact).setOnClickListener(this);
        findViewById(R.id.btn_sms).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_contact:
                //上下文、權(quán)限數(shù)組、標識
                PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_CONTACTS);
                break;
            case R.id.btn_sms:
                PermissionUtil.checkPermission(this,PERMISSIONS_SMS,REQUEST_CODE_SMS);
                break;
        }
    }


    //點擊申請權(quán)限彈框后的回調(diào)函數(shù)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){
            case REQUEST_CODE_CONTACTS:
                if (PermissionUtil.checkGrant(grantResults)){
                    Toast.makeText(this, "通訊錄權(quán)限獲取成功", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(this, "獲取通訊錄讀寫權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
                }
                break;
            case REQUEST_CODE_SMS:
                if (PermissionUtil.checkGrant(grantResults)){
                    Toast.makeText(this, "收發(fā)短信權(quán)限獲取成功", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(this, "收發(fā)短信權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
                }
                break;
        }

    }
}

方式二:餓漢式

餓漢式,是在“onCreate”的時候就進行權(quán)限的申請,一次性到位。

我們將所有需要申請的權(quán)限放到一個數(shù)組中

//將權(quán)限放到一個數(shù)組中
    private static final String[] PERMISSIONS=new String[]{
            //通信錄的讀寫權(quán)限
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,

            //短信的發(fā)送、讀取權(quán)限
            Manifest.permission.SEND_SMS,
            Manifest.permission.READ_SMS
    };

在oncreate中進行權(quán)限的申請
android動態(tài)獲取權(quán)限,Android,android,java,開發(fā)語言
其余原理與懶漢式相同,只是申請權(quán)限的時間不同而已。

通訊錄
android動態(tài)獲取權(quán)限,Android,android,java,開發(fā)語言
短信
android動態(tài)獲取權(quán)限,Android,android,java,開發(fā)語言
MainActivity代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-669297.html

public class MainActivity extends AppCompatActivity implements View.OnClickListener{


    //將權(quán)限放到一個數(shù)組中
    private static final String[] PERMISSIONS=new String[]{
            //通信錄的讀寫權(quán)限
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,

            //短信的發(fā)送、讀取權(quán)限
            Manifest.permission.SEND_SMS,
            Manifest.permission.READ_SMS
    };

    private static final int REQUEST_CODE=1;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /初始獲取權(quán)限
        PermissionUtil.checkPermission(this,PERMISSIONS,REQUEST_CODE);

        //設(shè)置監(jiān)聽事件
        findViewById(R.id.btn_contact).setOnClickListener(this);
        findViewById(R.id.btn_sms).setOnClickListener(this);
    }
//餓漢式這里無用
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_contact:
                break;
            case R.id.btn_sms:
                break;
        }
    }


    //點擊申請權(quán)限彈框后的回調(diào)函數(shù)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){
            case REQUEST_CODE:
                if (PermissionUtil.checkGrant(grantResults)){
                    Toast.makeText(this, "權(quán)限獲取成功", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(this, "權(quán)限獲取失敗", Toast.LENGTH_SHORT).show();
                }
                break;
        }

    }
}

到了這里,關(guān)于Android動態(tài)獲取權(quán)限(詳細教程附代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Android動態(tài)申請權(quán)限(運行時申請權(quán)限)

    Android動態(tài)申請權(quán)限(運行時申請權(quán)限)

    目錄 1.需要動態(tài)申請權(quán)限的原因 2.Android權(quán)限動態(tài)申請 1.需要動態(tài)申請權(quán)限的原因 ? 首先,Android權(quán)限分為大致兩類,一類是普通權(quán)限,一類是危險權(quán)限,準確地講其實還有一些特殊的權(quán)限,不過這些權(quán)限使用得相對較少,我們大致跳過.對于普通權(quán)限,系統(tǒng)會自動幫我們進行授權(quán),由于

    2024年02月20日
    瀏覽(32)
  • Android之動態(tài)申請權(quán)限

    Android之動態(tài)申請權(quán)限

    Android 6.0 (API 23) 之前應(yīng)用的權(quán)限在安裝時全部授予,運行時應(yīng)用不再需要詢問用戶。在 Android 6.0 或更高版本對權(quán)限進行了分類,對某些涉及到用戶隱私的權(quán)限可在運行時根據(jù)用戶的需要動態(tài)授予。 Android 6.0以下,在AndroidManifest.xml文件中注冊權(quán)限即可。 Android 6.0及其以后,既

    2024年02月04日
    瀏覽(22)
  • Android動態(tài)申請權(quán)限

    一、在AndroidManifest清單文件中聲明要開啟的權(quán)限 二、代碼中動態(tài)申請相關(guān)權(quán)限

    2024年02月06日
    瀏覽(18)
  • Android Studio安裝&Java開發(fā)環(huán)境配置詳細教程

    Android Studio安裝&Java開發(fā)環(huán)境配置詳細教程

    一,Android Studio概述 Android Studio是Google于2013年I/O大會針對Android開發(fā)推出的新開發(fā)工具,是基于IntelliJ IDEA開發(fā)的,IntelliJ在業(yè)界被公認為最好的Java開發(fā)工具之一。尤其是在智能代碼助手、代碼自動提示、重構(gòu)、J2EE支持、各類版本工具(Git、SVN、GitHub等)、JUnit、CVS整合、代碼

    2023年04月08日
    瀏覽(27)
  • Android 獲取SIM卡號碼權(quán)限申請

    在AndroidManifest.xml中添加如下權(quán)限 uses-permission android:name=\\\"android.permission.READ_PHONE_STATE\\\"/ 如果你只在清單文件中添加權(quán)限卻沒有在代碼中獲取權(quán)限,代碼還是會報錯的。 報錯原因: android 6.0以上增加了動態(tài)獲取權(quán)限api,需要動態(tài)獲取手機的權(quán)限。彈出對話框詢問用戶,請求用戶

    2024年02月08日
    瀏覽(21)
  • 基于java的Android手機通訊錄【詳細】【完整代碼】

    基于java的Android手機通訊錄【詳細】【完整代碼】

    提示:代碼在基本模塊中,教程純文字,推薦兩個屏幕一邊看代碼一邊看教程 簡易Android通訊錄系統(tǒng),只要半天就能寫完! (博主安卓一些功能用的不熟練) 需要掌握學(xué)習(xí)的知識點: 1、基本的UI界面編寫。 2、Intent的基本使用。 3、Menu的基本使用。 4、RecyclerView的基本使用。

    2024年02月09日
    瀏覽(24)
  • android 12 SD動態(tài)申請讀寫權(quán)限

    android 12 SD動態(tài)申請讀寫權(quán)限

    android 12不僅需要在AndroidManifest.xml申請讀寫權(quán)限也需要在代碼中動態(tài)的申請 關(guān)于如何動態(tài)申請讀寫權(quán)限僅需要兩步 在AndroidManifest.xml文件中申請讀寫權(quán)限 在代碼的啟動MainActivity中動態(tài)申請方法 下面是關(guān)于動態(tài)權(quán)限申請的Manifest.class類大家有興趣可以去了解下

    2024年02月11日
    瀏覽(26)
  • android 手機獲取root權(quán)限(刷入magisk面具方式)_獲取刷入模塊_MIUI_android7/android12實踐

    android 手機獲取root權(quán)限(刷入magisk面具方式)_獲取刷入模塊_MIUI_android7/android12實踐

    Magisk安裝教程 - Magisk中文網(wǎng) (magiskcn.com) android12: How to Root Xiaomi Redmi Note 11T Pro / 11T Pro+ using Magisk without TWRP (getdroidtips.com) 視頻教程 ★ bigstar ★ 玩機必看!帶你入坑安卓刷機,小白也能看懂的ROOT基礎(chǔ)指南來啦!_嗶哩嗶哩_bilibili 將前面列出的參考都看一遍 最好把文章結(jié)尾的基

    2024年02月06日
    瀏覽(21)
  • android studio開發(fā)——android11版本以上權(quán)限動態(tài)申請問題,包括文件讀寫、圖片、相機的調(diào)用

    用于android手機的升級,現(xiàn)在已經(jīng)是android13版本了,對于權(quán)限問題可能更加敏感了,前段時間開發(fā)發(fā)現(xiàn)之前的方法已經(jīng)不再適用于android11以后的版本了 讀寫權(quán)限申請最好是跳轉(zhuǎn)到設(shè)置中進行才是最好了,下面我們開始進行 首先是AndroidManifest.xml文件的權(quán)限 然后這里講解一下權(quán)

    2024年02月10日
    瀏覽(21)
  • Android Framework 動態(tài)更新插拔設(shè)備節(jié)點執(zhí)行權(quán)限

    Android Framework 動態(tài)更新插拔設(shè)備節(jié)點執(zhí)行權(quán)限

    TF卡設(shè)備節(jié)點是插上之后動態(tài)添加,所以不能通過初始化設(shè)備節(jié)點權(quán)限來解決,需要監(jiān)聽TF插入事件,在init.rc 監(jiān)聽插入后動態(tài)更新設(shè)備節(jié)點執(zhí)行權(quán)限 添加插拔TF卡監(jiān)聽 frameworks/base/services/core/java/com/android/server/StorageManagerService.java 在private void mount(VolumeInfo vol){}中添加 SystemProp

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包