以unity技术开发视角对android权限的讲解

这篇具有很好参考价值的文章主要介绍了以unity技术开发视角对android权限的讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

Android权限分类

普通权限

 普通权限定义

普通权限有哪些

危险权限

 危险权限的定义

危险权限有哪些 

动态申请权限实例

申请单个权限实例

第一步:在清单文件中声明权限

 第二步:在代码中进行动态申请权限

申请多个权限实例

第一步:在清单文件中声明权限

第二步:在代码中进行动态申请权限


前言

        在unity开发过程中,接SDK的时候有一个问题是绕不开,那就是合规问题,早期的时候对于权限设置和获取并没有那么多限制,或者说规范吧。现如今随着合规越来越严格,对于unity游戏开发人员对于android的权限有一些大致了解还是有其必要性,尤其是需要接SDK的小朋友而言,更是如此。这里就简约讲解下android有哪些权限分类,同时如何在运行时申请权限。由于android开发并不是我的主要技术防线,所以这里只做一个简单的知识普及而已。

Android权限分类

        普通权限(安装时权限

        危险权限(运行时权限

        特殊权限  (一般属于系统层面,这里就不作叙述)

普通权限

 普通权限定义

不需要动态请求用户授权,只需要在AndroidManifest.xml中声明即可的权限。  此类权限允许访问超出应用沙盒的数据和执行超出应用沙盒的操作,但对用户隐私和其他应用的运行构成的风险很小。系统会为一般权限分配 normal 保护级别。

例如: 网络访问(魅族系统进行了魔改,网络权限也需要申请)、WIFI状态、音量设置等。

如:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0">

    <!-- 定义应用程序的权限 -->
    <!-- 运用获取网络状态权限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 定义应用程序的 Application 类 -->
    <application
        ...省略
    </application>
</manifest>

普通权限有哪些

ACCESS_CHECKIN_PROPERTIES:读取和写入“properties”表在checkin数据库中
ACCESS_LOCATION_EXTRA_COMMANDS:访问额外的位置提供命令
ACCESS_NETWORK_STATE:获取网络信息状态
ACCESS_NOTIFICATION_POLICY:希望访问通知策略的应用程序的标记许可
ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
ACCOUNT_MANAGER:通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息
BATTERY_STATS:更新手机电池统计信息
BIND_ACCESSIBILITY_SERVICE:请求accessibilityservice服务
BIND_APPWIDGET:告诉appWidget服务需要访问小插件的数据库
BIND_CARRIER_MESSAGING_SERVICE:绑定到运营商应用程序中的服务
BIND_CARRIER_SERVICES:绑定到运营商应用程序中的服务
BIND_CHOOSER_TARGET_SERVICE:由ChooserTargetService要求的服务
BIND_DEVICE_ADMIN:请求系统管理员receiver
BIND_DREAM_SERVICE:由一个DreamService要求的服务
BIND_INCALL_SERVICE:请求MidiDeviceService服务
BIND_INPUT_METHOD:请求InputMethodService服务
BIND_MIDI_DEVICE_SERVICE:由一MidiDeviceService要求的服务
BIND_NFC_SERVICE:由HostApduServiceOffHostApduService要求的服务
BIND_NOTIFICATION_LISTENER_SERVICE:由notificationlistenerservice要求的服务
BIND_PRINT_SERVICE:由printservice要求的服务
BIND_REMOTEVIEWS:通过RemoteViewsService服务请求
BIND_TELECOM_CONNECTION_SERVICE:由ConnectionService要求的服务
BIND_TEXT_SERVICE:由textservice要求的服务
BIND_TV_INPUT:由TvInputService要求的服务
BIND_VOICE_INTERACTION:由VoiceInteractionService要求的服务
BIND_VPN_SERVICE:通过VpnService服务请求
BIND_WALLPAPER:通过WallpaperService服务请求
BLUETOOTH:连接配对过的蓝牙设备
BLUETOOTH_ADMIN:发现和配对新的蓝牙设备
BLUETOOTH_PRIVILEGED:配对蓝牙设备,无需用户交互
BROADCAST_PACKAGE_REMOVED:广播一个提示消息在一个应用程序包已经移除后
BROADCAST_SMS:当收到短信时触发广播
BROADCAST_STICKY:收到广播后快速收到下一个广播
BROADCAST_WAP_PUSH:WAP PUSH服务收到后触发广播
CALL_PRIVILEGED:拨打电话,替换系统的拨号器界面
CAPTURE_AUDIO_OUTPUT:捕获音频输出
CAPTURE_SECURE_VIDEO_OUTPUT:捕获视频输出
CAPTURE_VIDEO_OUTPUT:捕获视频输出
CHANGE_COMPONENT_ENABLED_STATE:改变组件是否启用状态
CHANGE_CONFIGURATION:改变配置信息
CHANGE_NETWORK_STATE:改变网络状态,如是否联网
CHANGE_WIFI_MULTICAST_STATE:改变WiFi多播状态
CHANGE_WIFI_STATE:改变WiFi状态
CLEAR_APP_CACHE:清除应用缓存
CONTROL_LOCATION_UPDATES:获得移动网络定位信息
DELETE_CACHE_FILES:删除缓存文件
DELETE_PACKAGES:删除应用
DIAGNOSTIC:RW到诊断资源
DISABLE_KEYGUARD:禁用键盘锁
DUMP:获取系统dump信息
EXPAND_STATUS_BAR:扩展或收缩状态栏
FACTORY_TEST:运行工厂测试模式
FLASHLIGHT:访问闪光灯
GET_ACCOUNTS_PRIVILEGED:访问帐户服务中的帐户列表
GET_PACKAGE_SIZE:获取任何package占用空间容量
GET_TASKS:获取信息有关当前或最近运行的任务
GLOBAL_SEARCH:允许全局搜索
INSTALL_LOCATION_PROVIDER:安装定位提供
INSTALL_PACKAGES:安装应用
INSTALL_SHORTCUT:创建快捷方式
INTERNET:访问网络连接
KILL_BACKGROUND_PROCESSES:结束后台进程
LOCATION_HARDWARE:使用定位功能的硬件
MANAGE_DOCUMENTS:管理文档访问
MASTER_CLEAR:执行软格式化,删除系统配置信息
MEDIA_CONTENT_CONTROL:控制播放和内容
MODIFY_AUDIO_SETTINGS:修改声音设置信息
MODIFY_PHONE_STATE:修改电话状态
MOUNT_FORMAT_FILESYSTEMS:格式化可移动文件系统
MOUNT_UNMOUNT_FILESYSTEMS:挂载、反挂载外部文件系统
NFC:执行NFC近距离通讯操作
PACKAGE_USAGE_STATS:设置他的activities显示
PERSISTENT_ACTIVITY:创建一个永久的Activity
READ_FRAME_BUFFER:读取帧缓存
READ_INPUT_STATE:读取当前键的输入状态
READ_LOGS:读取系统底层日志
READ_SYNC_SETTINGS:读取同步设置
READ_SYNC_STATS:读取同步状态
READ_VOICEMAIL:读取语音邮件
REBOOT:重新启动设备
RECEIVE_BOOT_COMPLETED:开机自动运行
REORDER_TASKS:重新排序系统Z轴运行中的任务
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS:请求忽略电池优化
REQUEST_INSTALL_PACKAGES:请求安装包
RESTART_PACKAGES:结束任务
SEND_RESPOND_VIA_MESSAGE:即时的短信息回复
SET_ALARM:设置闹铃提醒
SET_ALWAYS_FINISH:程序在后台是否总是退出
SET_ANIMATION_SCALE:设置全局动画缩放
SET_DEBUG_APP:设置调试程序
SET_PREFERRED_APPLICATIONS:设置应用的参数
SET_PROCESS_LIMIT:设置最大的进程数量的限制
SET_TIME:设置系统时间
SET_TIME_ZONE:设置系统时区
SET_WALLPAPER:设置桌面壁纸
SET_WALLPAPER_HINTS:设置壁纸建议
SIGNAL_PERSISTENT_PROCESSES:发送一个永久的进程信号
STATUS_BAR:打开、关闭、禁用状态栏
SYSTEM_ALERT_WINDOW:显示系统窗口
TRANSMIT_IR:使用设备的红外发射器
UNINSTALL_SHORTCUT:删除快捷方式
UPDATE_DEVICE_STATS:更新设备状态
USE_FINGERPRINT:使用指纹硬件
VIBRATE:允许程序振动
WAKE_LOCK :允许程序在手机屏幕关闭后后台进程仍然运行
WRITE_APN_SETTINGS:允许程序写入网络GPRS接入点设置
WRITE_GSERVICES:允许程序修改Google服务地图
WRITE_SECURE_SETTINGS:允许应用程序读取或写入安全系统设置
WRITE_SETTINGS:允许程序读取或写入系统设置 WRITE_SYNC_SETTINGS:允许程序写入同步设置
WRITE_VOICEMAIL:允许应用程序修改和删除系统中的现有的语音邮件,只有系统才能使用
 

危险权限

 危险权限的定义

        涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。

例如: 读取通讯录、访问媒体和摄像机设备、读写存储器数据、获取用户位置等。如果应用声明需要这些危险权限,则必须在运行时明确告诉用户,让用户手动授予。

以unity技术开发视角对android权限的讲解,unity,工作笔记,android,unity

危险权限有哪些 

编号 权限组 权限
1 CALENDAR (日历) READ_CALENDAR( 读取日历
WRITE_CALENDAR(
写入日历
2 CAMERA (相机) CAMERA(照相机
3 CONTACTS (联系人) READ_CONTACTS(读取通讯录
WRITE_CONTACTS(
写入通讯录
GET_ACCOUNTS(
访问通讯录权限
4 LOCATION (位置) ACCESS_FINE_LOCATION(获取位置
ACCESS_COARSE_LOCATION(
获取粗略定位
5 MICROPHONE (麦克风) RECORD_AUDIO(录音
6 PHONE (手机) READ_PHONE_STATE(读取手机状态
CALL_PHONE(
打电话
READ_CALL_LOG(
看电话记录
WRITE_CALL_LOG(
编写调用日志
ADD_VOICEMAIL(
添加语音信箱
USE_SIP(
 使用SIP
PROCESS_OUTGOING_CALLS(
 过程输出调用
7 SENSORS (传感器) BODY_SENSORS(体传感器
8 SMS (短信) SEND_SMS(发信息
RECEIVE_SMS(
收信息
READ_SMS(
读取信息
RECEIVE_WAP_PUSH(
收到WAP推送
RECEIVE_MMS(
接收彩信
9 STORAGE (存储卡) READ_EXTERNAL_STORAGE(读取外部存储器 
WRITE_EXTERNAL_STORAGE(
写外部存储器

动态申请权限实例

申请单个权限实例

以获取获取打电话权限(CALL_PHONE)为例

第一步:在清单文件中声明权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.apple.encryptiondemo">
    <uses-permission android:name="android.permission.CALL_PHONE" />
    ...

 第二步:在代码中进行动态申请权限

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_call = findViewById(R.id.btn_call);
        btn_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //==第一步:判断用户是否已经授权
                //ContextCompat.checkSelfPermission() 参数一:context 参数二:具体的权限名
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    //没有授权,则申请授权
                    //ActivityCompat.requestPermissions() 参数一:context 参数二:申请的权限名数组 参数三:请求码,要求唯一值
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                } else {
                    call();
                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    private void call() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }

    //==第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    call();
                } else {
                    Toast.makeText(MainActivity.this, "you denied", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

申请多个权限实例

        获取打电话和扩展SD卡权限为例

第一步:在清单文件中声明权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.apple.encryptiondemo">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

第二步:在代码中进行动态申请权限

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_call = findViewById(R.id.btn_call);
        btn_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //第一步:看权限是否已经被申请,没有则申请权限
                List<String> permissionList = new ArrayList<>();
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.CALL_PHONE);
                }
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.READ_PHONE_STATE);
                }
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (!permissionList.isEmpty()) {
                    String[] permissions = permissionList.toArray(new String[permissionList.size()]);
                    ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
                } else {
                    call();
                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    private void call() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }

    //第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for (int result : grantResults) {
                        if (result != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    call();
                }else{
                    Toast.makeText(MainActivity.this, "发生未知错误", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
        }
    }
}

由于作者水平有限,如果有错误和不当之处,忘小伙伴指正,不胜感激!!! 

参考资料

https://www.jianshu.com/p/338741725cd0

https://developer.android.google.cn/guide/topics/permissions/overview?hl=zh_cn

https://blog.csdn.net/m0_45695811/article/details/133851898

        文章来源地址https://www.toymoban.com/news/detail-786367.html

到了这里,关于以unity技术开发视角对android权限的讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android平台开发技术大作业:数独游戏

    目录 《Andriod平台应用与开发技术实验》 PAGEREF _Toc24643 h 1 实验报告 PAGEREF _Toc15437 h 1 第一章引言 - 1 - 第二章调研阶段 - 2 - 2.1项目背景 - 2 - 2.2前期调研 - 2 - 2.3开发必要性 - 2 - 2.4预期功能实现 - 2 - 第三章设计阶段 - 2 - 3.1页面设计 - 2 - 3.2角色设计 - 2 - 3.3元素、定位设计 - 2

    2024年02月10日
    浏览(58)
  • Android移动开发技术(慕课版)习题集题库及答案

    一 、 填空题 1.在Android开发环境中,SDK组件的作用是用于(   开发    )Android应用。 2.在Android开发环境中,(   Dalvik    )组件的作用是虚拟机管理。 二、判断题 1.电子邮件客户端属于Android平台体系结构的应用程序框架层。(  F  ) 2.Android 中使用AVD Manager工

    2024年02月10日
    浏览(58)
  • BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

    在Android系统中,进程间通信(IPC)是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信,而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理,并详细解析BpBinder与PPBinder调用过程的使用以及注意事项。 Bind

    2024年02月13日
    浏览(39)
  • Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准

    本文来自笔者本人的语雀博客,由于语雀升级后不再满足笔者的需求,因此之后笔者会陆续将一些之前已经发布但尚有价值的文章搬家到CSDN。 作为音视频行业从业者,怎么能不理解H.264视频编解码技术标准?本篇文章主要记录笔者学习过程中对众多优秀博客内容的摘抄整理,

    2023年04月09日
    浏览(55)
  • 云计算虚拟化技术与开发-------虚拟化技术应用第三、四章内容(QUME命令的讲解以及常用的QUME命令、创建虚拟机镜像文件以及启动虚拟机的常用QEMU命令)

    目录 第三章关于QUME的命令讲解 常用的QEMU命令:      kvm的内存的配置:  两种方式查看内存信息:  查看QEMU支持的镜像文件格式:qemu-img -h。 创造虚拟机镜像格式的命令:  下面介绍qemu-img的基本命令及语法 QUME中详细命令讲解:  第五章:实训和实验内容,如果不会就

    2024年02月15日
    浏览(43)
  • OpenCV开发之——人脸识别库生成so文件(1),通宵都要看完这个Android关键技术点

    ifneq (“”,“$(wildcard $(OPENCV_ANDROID_SDK)/OpenCV.mk)”) include ${OPENCV_ANDROID_SDK}/OpenCV.mk else include ${OPENCV_ANDROID_SDK}/sdk/native/jni/OpenCV.mk endif else include …/…/sdk/native/jni/OpenCV.mk endif LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp LOCAL_C_INCLUDES += $(LOCAL_PATH) LOCAL_LDLIBS += -llog -ldl LOCAL_MODULE := detection_b

    2024年04月16日
    浏览(129)
  • RK3588平台开发系列讲解(安卓篇)Android12 获取 root 权限

    沉淀、分享、成长,让自己和他人都能有所收获!😄 📢获取 Android 设备的 root 权限是指取得超级用户( root 用户)的权限,使得用户可以对系统进行更广泛的修改和操作。但需要注意,获取 root 权限可能会导致安全风险,包括系统不稳定、数据丢失或设备损坏,因此应该谨

    2024年02月03日
    浏览(98)
  • 车载开发核心技术——SystemUI控制技术

    SystemUI是指车载开发中的一个重要组件,它负责管理和控制车机的用户界面和交互功能。本文将详细介绍SystemUI的各项控制技术,包括音量控制、RingtonePlayer、电源管理、任务管理、通知栏和服务定制,并提供相关代码示例和解析。 SystemUI中的音量控制功能主要用于调节车机的

    2024年02月14日
    浏览(46)
  • 抖音seo源码开发源代码开发技术分享

    抖音API接口:抖音提供了丰富的API接口,包括用户信息、视频信息、评论信息等。 数据爬取技术:通过抓包分析抖音接口的数据结构,可以使用Python等编程语言编写爬虫程序。 数据库技术:需要掌握数据库的基本操作,将爬取的数据存储到数据库中。 数据分析技术:通过数

    2024年02月15日
    浏览(67)
  • 短视频矩阵营销系统技术开发者开发笔记分享

    1. 确定系统需求:根据客户的需求,确定系统的功能和特点,例如用户注册登录、视频上传、视频浏览、评论点赞等。 2. 设计系统架构:根据系统需求,设计系统的整体架构,包括前端、后端、数据库等组件的功能和交互方式。 3. 选择技术栈:根据系统的特点和需求,选择

    2024年02月14日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包