Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)

简介: Unity通过Android Studio 获取手机权限(存储、录音、相机等)文章目录Unity通过Android Studio 获取手机权限(存储、录音、相机等)常用权限一、动态获取权限流程二、使用步骤1.检测当前是否已获取权限2.检测当前安卓版本3.申请动态获取权限总结

Unity通过Android Studio 获取手机权限(存储、录音、相机等)

文章目录

Unity通过Android Studio 获取手机权限(存储、录音、相机等)

常用权限

一、动态获取权限流程

二、使用步骤

1.检测当前是否已获取权限

2.检测当前安卓版本

3.申请动态获取权限

总结

常用权限

<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />

一、动态获取权限流程

Android系统从6.0开始对一些危险的权限进行了动态获取权限

下图是动态获取权限的额流程图


image.png


二、使用步骤

在使用获取权限的时候大致可以分为两种情况,一种是打开应用的时候就直接获取应用所需的权限,这时候就把所有权限直接在初始化的时候就获取到。另一种是在使用某种功能时,才获取权限。比如应用内使用相机、录音机等。


接下来使用第二种方法获得权限


1.检测当前是否已获取权限

代码如下(示例):

int permissioncamera;
int permissionaudio;
// 判断targetSdkVersion 是否大于等于23,这个都是自己写的,一般也不用判断,直接根据自己的版本选择方法就行
if (MainActivity.this.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M) {
    //安卓6.0 以上使用
    permissioncamera = MainActivity.this.checkSelfPermission(android.Manifest.permission.CAMERA);
    permissionaudio = MainActivity.this.checkSelfPermission(android.Manifest.permission.RECORD_AUDIO);
} else {
    //安卓6.0 以下使用
    permissioncamera=PermissionChecker.checkSelfPermission(MainActivity.this,android.Manifest.permission.CAMERA);
    permissionaudio=PermissionChecker.checkSelfPermission(MainActivity.this,android.Manifest.permission.RECORD_AUDIO);
}
    //检查是否已经获取了相机权限:
    if(permissioncamera!= PackageManager.PERMISSION_GRANTED) 
    //检查是否已经获取了录音权限:
    if(permissionaudio!= PackageManager.PERMISSION_GRANTED) 

2.检测当前安卓版本

由于安卓6.0前后的获取方法不同,所以在使用的时候先判断一下版本


代码如下(示例):

if (MainActivity.this.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M) 

3.申请动态获取权限

     MainPort.this.requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, 0x01);
     //在此String中添加各种权限一款获取
        @Override
        //这是弹窗选择后的回调
    public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
        switch (requestCode) {
            //允许权限
            case 0x01: {
                // 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.
                }
                //拒绝并不在询问
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainPort.this,"您拒绝了录音权限,请手动去应用->设置,修改权限",Toast.LENGTH_LONG).show();
                    }
                });
                return;
            }
        }
    }

总结

AS端:

 public void permissionDemo(){
        //使用录音前首先需要获取权限
        int permissionCheck= MainPort.this.checkSelfPermission(android.Manifest.permission.RECORD_AUDIO);
        //int permissionCheck = ContextCompat.checkSelfPermission(MainPort.this, Manifest.permission.RECORD_AUDIO);
        //如果有权限则返回PackageManager.PERMISSION_GRANTED,否则返回PackageManager.PERMISSION_DENIED。
        if(permissionCheck!= PackageManager.PERMISSION_GRANTED) {//为获取权限时
            //请求获取权限
            MainPort.this.requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, 0x01);
            //用new String[]的原因是可以在String[]中存储多个需要的权限,一次过请求
            //将回调onRequestPermissionsResult()方法
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 0x01: {
                // 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.
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainPort.this,"您拒绝了录音权限,请手动去应用->设置,修改权限",Toast.LENGTH_LONG).show();
                    }
                });
                return;
            }
        }
    }

Unity端:

        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        //在需要使用的地方调用此方法即可获取权限
        jo.Call("permissionDemo");
相关文章
|
1月前
|
Java Linux Android开发
移动应用开发与操作系统的交互:深入理解Android和iOS
在数字时代,移动应用成为我们日常生活的一部分。本文将深入探讨移动应用开发的核心概念、移动操作系统的工作原理以及它们如何相互作用。我们将通过实际代码示例,展示如何在Android和iOS平台上创建一个简单的“Hello World”应用,并解释其背后的技术原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
234 1
|
1月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
222 2
|
2月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
64 5
|
2月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
132 3
|
3月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
55 1
|
3月前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
1305 0
Android Studio: 解决Gradle sync failed 错误
|
2月前
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
147 0
|
2月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
120 0
|
3月前
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
106 0

热门文章

最新文章