Android系统 自定义系统和应用权限

简介: Android系统 自定义系统和应用权限

Android系统 文件访问权限笔记

Android系统 理解/sys/目录权限和UID和GID?

Android系统 应用存储路径与权限

Android系统 自定义系统和应用权限

Android系统 AppOps默认授予应用相应的权限

Android系统 权限组管理和兼容性


一般自定义系统和应用权限用于客制化的一些接口比较常见 , 比如我在系统中增加了一套接口 , 正常情况下 所有都能调用到系统接口 , 这是很不标准的。为了跟精细的控制权限 需要自定义权限 可以在系统中去检查权限是否申请, 如果申请了才能允许调用。那需要怎么自定义权限呢? 我们来学习下…

自定义权限允许开发者在系统或应用级别定义特定的权限,从而更精确地控制应用间的交互和数据保护自定义权限的目的: 提供更细粒度的控制

Android权限模型

Android权限模型概述

Android权限模型控制应用对系统资源和用户数据的访问。其核心特点如下:

  1. 基于声明的:应用在AndroidManifest.xml中声明所需权限,用户在安装或运行时授予或拒绝。
<uses-permission android:name="android.permission.CAMERA" />
  1. 基于分组的:预定义权限被分为组(如位置、存储、电话)。用户可以管理每个应用的权限组。
  2. 基于级别的
  • 正常:无需用户授权。
  • 危险:运行时需要用户授权。
  • 签名:仅相同签名的应用可用。
  • 特殊:仅系统应用或特定身份应用可用。
  1. 基于角色的:角色是功能或数据的抽象身份(如电话应用、浏览器)。每个角色包含了一组相关的权限,用户可以在设置中为每个角色选择一个默认的应用。当用户选择了一个角色的默认应用后,该应用会自动获得该角色所需的所有权限,而其他应用则需要用户手动授予。

Android权限的分类

Android权限分类

Android权限主要分为两类:

  1. 系统权限 (System Permission):
  • 由Android系统预定义。
  • 与系统资源或功能相关,如网络、联系人、相机。
  • 适用于任何应用,但需遵循系统的授权方式和保护级别。
<uses-permission android:name="android.permission.CAMERA" />
  1. 应用权限 (Application Permission):
  • 由开发者定义。
  • 与应用内部数据或逻辑相关。
  • 仅在定义它们的应用或具有相同签名的应用中使用。
<permission android:name="com.example.MY_PERMISSION"
            android:protectionLevel="signature"/>

自定义系统权限

如何在Android系统中自定义权限

自定义系统权限是一种特殊的系统权限,它们由系统开发者或厂商自己定义和声明,然后在系统应用中使用。自定义系统权限可以让系统开发者或厂商实现一些特定的功能或需求,例如控制某些硬件设备、访问某些系统服务、管理某些系统接口等。

要在Android系统中自定义权限,需要:

  • 在系统的清单文件(frameworks/base/core/res/AndroidManifest.xml)中声明自定义权限,使用标签,并为其指定一个唯一的名称、保护级别和描述。
  • 在使用的自定义权限的系统应用的清单文件中,使用标签,引用自定义权限的名称。
  • 在提供自定义权限的系统服务或组件中,使用checkPermission()方法,检查调用者是否具有自定义权限。

例如,假设想在Android系统中自定义一个名为com.example.permission.CUSTOM_SYSTEM_PERMISSION的权限,它可以让应用访问一个名为CustomSystemService的系统服务,该服务提供了一个名为doSomething()的方法。那么可以这样做:

  • 在系统的清单文件中,声明的自定义权限:
<permission android:name="com.example.permission.CUSTOM_SYSTEM_PERMISSION"
    android:protectionLevel="signature"
    android:label="@string/custom_system_permission_label"
    android:description="@string/custom_system_permission_description" />

这里我们为自定义权限设置了签名级别的保护级别,表示只有具有相同签名证书的应用才能使用该权限。我们也为自定义权限提供了一个标签和一个描述,用来在设置中显示给用户。

  • 在使用自定义权限的系统应用的清单文件中,引用自定义权限:
<uses-permission android:name="com.example.permission.CUSTOM_SYSTEM_PERMISSION" />

这里我们告诉系统,我们的应用需要使用该自定义权限。

  • 在提供自定义权限的系统服务或组件中,检查调用者是否具有自定义权限:
public class CustomSystemService extends Service {
    private static final String CUSTOM_SYSTEM_PERMISSION = "com.example.permission.CUSTOM_SYSTEM_PERMISSION";
    @Override
    public IBinder onBind(Intent intent) {
        return new CustomServiceBinder();
    }
    private class CustomServiceBinder extends ICustomService.Stub {
        @Override
        public void doSomething() {
            // Check if the caller has the custom permission
            int uid = Binder.getCallingUid();
            int pid = Binder.getCallingPid();
            if (checkPermission(CUSTOM_SYSTEM_PERMISSION, pid, uid) != PackageManager.PERMISSION_GRANTED) {
                // Throw a security exception if not
                throw new SecurityException("Caller does not have the custom permission");
            }
            // Do something if yes
            Log.d("CustomSystemService", "Doing something...");
        }
    }
}

这里我们使用checkPermission()方法,根据调用者的进程ID和用户ID,检查它是否具有我们的自定义权限。如果没有,我们抛出一个异常;如果有,我们执行我们想要做的事情。

如何在系统应用中使用自定义的系统权限

如果一个系统应用的开发者,可能想要使用一些自定义的系统权限,来实现一些特殊的功能或需求。要在系统应用中使用自定义的系统权限,需要:

  • 在系统应用的清单文件中,使用标签,引用想要使用的自定义权限的名称。
  • 在系统应用中,调用提供该自定义权限的系统服务或组件,使用Context.getSystemService()方法,获取该服务或组件的实例,并调用其方法。

例如,假设在系统应用中使用上一节中定义的com.example.permission.CUSTOM_SYSTEM_PERMISSION权限,来访问CustomSystemService服务,并调用其doSomething()方法。那么可以这样做:

  • 在系统应用的清单文件中,引用该自定义权限:
<uses-permission android:name="com.example.permission.CUSTOM_SYSTEM_PERMISSION" />

这里我们告诉系统,我们的应用需要使用该自定义权限。

  • 在系统应用中,调用提供该自定义权限的系统服务,并调用其方法:
public class CustomSystemApp extends Activity {
    private ICustomService mCustomService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_system_app);
        // Get the custom service instance
        mCustomService = ICustomService.Stub.asInterface(getSystemService("custom_service"));
        // Call the custom service method
        try {
            mCustomService.doSomething();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

这里我们使用getSystemService()方法,根据服务的名称(这里是"custom_service"),获取服务的实例,并转换为接口类型。然后我们调用服务的方法,如果发生远程异常,我们捕获并处理它。

自定义应用权限

如何在Android应用中自定义权限

自定义应用权限是一种常见的应用权限,它们由应用开发者自己定义和声明,然后在自己的应用或具有相同签名的应用中使用。自定义应用权限可以让应用开发者实现一些特定的功能或需求,例如控制某些服务或组件的访问、保护某些数据或逻辑等。

要在Android应用中自定义权限,需要:

  • 在应用的清单文件中声明自定义权限,使用标签,并为其指定一个唯一的名称、保护级别和描述。
  • 在提供自定义权限的服务或组件中,使用android:permission属性,引用自定义权限的名称。
  • 在使用自定义权限的应用的清单文件中,使用标签,引用自定义权限的名称。

假设想在应用中自定义一个名为com.example.permission.CUSTOM_APP_PERMISSION的权限,它可以让应用访问一个名为CustomAppService的服务,该服务提供了一个名为doSomething()的方法。那么可以这样做:

  • 在应用的清单文件中,声明的自定义权限:
<permission android:name="com.example.permission.CUSTOM_APP_PERMISSION"
    android:protectionLevel="normal"
    android:label="@string/custom_app_permission_label"
    android:description="@string/custom_app_permission_description" />

这里我们为自定义权限设置了正常级别的保护级别,表示该权限不需要用户授权,只需要在清单文件中声明即可。我们也为自定义权限提供了一个标签和一个描述,用来在设置中显示给用户。

  • 在提供自定义权限的服务中,引用自定义权限:
<service android:name=".CustomAppService"
    android:permission="com.example.permission.CUSTOM_APP_PERMISSION">
    <intent-filter>
        <action android:name="com.example.action.CUSTOM_APP_ACTION" />
    </intent-filter>
</service>

这里我们使用android:permission属性,告诉系统,只有具有该自定义权限的应用才能访问该服务。

  • 在使用自定义权限的应用的清单文件中,引用自定义权限:
<uses-permission android:name="com.example.permission.CUSTOM_APP_PERMISSION" />

这里我们告诉系统,我们的应用需要使用该自定义权限。

如何在应用中使用自定义的应用权限

如果一个应用的开发者,可能想要使用一些自定义的应用权限,来实现一些特殊的功能或需求。要在应用中使用自定义的应用权限,需要:

  • 在应用的清单文件中,使用标签,引用想要使用的自定义权限的名称。
  • 在应用中,调用提供该自定义权限的服务或组件,使用Context.bindService()方法,绑定到该服务或组件,并获取其实例,并调用其方法。

例如,假设想在应用中使用上一节中定义的com.example.permission.CUSTOM_APP_PERMISSION权限,来访问CustomAppService服务,并调用其doSomething()方法。那么可以这样做:

  • 在应用的清单文件中,引用该自定义权限:
<uses-permission android:name="com.example.permission.CUSTOM_APP_PERMISSION" />

这里我们告诉系统,我们的应用需要使用该自定义权限。

  • 在应用中,调用提供该自定义权限的服务,并调用其方法:
public class CustomApp extends Activity {
    private ICustomAppService mCustomAppService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_app);
        // Bind to the custom service
        Intent intent = new Intent("com.example.action.CUSTOM_APP_ACTION");
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // Get the custom service instance
            mCustomAppService = ICustomAppService.Stub.asInterface(service);
            // Call the custom service method
            try {
                mCustomAppService.doSomething();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // Unbind from the custom service
            mCustomAppService = null;
        }
    };
}

这里我们使用bindService()方法,根据服务的意图(这里是"com.example.action.CUSTOM_APP_ACTION"),绑定到服务,并传入一个服务连接对象。当服务连接成功时,我们获取服务的实例,并转换为接口类型。然后我们调用服务的方法,如果发生远程异常,我们捕获并处理它。当服务断开连接时,我们释放服务的实例。

权限的保护级别

Android权限的保护级别概述

Android权限的保护级别是一种属性,用来表示权限的风险程度和授权方式。Android提供了以下几种保护级别:

保护级别 描述 授权方式 示例 注意事项
正常 (normal) 低风险,不涉及用户隐私或安全。 自动授权,仅需在AndroidManifest.xml声明。 访问网络、设置壁纸。 无需运行时请求。
危险 (dangerous) 涉及用户隐私或安全。 需要运行时用户授权。 使用相机、读取联系人。 从Android 6.0开始,需要运行时请求。
签名 (signature) 仅相同签名的应用可用。 自动授权,但应用必须有相同的签名。 访问系统设置、使用指纹。 不同签名的应用无法使用此权限。
特殊 (special) 仅系统应用或特定身份应用可用。 通常需要用户在设置中手动授予。 安装应用、重启设备。 普通应用通常无法使用,除非有特殊途径。

如何为自定义权限设置保护级别

当在Android系统或应用中自定义权限时,可以为自定义权限设置合适的保护级别,以便控制自定义权限的风险程度和授权方式。要为自定义权限设置保护级别,需要:

  • 在自定义权限的声明中,使用android:protectionLevel属性,指定想要使用的保护级别。
  • 根据选择的保护级别,遵循相应的规则和约束,例如是否需要用户授权、是否需要相同签名、是否需要特殊身份等。

例如,假设想为com.example.permission.CUSTOM_APP_PERMISSION权限设置正常级别的保护级别。那么可以这样做:

  • 在自定义权限的声明中,指定正常级别的保护级别:
<permission android:name="com.example.permission.CUSTOM_APP_PERMISSION"
    android:protectionLevel="normal"
    android:label="@string/custom_app_permission_label"
    android:description="@string/custom_app_permission_description" />

这里我们使用android:protectionLevel属性,指定了正常级别(normal)作为我们自定义权限的保护级别。

  • 遵循正常级别的规则和约束:

由于正常级别的权限不需要用户授权,所以我们只需要在清单文件中声明即可。我们不需要在运行时检查或请求该权限。我们也不需要担心签名或身份问题。


希望这篇文章能对您有所帮助。如果还有其他问题或建议,请留言与私信。

相关文章
|
24天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
52 14
|
27天前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
25天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
25天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
26天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
25天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
33 0
|
7月前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
634 1
|
7月前
|
XML Android开发 数据安全/隐私保护
android 11后文件读写访问权限申请
android 11后文件读写访问权限申请
284 0
|
XML 缓存 API
Android 7.0之访问文件的权限和FileProvider类
转载请标明出处: http://blog.csdn.net/djy1992/article/details/72533310 本文出自:【奥特曼超人的博客】 权限更改 Android 7.0 做了一些权限更改,这些更改可能会影响您的应用。
3719 0
|
存储 Android开发
【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)
【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)
223 0
【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)