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)作为我们自定义权限的保护级别。

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

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


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

相关文章
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
735 64
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
709 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
239 0
|
Android开发 开发者
Android自定义view之利用drawArc方法实现动态效果
本文介绍了如何通过Android自定义View实现动态效果,重点使用`drawArc`方法完成圆弧动画。首先通过`onSizeChanged`进行测量,初始化画笔属性,设置圆弧相关参数。核心思路是不断改变圆弧扫过角度`sweepAngle`,并调用`invalidate()`刷新View以实现动态旋转效果。最后附上完整代码与效果图,帮助开发者快速理解并实践这一动画实现方式。
283 0
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
262 0
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
511 65
Android自定义view之网易云推荐歌单界面
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
924 84
|
9月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
759 6
|
9月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
378 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)

热门文章

最新文章