Android系统的权限从用户的角度来看有时候的确有点让人摸不着头脑。有时候可能你只需要做一些简单的事情(对联系人的信息进行编辑),却申请了远超你应用所需的权限(比如访问所有联系人信息的权限)。

这很难不让用户对你保存戒备。如果你的应用还是闭源的那用户也没办法验证是否你的应用正在把他的联系人信息上传到应用服务器上面去。即使你向用户解释你为什么申请这个权限,他们最后也可能不会相信你。所以我在过去开发Android应用的时候避免去用一些奇技淫巧,因为这会额外去申请权限,用户也会对你不信任。

经过一段时间实践后,我有这样一个体会:你在完成某些操作的时候并不一定需要申请权限的。

比如Android系统中有这样一个权限: android.permission.CALL_PHONE. 你需要这个权限来让你从你的应用中调用拨号器,对吗?下面的代码就是你如果拨打电话的,对吧?

<span style="font-size:14px;">Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("1234567890"))
startActivity(intent);</span>

错!这个权限可以让你的手机在没有用户操作的情况下打电话!也就是说如果我的应用用了这个权限,我可以在你不知情的情况下每天凌晨三点去拨打骚扰电话。

其实正确的做法是这样的——使用 ACTION_VIEW 或者 ACTION_DIAL:

<span style="font-size:14px;">Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("1234567890"))
startActivity(intent);</span>

这个方案的动人之处在于你的应用就不用申请权限啦。 为什么不需要权限呢?因为你使用的这个 Intent 会启动拨号器,并将你设置好的号码预先拨号。比起之前的方案,现在还需要用户点击“拨号”来打电话,没有用户的参与,这个电话就打不出了。说实话,这让我感觉很好,现在很多应用申请的权限让人有点不知所措。

另外一个例子:我为我的妻子写了一个叫做 Quick Map 应用,这个应用主要是为了解决她对现有的导航应用的吐槽。她只想要一个联系人列表和一条导航到这些联系人所在地的路径。

看到这里你可能觉得我需要申请访问所有联系人信息的申请来完成这个应用:哈哈哈,你又错了!如果你看了我的源码,你就知道其实我用了 ACTION_PICK这个Intent 启动相关应用来获取联系人地址的:

<span style="font-size:14px;">Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(StructuredPostal.CONTENT_TYPE);
startActivityForResult(intent, 1);</span>

这意味着我的应用不但不需要申请权限,而且还不要额外的UI。这让应用的用户体验也提升了不少。

在我看来,Android系统最酷的部分之一就是 它的 Intent 系统。因为Intent 意味着我不需要任何东西都要自己来实现。每个应用都会在Android注册它所擅长处理的数据领域,比如电话号码,短信或者联系人信息。如果什么事情都要一个应用来解决,那么这个应用会变得十分臃肿。

Android系统另外一个优点就是我可以利用其它应用所申请的权限,这样我的应用就不需要再次申请了。Android系统中的以上两点可以让你的应用变得更加简单。拨号器需要权限来拨打电话,但是我只需要一个拨打电话的intent就行了,不需要权限。因为用户信任Android自带的拨号器,但不信任我的应用,这很好啊。

我写这篇博客的意义在于在你申请权限之前,你应该至少好好读读关于Intent的官方文档,看看是否可以通过其他应用来完成你的操作。如果你想更深入的了解,你可以研究一下这篇关于权限的官方文档,里面介绍更多更精细的权限。如果想要获得更好的用户体验,有一点也是非常必要的,那就是应用的安全性,关于这一点可以去看看专业的应用安全服务商爱加密的应用安全解决方案

总之,使用更少的权限不但可以让你获取更多的用户信任,对用户来说,也让他们获得了很好的用户体验。

你的Android应用完全不需要那么多的权限的更多相关文章

  1. Android WindowManager悬浮窗:不需要申请权限实现悬浮

     Android WindowManager悬浮窗:不需要申请权限实现悬浮 附录文章1介绍了Android平台上的悬浮窗WindowManager,WindowManager悬浮窗可以悬浮在And ...

  2. Android清单文件具体解释(二) ---- 应用程序权限声明

    我们知道,Android系统的各个模块提供了很强大的功能(比方电话,电源和设置等),通过使用这些功能.应用程序能够表现的更强大.更灵活.只是,使用这些功能并非无条件的.而是须要拥有一些权限.接下来,我 ...

  3. Android 6.0 动态申请 音频+拍照+相册 权限

    1.音频的权限(包括录音和播放) 1.1.首先要在清单中加上两个权限 <uses-permission android:name="android.permission.WRITE_E ...

  4. android下创建文件夹和修改其权限的方法

    原文:http://www.cnblogs.com/wanqieddy/archive/2011/12/28/2304906.html 由于工作的需要,今天研究了在android下创建文件夹和修改其权 ...

  5. android使用mount挂载/system/app为读写权限,删除或替换系统应用

    注意:以下代码中#开头的则为需要执行的shell命令,其他的为打印的结果.#代表需要使用ROOT权限(su)执行,所以想要修改您android手机某个目录挂载为读写,首先需要有ROOT权限! 先要得到 ...

  6. Android中应用程序如何获得系统签名权限

    有些库的使用条件比较苛刻,要求同一签名的程序才可以获得访问权.此时即便是在AndroidManifest.xml中添加了相应的permission,依旧会得到没有xx访问权限的问题.比如android ...

  7. Android后门GhostCtrl,完美控制设备任意权限并窃取用户数据

    Android系统似乎已经成为世界各地病毒作者的首选目标,每天都有新的恶意软件在感染更多的设备. 这一次,安全公司趋势科技发布警告,他们发现了一个新的Android后门--GhostCtrl Ghos ...

  8. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  9. Android——SMS接收发短信与运行权限

    好久没写了,最近学习Android的相关知识,包括UI组件与布局.Activity生命周期等,而这次要讲的是,Broadcast Receiver的相关知识,主要是接收发短信,SmsManager.S ...

  10. android 读取EXcel 文件 读取文件内存卡的权限

    android 采用Java的读取xls文件的方式实现. 需要导入第三方Jxl.jar 包.  代码改自 其他博主  : 这只摘录下 读取xls文件的部分代码,当然这个代码在安卓平台需要添加下面的权限 ...

随机推荐

  1. debian 9 安装后的配置,debian 9 开发环境。

    注意:以下命令用sudo或者以root用户进行 一.Xterm(在安装KDE桌面情况下)的配置(可以黏贴,复制): 首先在根目录下编辑文件.Xresources(没有可以创建) root@debian ...

  2. 安装NexT主题

    Hexo 安装主题的方式非常简单,只需要将主题文件拷贝至站点目录的 themes 目录下, 然后修改下配置文件即可. 下载主题包 在终端窗口下,定位到 Hexo 站点目录下.使用 Git checko ...

  3. Python:Fatal error in launcher: Unable to create process using 问题排查

    cmd> django-admin 回车Fatal error in launcher: Unable to create process using '"c:\users\admin ...

  4. Jquery学习总结(4)——高效Web开发的10个jQuery代码片段

    在过去的几年中,jQuery一直是使用最为广泛的JavaScript脚本库.今天我们将为各位Web开发者提供10个最实用的jQuery代码片段,有需要的开发者可以保存起来. 1.检测Internet ...

  5. sigprocmask和信号阻塞

    注意阻塞和忽略,是有区别的. 阻塞只是暂时的,忽略是就没了. 参数:how:用于指定信号修改的方式,可能选择有三种:SIG_BLOCK //加入信号到进程屏蔽.SIG_UNBLOCK //从进程屏蔽里 ...

  6. POJ 3904

    第一道莫比乌斯反演的题. 建议参看http://www.isnowfy.com/mobius-inversion/ 摘其中部分 证明的话感觉写起来会比较诡异,大家意会吧说一下这个经典题目:令R(M,N ...

  7. 基于sparksql调用shell脚本运行SQL

    [Author]: kwu 基于sparksql调用shell脚本运行SQL,sparksql提供了类似hive中的 -e  , -f ,-i的选项 1.定时调用脚本 #!/bin/sh # uplo ...

  8. UBUNTU 16.04 下安装动态链接库方法(使用ln命令可以随意映射动态库,ldd查看缺少的动态库)

    一般先使用ldd 来查看该应用程序缺少什么东西,然后,再根据sudo apt install XXX 去安装相应的动态库. 假如没有对应的库,可以使用: sudo ln -s /usr/lib/lib ...

  9. nyoj--90--整数划分(母函数)

    整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk,  其中n1≥n2≥-≥nk≥1,k≥1.  正整数 ...

  10. 87.node.js操作mongoDB数据库示例分享

    转自:https://www.cnblogs.com/mracale/p/5845148.html 连接数据库   var mongo=require("mongodb"); va ...