Android - 运行时权限 PermissionX

Android---PermissionX实现动态权限申请 PermissionX是一个扩展Android库,使Android运行时权限请求变得极其容易。你可以将它用于基本的许可请求场合或处理更复杂的情况,如显示理由对话框或手动进入应用程序设置以获得许可。 阅读详情

查看作者各版本专栏

一、版本权限变更

1.1 前台Service

Android 10获取定位需要Manifest配置
Android 11增加了摄像头和麦克风需要Manifest配置
PermissionX正常代码申请,记得在Manifest中对Service配置就行。
<service ...
    android:foregroundServiceType="location"    //10
    android:foregroundServiceType="location|camera|microphone"    //11
/>

1.2 后台定位

后台定位:ACCESS_BACKGROUND_LOCATION

前台定位:ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION

Android 10后台定位和前台定位需要一起申请(不具备前台资格怎么可能具备后台)
【始终允许】表示都同意
【仅在使用时允许】表示只允许前台
【拒绝】表示都不允许
Android 11同时申请后台和前台会崩溃,申请后台之前需要已经授权了前台。
PermissionX同时申请前台和后台权限会就行,会自动处理:≤9只申请前台,10同时申请,11分开申请自动最后申请后台。

1.3 蓝牙

Android 12

修复使用蓝牙扫描附近设备的时候需要申请定位权限(蓝牙不是运行时权限,定位是),被拆封成三个运行时权限,用到哪个申请哪个(属于同一个权限组):

【BLUETOOTH_SCAN】用于使用蓝牙扫描附件其他的蓝牙设备

【BLUETOOTH_ADVERTISE】用于允许当前的设备被其他的蓝牙设备所发现

【BLUETOOTH_CONNECT】用于连接之前已经配对过的蓝牙设备

//≥12用到哪个申请哪个(都是同一个权限组)
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    add(Manifest.permission.BLUETOOTH_SCAN)
    add(Manifest.permission.BLUETOOTH_ADVERTISE)
    add(Manifest.permission.BLUETOOTH_CONNECT)
}

1.4 应用安装

Android 88之前只要用户在手机上开启“允许安装未知来源的应用”选项就可以任意安装APP,8之后每次安装都会自动让用户同意一遍。对于开发者来说只要Manifest申请权限就行,但国内魔改ROM会在第一次安装时提醒,未授权后面不会再提醒。手动代码申请一下就行。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

add(Manifest.permission.REQUEST_INSTALL_PACKAGES)

1.5  媒体文件

Android 13

当 targetSsk≥33 时申请 READ_EXTERNAL_STORAGE 无效果,取而代之的是更加细分的权限,图片音频视频需要申请以下三种权限,其他文件需要跳转到系统文件管理器,详见MediaStore。

【READ_MEDIA_IMAGES】图片

【READ_MEDIA_VIDEO】视频

【READ_MEDIA_AUDIO】音频

//≥13用到哪个申请哪个(图片视频是同一个权限组,音频是别的)
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    add(Manifest.permission.READ_MEDIA_IMAGES)
    add(Manifest.permission.READ_MEDIA_AUDIO)
    add(Manifest.permission.READ_MEDIA_VIDEO)
}

1.6 通知

Android 8加入通知渠道,桌面图标角标。
Android 1313之前系统默认APP有通知权限可以随时发,13之后发的时候需要申请,也不能像之前那样检测被关闭后跳转引导开启。
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    add(Manifest.permission.POST_NOTIFICATIONS)
}
//或者使用这个就不用手动判断了
add(PermissionX.permission.POST_NOTIFICATIONS)

1.7 后台运动传感器权限

Android 13

13之前申请了前后台都可以使用,13之后只能前台用,多了一个后台,并且需要前台通过了才能申请后台,一起申请还会同时被拒。
PermissionX两个一起申请,并对后台做SDK判断
<uses-permission android:name="android.permission.BODY_SENSORS"/>
<uses-permission android:name="android.permission.BODY_SENSORS_BACKGROUND"/>

add(Manifest.permission.BODY_SENSORS)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    add(Manifest.permission.BODY_SENSORS_BACKGROUND)
}

1.8 附近WiFi设备权限

Android 13

修复使用Wifi调用热点、直连、RTTT等功能的时候需要申请定位权限(Wifi不是运行时权限,定位是),被拆封成四个运行时权限,用到哪个申请哪个(属于同一个权限组):

【BLUETOOTH_SCAN】
【BLUETOOTH_ADVERTISE】
【BLUETOOTH_CONNECT】

【NEARBY_WIFI_DEVICES】

<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"/>

add(Manifest.permission.NEARBY_WIFI_DEVICES)

二、使用 PermissionX

查看最新版本

默认弹窗上的文字已适配国际化(只需要保证自己传入的文字使用@String)、颜色已适配深色模式。

implementation 'com.guolindev.permissionx:permissionx:1.7.1'

2.1 配置Manifest

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

2.2 权限申请 & 回调处理

//定义申请的权限清单
val requestList = ArrayList<String>().apply {
    //一般添加权限
    add(Manifest.permission.CALL_PHONE)
    //有些权限存在版本区别,需要判断
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        add(Manifest.permission.BLUETOOTH_SCAN) //12的蓝牙
    }
}
if (requestList.isNotEmpty()) {
    //初始化
    PermissionX.init(this)
        //要申请的权限列表(可直接传入上方的requestList)
        .permissions(Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA)
        //(可选)修改默认对话框的颜色(浅色主题、深色主题)(默认已适配深色模式)
        .setDialogTintColor(Color.parseColor("#008577"), Color.parseColor("#83e8dd"))
        //(可选)在申请前先弹窗说明(下方通过beforeRequest区分)
        .explainReasonBeforeRequest()
        //弹窗申请原因(提供功能函数的上下文对象,被拒绝或者还未申请的权限清单,是否是申请前)
        .onExplainRequestReason { scope, deniedList, beforeRequest ->
            if (beforeRequest) {
                //申请前说明(上方需要添加.explainReasonBeforeRequest())
                scope.showRequestReasonDialog(
                    deniedList,"为了保证程序正常工作,请您同意以下权限申请","我已明白")
            } else {
                //拒绝后说明(会再次申请)
                val filteredList = deniedList.filter {
                    it == Manifest.permission.CAMERA
                }
                //使用默认的弹窗
                scope.showRequestReasonDialog(
                    filteredList,"摄像机权限是程序必须依赖的权限","同意","拒绝")
                //(可选)使用自定义弹窗
//                            val str = "摄像机权限是程序必须依赖的权限"
//                            val myDialog = MyDialog(context, str, deniedList)
//                            scope.showRequestReasonDialog(myDialog)
            }
        }
        //针对被拒绝且不再询问的权限进行解释并跳转到系统设置
        .onForwardToSettings { scope, deniedList ->
            scope.showForwardToSettingsDialog(deniedList, "您需要去应用程序设置当中手动开启权限", "我已明白")
        }
        //申请权限并接收结果(是否全通过、通过的权限名单、拒绝的权限名单)
        .request { allGranted, grantedList, deniedList ->
            if (allGranted) {
                Toast.makeText(this, "所有申请的权限都已通过", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "您拒绝了如下权限:$deniedList", Toast.LENGTH_SHORT).show()
            }
        }
}

2.3 创建自定义弹窗 (可选)

2.3.1 通过 Dialog

//自定义弹窗
class MyDialog(context: Context, val str: String, val permissions: List<String>) : RationaleDialog(context) {

    private val groupSet = HashSet<String>()
    private lateinit var negativeBtn: Button
    private lateinit var positiveBtn: Button
    private lateinit var permissionsLayout: LinearLayout

    //一个权限组包含多个权限
    private val permissionMap = mapOf(
        Manifest.permission.READ_CALENDAR to Manifest.permission_group.CALENDAR,
        Manifest.permission.WRITE_CALENDAR to Manifest.permission_group.CALENDAR,
        Manifest.permission.READ_CALL_LOG to Manifest.permission_group.CALL_LOG,
        Manifest.permission.WRITE_CALL_LOG to Manifest.permission_group.CALL_LOG,
        Manifest.permission.PROCESS_OUTGOING_CALLS to Manifest.permission_group.CALL_LOG,
        Manifest.permission.CAMERA to Manifest.permission_group.CAMERA,
        Manifest.permission.READ_CONTACTS to Manifest.permission_group.CONTACTS,
        Manifest.permission.WRITE_CONTACTS to Manifest.permission_group.CONTACTS,
        Manifest.permission.GET_ACCOUNTS to Manifest.permission_group.CONTACTS,
        Manifest.permission.ACCESS_FINE_LOCATION to Manifest.permission_group.LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION to Manifest.permission_group.LOCATION,
        Manifest.permission.ACCESS_BACKGROUND_LOCATION to Manifest.permission_group.LOCATION,
        Manifest.permission.RECORD_AUDIO to Manifest.permission_group.MICROPHONE,
        Manifest.permission.READ_PHONE_STATE to Manifest.permission_group.PHONE,
        Manifest.permission.READ_PHONE_NUMBERS to Manifest.permission_group.PHONE,
        Manifest.permission.CALL_PHONE to Manifest.permission_group.PHONE,
        Manifest.permission.ANSWER_PHONE_CALLS to Manifest.permission_group.PHONE,
        Manifest.permission.ADD_VOICEMAIL to Manifest.permission_group.PHONE,
        Manifest.permission.USE_SIP to Manifest.permission_group.PHONE,
        Manifest.permission.ACCEPT_HANDOVER to Manifest.permission_group.PHONE,
        Manifest.permission.BODY_SENSORS to Manifest.permission_group.SENSORS,
        Manifest.permission.ACTIVITY_RECOGNITION to Manifest.permission_group.ACTIVITY_RECOGNITION,
        Manifest.permission.SEND_SMS to Manifest.permission_group.SMS,
        Manifest.permission.RECEIVE_SMS to Manifest.permission_group.SMS,
        Manifest.permission.READ_SMS to Manifest.permission_group.SMS,
        Manifest.permission.RECEIVE_WAP_PUSH to Manifest.permission_group.SMS,
        Manifest.permission.RECEIVE_MMS to Manifest.permission_group.SMS,
        Manifest.permission.READ_EXTERNAL_STORAGE to Manifest.permission_group.STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE to Manifest.permission_group.STORAGE,
        Manifest.permission.ACCESS_MEDIA_LOCATION to Manifest.permission_group.STORAGE
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.dialog_permission)
        val messageText: TextView = findViewById(R.id.messageText)
        negativeBtn = findViewById(R.id.negativeBtn)
        positiveBtn = findViewById(R.id.positiveBtn)
        permissionsLayout = findViewById(R.id.permissionsLayout)
        messageText.text = str
        buildPermissionsLayout()
        window?.let {
            val param = it.attributes
            val width = (context.resources.displayMetrics.widthPixels * 0.8).toInt()
            val height = param.height
            it.setLayout(width, height)
        }
    }

    //确定按钮
    override fun getPositiveButton(): View {
        return positiveBtn
    }

    //取消按钮(弹窗不可取消就返回null)
    override fun getNegativeButton(): View {
        return negativeBtn
    }

    //要申请的权限列表
    override fun getPermissionsToRequest(): List<String> {
        return permissions
    }

    //申请是需要使用权限名,一个权限通过后该组其他权限会一起通过,但只需要显示组名给用户看
    private fun buildPermissionsLayout() {
        for (permission in permissions) {
            val permissionGroup = permissionMap[permission]
            if (permissionGroup != null && !groupSet.contains(permissionGroup)) {
                val textView = LayoutInflater.from(context).inflate(R.layout.textview_permission, permissionsLayout, false) as TextView
                textView.text =context.packageManager.getPermissionGroupInfo(permissionGroup, 0).loadLabel(context.packageManager)
                permissionsLayout.addView(textView)
                groupSet.add(permissionGroup)
            }
        }
    }

}

2.3.2 通过 DialogFragment

//具体实现和上面的 Dialog 方式一样
class MyDialogFragment(context: Context, val str: String, val permissions: List<String>) : RationaleDialogFragment() {
    override fun getPositiveButton(): View { }
    override fun getNegativeButton(): View? { }
    override fun getPermissionsToRequest(): MutableList<String> { }
}

2.4 特殊权限申请

 特殊权限,既不属于普通权限也不属于危险权限,申请的时候需要使用intent跳转到系统界面让用户开启。

悬浮窗Android 6开始,只在自己的APP内是不需要申请权限的,悬浮在其他APP上需要。

【Manifest权限名称】<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

【intent跳转的action】Settings.ACTION_MANAGE_OVERLAY_PERMISSION

【判断是否授权的API】Settings.canDrawOverlays(context)

修改系统设置Android 6开始,允许APP读写系统设置。

【Manifest权限名称】<uses-permission android:name="android.permission.WRITE_SETTINGS" />

【intent跳转的action】Settings.ACTION_MANAGE_WRITE_SETTINGS

【判断是否授权的API】Settings.System.canWrite(context)

管理外置存储Android 11开始,强制启用作用域存储 Scoped Storage 使得所有APP不再对SD卡进行全局读写(10就有了),允许读整个SD卡进行读写。

【Manifest权限名称】<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

【intent跳转的action】Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION

【判断是否授权的API】Environment.isExternalStorageManager()

//手写
if (Build.VERSION.SDK_INT >= 23) {
    if (Settings.canDrawOverlays(context)) {
        showFloatView()
    } else {
        val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
        startActivity(intent)
    }
} else {
    showFloatView()
}
//使用PermissionX
PermissionX.init(activity)
    .permissions(Manifest.permission.SYSTEM_ALERT_WINDOW)
    .onExplainRequestReason { scope, deniedList ->
        val message = "PermissionX需要您同意以下权限才能正常使用"
        scope.showRequestReasonDialog(deniedList, message, "Allow", "Deny")
    }
    .request { allGranted, grantedList, deniedList ->
        if (allGranted) {
            Toast.makeText(activity, "所有申请的权限都已通过", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(activity, "您拒绝了如下权限:$deniedList",Toast.LENGTH_SHORT).show()
        }
    }

三、纯手写示例

<uses-permission android:name="android.permission.CALL_PHONE" />
//定义请求码(唯一值),不能为负数
val CALL_PERMISSION = 1
//申请权限后重写这个回调(对用户选择结果进行处理)
override fun onRequestPermissionsResult(requestCode: Int,  permissions: Array<out String>,  grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    //根据对应的请求码去分类处理
    when (requestCode) {
        CALL_PERMISSION -> {
            //申请通过就执行方法
            if (grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION_GRANTED) {
                call()
            } else {
                //申请被拒绝就用对话框、吐司等方式提示
                Toast.makeText(this,"不授权怎么用?",Toast.LENGTH_SHORT).show()
            }
        }
    }
}
//对call()进行封装
fun callWrapper(){
    //拿到权限状态
    val permission = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CALL_PHONE)
    //没有授权就申请,有授权就直接调用
    if(permission != PackageManager.PERMISSION_GRANTED){
        //参数一当前Activity,参数二把要申请的权限名放入数组中,参数三是唯一的请求码
        ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CALL_PHONE),CALL_PERMISSION)
    } else {
        call()
    }
}
//具体涉及涉及风险权限的业务代码
private fun call(){
    try {
        val intent= Intent(Intent.ACTION_CALL)
        intent.data= Uri.parse("tel:10086")
        startActivity(intent)
    }catch (e:SecurityException){
        e.printStackTrace()
    }
}

Android运行时权限终极方案(PermissionX) 主要介绍了Android运行时权限终极方案(PermissionX),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载

相关推荐

PermissionX:一个开源的Android库,使处理运行时权限变得非常容易

权限X PermissionX是Android库的扩展,它使Android运行时权限请求变得非常容易。 您可以将其用于基本权限请求场合,也可以处理更复杂的条件,例如显示“基本原理”对话框或手动转到应用程序设置以获取津贴。 快速设置 编辑您的build.gradle文件并添加以下依赖项。 dependencies { implementation ' com.permissionx.guolindev:permissionx:1.4.0 ' } 就这样。 现在您可以开始了。 基本用法 使用PermissionX来请求Android运行时权限非常简单。 例如。 如果要请求READ_CONTACTS,CAMERA和CALL_PHONE权限,请首先在AndroidManifest.xml中声明它们。 < manifest xmlns : android = " http://sch

Android 最新权限请求利器----PermissonX

android协程同步权限获取 implementation("com.gitee.gggl:permissionx:1.0.4")

GGGL的专栏 2039

别再魔改LWIP了!用STM32CubeMX配置F407的TCP保活(KeepAlive)与自动重连

本文详细介绍了如何通过STM32CubeMX配置STM32F407的LWIP协议栈,实现TCP保活(KeepAlive)与自动重连功能,解决网络异常断开问题。文章提供了从基础环境配置到自动重连架构设计的完整指南,帮助开发者构建高可靠的网络连接机制,适用于工业物联网和嵌入式设备开发。

weixin_27038245的博客 234

Android之编写申请权限库PermissionX

比如要实现拨打电话的功能,一般我们要编写如下Android运行时权限API可以看到,这种系统内置的运行时权限API的用法还是非常烦琐的,需要先判断用户是否授权我们拨打电话的权限,如果没有的话需要进行权限申请,然后还要在onRequestPermissionsResult()回调中处理权限申请的结果,最后才能去执行拨打电话的操作。我们可以通过这个过程编写一个开源库PermissionX。之前我们写的所有代码都是在app目录下进行的。这其实是一个专门用于开发应用程序的模块。

ChenYiRan123456的博客 1718

HFSS仿真中如何提取最大E/H场强与频率关系曲线

本文详细讲解了在HFSS仿真中提取最大E/H场强与频率关系曲线的完整流程。通过使用场计算器(Field Calculator)和创建场报告,工程师可以准确获得器件在整个频带内的电场或磁场强度峰值,并进一步推导出关键的功率容量曲线,为高功率射频器件(如滤波器、耦合器)的设计提供至关重要的安全评估依据。

ss78901的博客 1099

Cisco Packet Tracert 无线路由器配置

Cisco Packet Tracert 无线路由器配置

yushan_caoyu的博客 2万+

Android运行时权限终极方案,用PermissionX吧

没有人愿意编写处理Android运行时权限的代码,因为它真的太繁琐了。 这是一项没有什么技术含量,但是你又不得不去处理的工作,因为不处理它程序就会崩溃。但如果处理起来比较简单也就算了,可事实上,Android提供给我们的运行时权限API并不友好。 以一个拨打电话的功能为例,因为CALL_PHONE权限是危险权限,所以在我们除了要在AndroidManifest.xml中声明权限之外,还要在执行拨打电话操作之前进行运行时权限处理才行

郭霖的专栏 5万+

第三章:ESP32零基础教学 - 3.4 蓝牙通信

本文详细介绍了如何在ESP32上实现经典蓝牙和BLE通信,并提供了代码解释和示例。通过这些示例,你可以轻松地将蓝牙功能集成到你的物联网项目中。无论是经典蓝牙的简单串口通信,还是BLE的灵活服务架构,ESP32都能满足你的需求。

Hi__gril的博客 4020

PermissionX 1.7发布,全面支持Android 13运行时权限

今年的Android 13在运行时权限变更方面变化较大,为此PermissionX在1.7版本也进行了诸多适配,并已全面支持Android 13系统。 如果你想要非常详细地了解Android 13运行时权限具体有哪些变更,可以参考我之前写的这篇文章 Android 13运行时权限变更一览。 本篇文章,我们将聚焦在,如何使用新版的PermissionX来轻松地请求Android

郭霖的专栏 5万+

Vue集成天地图:从定位到交互绘图的完整实践指南

本文详细介绍了如何在Vue项目中集成天地图API,从基础配置到高级功能实现,包括定位、标点、画线等交互绘图功能。通过实战代码示例和性能优化技巧,帮助开发者快速掌握Vue与天地图的结合应用,提升地图开发效率。

weixin_29013129的博客 248

告别OFDM卡顿:用MATLAB手把手仿真AFDM波形,搞定高铁、无人机通信的时变信道难题

本文详细介绍了如何使用MATLAB仿真AFDM波形,解决高铁和无人机通信中的时变信道难题。通过仿射变换技术,AFDM在多普勒频移严重的场景下表现优异,显著提升通信质量。文章包含参数配置、波形生成、性能对比等实战内容,适合通信工程师和研究人员参考。

weixin_27014595的博客 319

Android运行时权限管理神器:PermissionX安装与配置完全指南

**PermissionX** 是一款由郭霖(guolindev)开发的开源Android库,专为简化Android应用程序中的运行时权限请求而设计。它极大地方便了开发者处理复杂的权限申请逻辑,支持基本的权限请求以及展示解释理由对话框、引导用户至应用设置等高级场景。本项目采用 **Kotlin** 为主要编程语言,适应现代Android开发趋势。 ## 关键技术和框架 - **Kotlin**...

gitblog_07893的博客 1204

【入门AUTOSAR网络管理测试】RSS-PBM状态转换

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中RSS-PBM状态转换如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 872

Android运行时权限管理终极解决方案:PermissionX完全指南

PermissionX是一款开源的Android库,它让处理运行时权限变得极其简单。无论是新手开发者还是有经验的程序员,都能通过PermissionX快速实现权限请求功能,避免因权限处理不当导致的应用崩溃或用户体验下降问题。 ## 🚀 为什么选择PermissionX? 在Android开发中,权限管理一直是一个棘手的问题。随着Android系统版本的不断更新,权限机制也在不断变化,从最初的

gitblog_00753的博客 1123

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2640

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

5分钟快速掌握Android权限管理:PermissionX终极使用指南

想要轻松处理Android运行时权限管理?PermissionX正是你需要的终极解决方案!这款开源Android库由郭霖(guolindev)开发,专门为简化复杂的权限请求逻辑而生。无论你是新手开发者还是经验丰富的Android工程师,PermissionX都能让你的权限管理变得简单高效。🚀 ## 为什么选择PermissionX? Android 6.0引入的运行时权限机制虽然提升了用户隐

gitblog_00080的博客 1109

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一、常用权限申请库——PermissionX

PermissionX的介绍和两种基本使用方法,神器!

真不想写注释。 2498

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

PermissionX:Android权限管理库终极指南与快速上手

想要让Android应用的权限管理变得轻松愉快吗?PermissionX作为一款专为简化Android运行时权限申请而设计的开源库,正是您需要的解决方案。这款基于Kotlin的权限处理工具让开发者能够优雅地处理复杂的权限申请逻辑,告别繁琐的手动权限请求代码,提升应用的用户体验和安全性。😊 ## 🚀 核心优势解析:为什么选择PermissionX? ### 极简API设计 Permissio

gitblog_00037的博客 873

Android权限管理终极指南:PermissionX快速上手教程

在Android开发中,权限管理一直是开发者必须面对的重要环节。随着Android系统的不断升级,权限请求机制也变得越来越复杂。PermissionX作为一款专为简化Android运行时权限处理而设计的开源库,能够帮助开发者轻松应对复杂的权限申请逻辑,提升应用的用户体验和安全性。 ## 📱 项目概述与核心优势 PermissionX采用Kotlin语言编写,通过简洁的API设计,让权限请求变

gitblog_00388的博客 946

PermissionX终极指南:Android权限管理完整教程

PermissionX是一款专为Android开发者设计的开源权限管理库,它通过简洁直观的API极大简化了运行时权限的申请流程。无论您是需要处理基础权限请求,还是应对复杂的权限解释场景,PermissionX都能提供优雅的解决方案。 ## 环境准备与前置条件 在开始使用PermissionX之前,请确保您的开发环境满足以下要求: - **Android Studio**:最新稳定版本 - *

gitblog_00161的博客 765

PermissionX:Android权限管理的革命性解决方案

PermissionX是一款开源Android库,能让运行时权限处理变得极其简单。无论是基础权限请求,还是处理复杂场景如显示权限说明对话框、引导用户前往应用设置手动授权,PermissionX都能轻松应对,是Android开发者的必备工具。 ## 快速集成PermissionX的步骤 要在项目中使用PermissionX,只需简单几步即可完成集成。首先,在你的build.gradle文件中添加

gitblog_00266的博客 942

终极PermissionX使用指南:快速掌握Android权限管理技巧

PermissionX是一个功能强大的Android开源库,能让运行时权限处理变得异常简单。无论是基础的权限请求场景,还是复杂的权限逻辑处理,PermissionX都能轻松应对,帮你高效管理Android应用的权限。 ## 快速开始PermissionX的集成步骤 要在项目中使用PermissionX,只需简单几步即可完成集成。首先编辑你的build.gradle文件,添加以下依赖: ```

gitblog_00863的博客 825

如何用PermissionX轻松解决Android权限请求难题

PermissionX是一款强大的Android开源库,能让运行时权限请求变得极其简单。无论是基础的权限请求场景,还是处理更复杂的情况,如显示权限说明对话框或引导用户前往应用设置手动授权,它都能轻松应对。 ## 🌟 为什么选择PermissionX? Android的运行时权限请求常常让开发者头疼不已,既要处理各种权限的申请逻辑,又要考虑用户可能的拒绝情况。PermissionX的出现,就是

gitblog_00448的博客 527

PermissionX终极指南:轻松掌握Android权限管理

在Android开发中,权限管理一直是一个复杂且容易出错的重要环节。PermissionX作为一款优秀的开源库,专门为简化Android运行时权限处理而生,让开发者能够专注于业务逻辑而非繁琐的权限申请代码。 ## 权限管理核心问题解析 ### 权限分类与挑战 Android权限系统从6.0开始引入了动态权限机制,将权限分为普通权限和危险权限两大类。普通权限在安装时自动授予,而危险权限需要在运行

gitblog_00709的博客 923
上一篇: Android - 内容提供者 ContentProvider
下一篇: Android - 键值对存储 SharedPreference、DataStore、MMKV
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值