有用android room6.0的小伙伴玩the room3的吗

《未上锁的房间3The Room Three》评测:精彩机关术依旧
文章作者:蛋黄酱 发布时间:日 16:43
关键词The Room,解谜益智,恐怖悬疑
画 &面一如既往的精致细腻,将各色机关刻画地惟妙惟肖
音 &乐基本上比较安静,除了机关转动的声音
操 &作一只手指便可操作,简单易上手
可玩性出色的系列新作,机关术和剧情依然精彩,CG增强场景增多探索性更强
费 &用付费30元下载体验全部
无数玩家翘首以待、室内解谜史上的神作、Fireproof Games制作的《未上锁的房间》(The Room)系列新作《未上锁的房间3》(The Room Three)于11月4日登陆iOS平台,游戏延续前作的风格依然设计了丰富的机关解谜玩法展现神秘的“空”研究。目前版本不像亚洲版那样支持原生中文且安卓版暂未发,所以想要汉化和安卓版的玩家还要等上一段时间,相信各大汉化组是不会错过这部佳作的。其实游戏里的英文不会很影响游戏体验,等不及的小伙伴不妨先睹为快。
(PS:后附全图文攻略地址哟~)
先人已经远去,你坐上了一辆目的地不明的老式列车。耳边蒸汽轰鸣,四周景色均匀地交替,昏暗的车厢里忽然生出了一股说不清道不明的危险之感,难道那些“不存在”又盯上了你?打开面前的日记,一页页翻查,不安、熟悉的“Null(空、虚无)”记号一一浮现。紧接着列车驶过隧道,一个人影突然出现在你的面前,他留下一个奇怪的机关盒和一把钥匙便消失。
熟悉的符号
&一个奇怪的机关盒和一把钥匙
有钥匙,有盒子,最直接的反应肯定是拿钥匙开盒子,但盒子全身上下没有所谓的钥匙孔,这该怎么办?如果你已习惯《The Room》的世界,大概就会知道当所有线索都断掉的时候,有一种很有用的道具可以帮助我们看到世界的另一面,那就是护目镜。护目镜是本系列作品中最重要的道具,它可以揭示场景中隐藏的信息,本作中,它更加可以带着我们穿越次元之门到达更加微观的存在。
&拼图小游戏
微观的次元之门
看完这篇文章,你的感受是?
数据统计中,请稍等!
该作者的其他文章:
着迷网为有兴趣建设WIKI的个人或团体贡献者提供免费平台、开通免费域名及服务器支持。
在您提交申请信息后,将由我们的工作人员为您审核,并在一个工作日内通知申请结果~
斗图表情包这十个有关Android 6.0秘密你可能不知道
> 这十个有关Android 6.0秘密你可能不知道
这十个有关Android 6.0秘密你可能不知道
编者按:Android 6.0正式推出,仅有部分Nexus机型支持,这让Android 6.0显得有些“高冷”,大家不妨来了解一下。
  除了宣传中的新功能,如小幅界面改进、应用程序抽屉、Google Now on Tap、电池性能优化等主要卖点, 6.0其实还拥有一些鲜为人知的小改进,大家不妨来了解一下。本文引用地址:
  1. 支持4K显示
  虽然目前搭载 6.0的手机如Nexus 6P、5X并未搭载原生4K分辨率屏幕,但实际上 6.0本身已经支持4K显示,会通过一定优化形式使4K内容更加清晰。这一功能已经作为一项API向开发人员开放,旨在优化Android 6.0的4K显示性能。相信在之后,也会有越多越多的Android 6.0手机配备原生4K分辨率屏幕。
  2. 启动验证
  Android 6.0在开机时会自动运行验证代码,检测设备和操作系统是否被篡改,这是一项新增的安全功能。
  3. 直接分享
  谷歌在Android 6.0中引入了一个新的直接分享功能,能够快速分享第三方应用程序中的内容,开发人员可充分利用它实现更便捷的应用体验。
  4. 支持蓝牙手写笔
  Android 6.0添加了蓝牙手写笔的支持,可实现较为精准的定位,同时如果手写笔拥有特殊的按钮,系统中的API会监测按键并执行功能操作。
  5. 更智能的文本选择
  Android 6.0对文本选择也进行了优化,在选择文本时可直接弹出操作框,实现撤销等功能。如果设备上安装了谷歌翻译,选择的文本将直接翻译成译文。
  6. 应用程序链接
  Android 6.0添加了更智能的应用程序链接定向功能,比如你在浏览器中打开某个链接,如果设置中安装了该网站的应用,不会打开网页浏览器,而是直接跳转到应用中。
  7. 支持WIFI热点2.0
  WIFI热点2,0功能能够让Android 6.0设备无缝漫游在WIFI网络中,可省去不必要的验证环节,或是在WIFI和蜂窝网络中智能切换。
  8. 蓝牙SAP
  Android 6.0中加入了针对车载电话的蓝牙SAP功能,可以让车载电话直接使用手机SIM卡进行通话。当然,手机本身必须通过蓝牙与汽车连接。
  9. 外置存储融入系统存储中
  在Android 6.0中,外置SD卡可以在格式化时选择作为常规移动存储或是加密成系统内部存储的一部分,更好地融入到系统中。不过,这枚SD卡此后只能在这部手机上工作。
  10. 支持
  Android 6.0现在已经提供了对音频的全面支持,可连接USB或蓝牙设备,创作、回放MIDI音频。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一更新 Android 6.0 后,值得养成的 4 个新使用习惯 | 领客专栏 · 電腦玩物
我一年前更换的 Galaxy S6 手机,最近也终于升级到了 Android 6.0 系统,虽然因为是品牌手机,所以并非所有功能都是 Google 原汁原味,但一些 Android 6.0 的重要改进终于还是有体验到了。
跟许多升级 Android 6.0 的用户明显感受到的进步差不多。升级之后,我也确实发现手机的电量更持久了(严格来说应该是待机的电量更持久),手机的性能更顺畅,具体来说像是 app 间的切换,或是指纹辨识的速度都有显著提高。
不过电脑玩物是谈论数位工作方法的博客,所以要讨论 Android 6.0 的更新心得,我一样想回归到这个问题: 「 Android 6.0 可以带来哪些使用习惯的改变?」
我整理了四点跟大家分享。
1. 随时无缝开启的真正 「即时翻译」
首先一个我期待已久的重要小功能,就是在 Android 6.0 中可以实现真正的 「即时翻译」,也就是圈选文字后不用跳出app ,就能直接查看翻译结果卡片。
要做到也很简单,只要手机内有安装 「
接下来我可以在任何app 中圈选一段文字,会即时弹出一个辅助功能列,选择其中的 「翻译」选项,就会显示翻译卡片。
其实类似的功能还有结合
的即时搜索卡片,可惜目前即时搜索卡片这部分还只支持英文版的系统,但有即时翻译可以用就很不错啦!
2. 交给 Android 自动管理电量、性能就好
在前一阵子的文章中:,我再一次分享了我的观念与使用习惯是:让 Android 自动管理性能其实就够了。
在 Android 6.0 中,这样的观念可以被更好的验证。
在新版中加入了所谓的 Doze 功能,这个功能 「用户不需要启动、不需要设定、不需要管他」,他直接嵌入在 Android 中,自动帮手机延长 30% 的待机时间。
它的原理是当 Android 手机待机时(荧幕关闭、不使用),就减少背景程式运作与上网的次数,他不是完全禁止合理的 app 去做云端同步,只是在不使用时减少资源消耗。
而且他还是会保持重要通知的运作,你还是会收到即时的邮件或即时通通知。
也就是可以做到: 「你不用像高手一样去做设定,你不会觉得影响正常工作,但是你的手机续航确实自动延长了。」
我自己这几天更新后的经验是,确实每天同样的使用习惯下,可以增加一到两个小时的手机使用时间。
好像也没有增加很多啊?但我的观念是正常情况下,手机就是要拿来用的,如果我一直让手机待机省电,就算可以待机两三天又有什么用?
所以 Android 6.0 的电量自动管理原则其实就是:
当我打开手机使用,那么当然用了什么 app 就耗了多少电。
当我没有打开手机时,系统自动帮我多省一点电,留给打开后使用。
我觉得这样的性能管理就很合理也够用了。
更重要的是,应该要让用户不要去担心或管理性能,让系统自己去做好就好。 Android 6.0 的 Doze 功能就是这样,我们不需要去开启或管理他(虽然还是有可以手动设定之处,但一般情况不需要特别操作),他就是自动开始运作。
3. 交给 Android 帮你管理 app 的安全与隐私
在更新到 Android 6.0 后,有一个功能对比较资深的用户来说有用:现在不需要 Root 也能手动管理单一 app 里的不同权限。
例如一个游戏 app 我安装来玩,我可以禁止这个 app 去读取我的照片,但是允许这个 app 可以上网,而这个游戏 app 都还是可以正常游玩。
以前,我们安装一个 app 时如果对他的权限要求有点迟疑,但因为只能选择要安装或不要安装,一旦安装就是允许他要求的所有权限,难免有时候会有担心。
而在 Android 6.0 中,同样的不需任何设定,预设情况下当安装一个 app 时,就只是先安装,却还没有允许他使用一些特殊的权限。等到开启这个 app 后,遇到需要某个权限的当下,才会弹出通知询问你要不要允许,而这时候我可以拒绝单一这项权限的要求,但 app 也还是能继续使用。(根据读者回馈,上面这段的功能,也会跟 app 开发的支持有关)
这其实有一点像是早期我在电脑玩物介绍过的行为侦测安全软件的概念,让用户拥有更完整的安全掌控权,并且用户可以否决、查看每个 app 到底什么时候要求执行了什么动作。
然后我们也能进入选项设定中的 「隐私与安全」,对 「应用程式权限」进行手动管理,强制取消之前对某些 app 开放的特殊权限。
当然,如果没有正确的安全观念,就算有这样的安全功能也没用(因为一样全部都会允许)。
但是当 Android 有了这样更细致的安全管理后,加上很久之前就内建的,其实我现在的观念(包含我自己的使用习惯),也就没有在手机安装额外的防毒软件。有正确的使用方法,加上 Android 内建的安全机制,或许就够了。
4. 更聪明地避免干扰,但不错过重要讯息
第四个使用习惯,则是我个人很在意的 「避免干扰」,之前我就常常在电脑玩物分享,我的使用习惯会尽可能把 app 通知都关闭,常常把手机关静音,因为我不希望即时通知干扰我正在进行的工作或生活。(参考:)
而现在 Android 6.0 升级后的 「请勿打扰」功能可以让这件事情做得更轻松一点点,我除了可以预先排定什么时候、什么时段要隔绝干扰外,还能在自订中放行一些特殊通知,例如家人的来电、闹钟等等。
不过其实我最近在尝试的是更绝对的「请勿打扰」,也就是我的手机从头到尾都关静音,无论什么通知都不会有震动或声音。这样我就能在自己决定的时间打开手机才看新消息,这似乎又能让我多一点自我掌控的时间。
所以在更新了 Android 6.0 后,我觉得有哪几个习惯获得了更好的进步呢?
我常常需要的翻译功能终于变得即时了。
更相信把电量、性能交给 Android 自己管理就好了。
在安全的管理上, Android 系统自身可能还更强大。
聪明地避免干扰,让自己成为善用手机的高效率工作者。
当然, Android 的问题或许还在于像是 Android 6.0 这么优秀的系统,但更新普及率还是很低,不过,起码当你使用最新手机,或是获得更新后,这些习惯值得好好善用。
声明:「领客专栏」所有文章均由原作者授权 AppSolution 发布/转载,任何个人/组织未经授权不得使用。本文转载自「電腦玩物」,原文链接:
有好的产品或者项目希望我们报道,猛戳这里
180文章总数
全新爱范儿 App 现已适配
Android 及 iPhone
使用微信扫码关注爱范儿微信公众号
关注爱范儿微信号,连接热爱,关注这个时代最好的产品。
想让你的手机好用到哭?关注这个号就够了。
关注玩物志微信号,就是让你乱花钱。Android6.0权限系统
权限是一个非常重要的安全问题,因为它只有在安装时会询问一次。一旦软件本安装之后,应用程序可以在用户毫不知情的情况下使用这些权限来获取所有的内容。
很多坏蛋会通过这个安全缺陷来收集用户的个人信息并使用它们来做坏事的情况就不足为奇了。
Android团队也意识到了这个问题。在经过了7年后,权限系统终于被重新设置了。从Anroid 6.0(API Level 23)开始,应用程序在安装时不会被授予任何权限,取而代之的是在运行时应用回去请求用户授予对应的权限。这样可以让用户能更好的去控制应用功能。例如,一个用户可能会同一个拍照应用使用摄像头的权限,但是不同授权它获取设备位置的权限。用户可以在任何时候通过去应用的设置页面来撤销授权。
vcDgo6w8Y29kZT5ub3JtYWw8L2NvZGU+us08Y29kZT5kYW5nZXJvdXM8L2NvZGU+OjwvcD4NCjxjb2RlPk5vcm1hbCBQZXJtaXNzaW9uczwvY29kZT6yu9Do0qrTw7un1rG908rayKijrMjnufvE47XE06bTw9Tax+W1pc7EvP7W0Mn5w/fBy05vcm1hbCBQZXJtaXNzaW9uc2CjrM+1zbO74dfUtq/K2siouMPIqM/eoaMgPGNvZGU+RGFuZ2Vyb3VzIFBlcm1pc3Npb25zPC9jb2RlPr/J0tTIw9Om08O78cih08O7p7XEy73Iy8r9vt2ho8jnufvE47XE06bTw9Tax+W1pc7EvP7W0Mnqx+vByzxjb2RlPkRhbmdlcm91cyBQZXJtaXNzaW9uczwvY29kZT6jrMTHvs2x2NDr0qrTw7unwLTK2siouPjTptPDoaMNCjxwPjxjb2RlPk5vcm1hbCBQZXJtaXNzaW9uczwvY29kZT46PGJyIC8+DQo8Y29kZT5Ob3JtYWwgUGVybWlzc2lvbjwvY29kZT7Kx7Wx08O7p7Cy17C78rj80MLTptPDyrGjrM+1zbO9q8ra0+jTptPDy/nH68fztcTIqM/eo6zT1rPGzqo8Y29kZT5QUk9URUNUSU9OX05PUk1BTDwvY29kZT6jqLCy17DKscrayKi1xNK7wOC7+bG+yKjP3qOpoaO4w8DgyKjP3ta70OjSqtTaPGNvZGU+bWFuaWZlc3Q8L2NvZGU+zsS8/tbQyfnD97y0v8mjrLCy17DKsb7NytrIqKOssrvQ6NKqw7+0zsq508PKsb340NC87LLpo6y2+MfS08O7p7K7xNzIoc/70tTJz8rayKihozwvcD4NCkFDQ0VTU19MT0NBVElPTl9FWFRSQV9DT01NQU5EUyBBQ0NFU1NfTkVUV09SS19TVEFURSBBQ0NFU1NfTk9USUZJQ0FUSU9OX1BPTElDWSBBQ0NFU1NfV0lGSV9TVEFURSBCTFVFVE9PVEggQkxVRVRPT1RIX0FETUlOIEJST0FEQ0FTVF9TVElDS1kgQ0hBTkdFX05FVFdPUktfU1RBVEUgQ0hBTkdFX1dJRklfTVVMVElDQVNUX1NUQVRFIENIQU5HRV9XSUZJX1NUQVRFIERJU0FCTEVfS0VZR1VBUkQgRVhQQU5EX1NUQVRVU19CQVIgR0VUX1BBQ0tBR0VfU0laRSBJTlNUQUxMX1NIT1JUQ1VUIElOVEVSTkVUIEtJTExfQkFDS0dST1VORF9QUk9DRVNTRVMgTU9ESUZZX0FVRElPX1NFVFRJTkdTIE5GQyBSRUFEX1NZTkNfU0VUVElOR1MgUkVBRF9TWU5DX1NUQVRTIFJFQ0VJVkVfQk9PVF9DT01QTEVURUQgUkVPUkRFUl9UQVNLUyBSRVFVRVNUX0lHTk9SRV9CQVRURVJZX09QVElNSVpBVElPTlMgUkVRVUVTVF9JTlNUQUxMX1BBQ0tBR0VTIFNFVF9BTEFSTSBTRVRfVElNRV9aT05FIFNFVF9XQUxMUEFQRVIgU0VUX1dBTExQQVBFUl9ISU5UUyBUUkFOU01JVF9JUiBVTklOU1RBTExfU0hPUlRDVVQgVVNFX0ZJTkdFUlBSSU5UIFZJQlJBVEUgV0FLRV9MT0NLIFdSSVRFX1NZTkNfU0VUVElOR1MNCjxwPs/CzbzOqjxjb2RlPkRhbmdlcm91cyBwZXJtaXNzaW9ucyBhbmQgcGVybWlzc2lvbiBncm91cHM8L2NvZGU+OjwvcD4NCjxwPjxpbWcgYWx0PQ=="image" src="/uploadfile/Collfiles/02.png" title="\" />
在所有的Android版本中,你的应用都需要在manifest文件中声明normal和dangerous权限。然而声明所影响的效果会因系统版本和你应用的target SDK lever有关:
如果设备运行的是Android 5.1或者之前的系统,或者应用的targetSdkVersion是22或者之前版本:如果你在manifest中声明了dangerous permission,用户需要在安装应用时授权这些权限。如果用户不授权这些权限,系统就不会安装该应用。(我试了下发现即使targetSdkVersion是22及以下,在6.0的手机上时,如果你安装时你不同意一些权限,也仍然可以安装的) 如果设备运行的是Android 6.0或者更高的系统,并且你应用的targetSdkVersion是23或者更高:应用必须在manifest文件中申请这些权限,而且必须要在运行时对所需要的dangerous permission申请授权。用户可以统一或者拒绝授权,并且及时用户拒绝了授权,应用在无法使用一些功能的情况下也要保证能继续运行。
也就是说新的运行时权限仅当我们设置targetSdkVersion是23及以上时才会起作用。
如果你的targtSdkVersion低于23,那将被认为该应用没有经过android 6.0的测试,当该应用被安装到了6.0的手机上时,仍然会使用之前的旧权限规则,在安装时会提示所有需要的权限(这样做是有道理的,不然对于之前开发的应用,我们都要立马去修改让它适应6.0,来不及的话就导致6.0的手机都无法使用了,显然Android开发团队不会考虑不到这种情况),当然用户可以在安装的界面不允许一些权限,那当程序使用到了这些权限时,会崩溃吗?答案是在Android 6.0及以上的手机会直接crash,但是在23之前的手机上不会crash。
所以如果你的应用没有支持运行时权限的功能,那千万不要讲targetSdkVersion设置为23,否则就麻烦了。
注意:从Android 6.0(API Level 23)开始,即使应用的targetSdkVersion是比较低的版本,但是用户仍然可以在任何时候撤销对应用的授权。所以不管应用的targetSdkVerison是什么版本,你都要测试你的应用在不能获取权限时能不能正常运行。
下面介绍下如何使用Android Support Library来检查和请求权限。Android框架在6.0开始也提供了相同的方法。然而使用support包会比较简单,因为这样你就不需要在请求方法时判断当前的系统版本。(后面说的这几个类都是android.support.v4中的)
如果应用需要使用dangerous permission,在任何时候执行需要该权限的操作时你都需要检查是否已经授权。用户可能会经常取消授权,所以即使昨天应用已经使用了摄像头,这也不能保证今天仍然有使用摄像头的权限。
为了检查是否可以使用该权限,调用ContextCompat.checkSelfPermission()。
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
如果应用有该权限,该方法将返回PackageManager.PERMISSION_GRANTED,应用可以进行相关的操作。如果应用不能使用该权限,该方法将返回PERMISSION_DENIED,这是应用将必须要向用户申请该权限。
申请使用权限
如果应用需要使用清单文件中申明的dangerous permission,它必须要向用户申请来授权。Android提供了几种申请授权的方法。使用这些方法时将会弹出一个标准的系统对话框,该对话框不能自定义。
说明为什么应用需要使用这些权限
在一些情况下,你可能需要帮助用力理解为什么需要该权限。例如,一个用户使用了一个照相的应用,用户不会奇怪为什么应用申请使用摄像头的权限,但是用户可能会不理解为什么应用需要获取位置或者联系人的权限。在请求一个权限之前,你需要该用户一个说明。一定要切记不要通过说明来压倒用户。如果你提供了太多的说明,用户可能会感觉沮丧并且会卸载它。
一个你需要提供说明的合适时机就是在用户之前已经不同意授权该权限的情况下。如果一个用户继续尝试使用需要权限的功能时,但是之前确禁止了该权限的请求,这就可能是因为用户不理解为什么该功能需要使用该权限。在这种情况下,提供一个说明是非常合适的。
为了能找到用户可能需要说明的情况,android提供了一个工具类方法ActivityCompat.shouldShowRequestPermissionRationale().。如果应用之前申请了该权限但是用户拒绝授权后该方法会返回true。(在Android 6.0之前调用的时候会直接返回false)
注意:如果用户之前拒绝了权限申请并且选择了请求权限对话框中的Don&t ask again选项,该方法就会返回false。如果设备策略禁止了该应用使用该权限,该方法也会返回false。(我测试的时候发现请求权限的对话框中并没有Don&t asdk again这一项)
申请需要的权限
如果应用没有所需的权限时,应用必须调用ActivityCompat.requestPermissions (Activity activity,
String[] permissions,
int requestCode)方法来申请对用的权限。参数传递对应所需的权限以及一个整数型的request code来标记该权限申请。 该方法是异步的:该方法会立即返回,在用户响应了请求权限的对话框之后,系统会调用对用的回调方法来通知结果,并且会传递在reqeustPermissions()方法中的request code。(在Android 6.0之前调用的时候会直接去调用onRequestPermissionsResult()的回调方法)
下面是检查是否读取联系人权限,并且在必要时申请权限的代码:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
注意:当调用requestPermissions()方法时,系统会显示一个标准的对话框。应用不能指定或者改变该对话框。如果你想提供一些信息或者说明给用户,你需要在调用requestPermissions()之前处理。
处理请求权限的的结果
如果应用申请权限,系统会显示一个对话框。当用户相应后,系统会调用应用中的onRequestPermissionsResult (int requestCode,
String[] permissions,
int[] grantResults)方法并传递用户的操作结果。在应用中必须要重写该方法来查找授权了什么权限。该回调方法会传递你在requestPermisssions()方法中传递的request code。直接在Activity或者Fragment中重写onRequestPermissionsResult()方法即可。例如,申请READ_CONTACTS的权限可能会有下面的回到方法:
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// 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.
// permission denied, boo! Disable the
// functionality that depends on this permission.
// other 'case' lines to check for other
// permissions this app might request
系统提示的对话框会描述应用所需的permission groud。它不会列出特定的权限。例如,如果你申请了READ_CONTACTS权限,系统的对话框只会说你的应用需要获取设备的联系人信息。用户只需要授权每个permission group一次。如果你应用需要申请其他任何一个在该permission group中的权限时,系统会自动授权。在申请这些授权时,系统会像用户明确通过系统对话框统一授权时一样去调用onRequestPermissionsResult()方法并且传递PERMISSION_GRANTED参数。
注意:虽然用户已经授权了同一permission group中其他的任何权限,但是应用仍然需要明确申请每个需要的权限。例外,permission group中的权限在以后可能会发生变化。
例如,假设在应用的manifest文件中同时声明了READ_CONTACTS和WRITE_CONTACTS权限。如果你申请READ_CONTACTS权限而且用户同意了该权限,如果你想继续申请WRITE_CONTACTS权限,系统不会与用户有任何交互就会直接进行授权。
如果用户拒绝了一个权限申请,你的应用进行合适的处理。例如,你的应用可能显示一个对话框来表明无法执行用户请求的需要该权限的操作。
如果系统向用户申请权限授权,用户选择了让系统以后不要再申请该权限。 在这种情况下,应用在任何时间调用reqeustPermissions()方法来再次申请权限时,系统都会直接拒绝该请求。系统会直接调用onRequestPermissionResult()回调方法并且传递PERMISSION_DENIED参数,和用户明确拒绝应用申请该权限时一样。 这就意味着在你调用requestPermissions()方法是,你无法确定是否会和用户有直接的交互操作。
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
private void insertDummyContactWrapper() {
List permissionsNeeded = new ArrayList();
final List permissionsList = new ArrayList();
if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION))
permissionsNeeded.add(&GPS&);
if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))
permissionsNeeded.add(&Read Contacts&);
if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))
permissionsNeeded.add(&Write Contacts&);
if (permissionsList.size() & 0) {
if (permissionsNeeded.size() & 0) {
// Need Rationale
String message = &You need to grant access to & + permissionsNeeded.get(0);
for (int i = 1; i & permissionsNeeded.size(); i++)
message = message + &, & + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
insertDummyContact();
private boolean addPermission(List permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
// Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission))
上面讲到的都是Activity中的使用方法,那Fragment中怎么授权呢?
如果在Fragment中使用,用v13包中的FragmentCompat.requestPermissions()和FragmentCompat.shouldShowRequestPermissionRationale()。
在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment.requestPermissions方法,
否则会回调到Activity的onRequestPermissionsResult。但是虽然你使用Fragment.requestPermissions方法,也照样回调不到Fragment.onRequestPermissionsResult中。这是Android的Bug,,Google已经在23.3.0修复了该问题,所以要尽快升级。
所以升级到23.3.0及以上就没问题了。如果不升级该怎么处理呢?就是在Activity.onRequestPermissionsResult方法中去手动调用每个Fragment的方法(当然你要判断下权限个数,不然申请一个权限的情况下会重复调用).
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
List fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
我简单的写了一个工具类:
public class PermissionUtil {
* 在调用需要权限的功能时使用该方法进行检查。
* @param activity
* @param requestCode
* @param iPermission
* @param permissions
public static void checkPermissions(Activity activity, int requestCode, IPermission iPermission, String... permissions) {
handleRequestPermissions(activity, requestCode, iPermission, permissions);
public static void checkPermissions(Fragment fragment, int requestCode, IPermission iPermission, String... permissions) {
handleRequestPermissions(fragment, requestCode, iPermission, permissions);
public static void checkPermissions(android.app.Fragment fragment, int requestCode, IPermission iPermission, String... permissions) {
handleRequestPermissions(fragment, requestCode, iPermission, permissions);
* 在Actvitiy或者Fragment中重写onRequestPermissionsResult方法后调用该方法。
* @param activity
* @param requestCode
* @param permissions
* @param grantResults
* @param iPermission
public static void onRequestPermissionsResult(Activity activity, int requestCode, String[] permissions,
int[] grantResults, IPermission iPermission) {
requestResult(activity, requestCode, permissions, grantResults, iPermission);
public static void onRequestPermissionsResult(Fragment fragment, int requestCode, String[] permissions,
int[] grantResults, IPermission iPermission) {
requestResult(fragment, requestCode, permissions, grantResults, iPermission);
public static void onRequestPermissionsResult(android.app.Fragment fragment, int requestCode, String[] permissions,
int[] grantResults, IPermission iPermission) {
requestResult(fragment, requestCode, permissions, grantResults, iPermission);
public static
void requestPermission(T t, int requestCode, String... permission) {
List permissions = new ArrayList&&();
for (String s : permission) {
permissions.add(s);
requestPermissions(t, requestCode, permissions);
* 在检查权限后自己处理权限说明的逻辑后调用该方法,直接申请权限。
* @param t
* @param requestCode
* @param permissions
public static
void requestPermission(T t, int requestCode, List permissions) {
if (permissions == null || permissions.size() == 0) {
requestPermissions(t, requestCode, permissions);
public static boolean checkSelfPermission(Context context, String permission) {
if (context == null || TextUtils.isEmpty(permission)) {
throw new IllegalArgumentException(&invalidate params: the params is null !&);
context = context.getApplicationContext();
if (android.os.Build.VERSION.SDK_INT &= android.os.Build.VERSION_CODES.M) {
int result = ContextCompat.checkSelfPermission(context, permission);
if (PackageManager.PERMISSION_DENIED == result) {
private static
void handleRequestPermissions(T t, int requestCode, IPermission iPermission, String... permissions) {
if (t == null || permissions == null || permissions.length == 0) {
throw new IllegalArgumentException(&invalidate params&);
if (android.os.Build.VERSION.SDK_INT &= android.os.Build.VERSION_CODES.M) {
Activity activity = getActivity(t);
List deniedPermissions = getDeniedPermissions(activity, permissions);
if (deniedPermissions != null && deniedPermissions.size() & 0) {
List rationalPermissions = new ArrayList&&();
for (String deniedPermission : deniedPermissions) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
deniedPermission)) {
rationalPermissions.add(deniedPermission);
boolean showRational =
if (iPermission != null) {
showRational = iPermission.showRational(requestCode);
if (rationalPermissions.size() & 0 && showRational) {
if (iPermission != null) {
iPermission.onRational(requestCode, deniedPermissions);
requestPermissions(t, requestCode, deniedPermissions);
if (iPermission != null) {
iPermission.onGranted(requestCode);
if (iPermission != null) {
iPermission.onGranted(requestCode);
private static
Activity getActivity(T t) {
Activity activity =
if (t instanceof Activity) {
activity = (Activity)
} else if (t instanceof Fragment) {
activity = ((Fragment) t).getActivity();
} else if (t instanceof android.app.Fragment) {
activity = ((android.app.Fragment) t).getActivity();
@TargetApi(Build.VERSION_CODES.M)
private static
void requestPermissions(T t, int requestCode, List deniedPermissions) {
if (deniedPermissions == null || deniedPermissions.size() == 0) {
// has denied permissions
if (t instanceof Activity) {
((Activity) t).requestPermissions(deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
} else if (t instanceof Fragment) {
((Fragment) t).requestPermissions(deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
} else if (t instanceof android.app.Fragment) {
((android.app.Fragment) t).requestPermissions(deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
private static List getDeniedPermissions(Context context, String... permissions) {
if (context == null || permissions == null || permissions.length == 0) {
List denyPermissions = new ArrayList&&();
for (String permission : permissions) {
if (!checkSelfPermission(context, permission)) {
denyPermissions.add(permission);
return denyP
private static
void requestResult(T t, int requestCode, String[] permissions,
int[] grantResults, IPermission iPermission) {
List deniedPermissions = new ArrayList&&();
for (int i = 0; i & grantResults. i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permissions[i]);
if (deniedPermissions.size() & 0) {
if (iPermission != null) {
iPermission.onDenied(requestCode);
if (iPermission != null) {
iPermission.onGranted(requestCode);
interface IPermission {
void onGranted(int requestCode);
void onDenied(int requestCode);
void onRational(int requestCode, List permissions);
* 是否需要提示用户该权限的作用,提示后需要再调用requestPermission()方法来申请。
* @return true 为提示,false为不提示
boolean showRational(int requestCode);
public class MainFragment extends Fragment implements View.OnClickListener {
private Button mReqCameraBt;
private Button mReqContactsBt;
private Button mReqMoreBt;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
findView(view);
initView();
private void findView(View view) {
mReqCameraBt = (Button) view.findViewById(R.id.bt_requestCamera);
mReqContactsBt = (Button) view.findViewById(R.id.bt_requestContacts);
mReqMoreBt = (Button) view.findViewById(R.id.bt_requestMore);
private void initView() {
mReqCameraBt.setOnClickListener(this);
mReqContactsBt.setOnClickListener(this);
mReqMoreBt.setOnClickListener(this);
public static final int REQUEST_CODE_CAMERA = 0;
public static final int REQUEST_CODE_CONTACTS = 1;
public static final int REQUEST_CODE_MORE = 2;
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionUtil.onRequestPermissionsResult(this, requestCode, permissions, grantResults, mPermission);
public void requestCamera() {
PermissionUtil.checkPermissions(this, REQUEST_CODE_CAMERA, mPermission, Manifest.permission.CAMERA);
public void requestReadContacts() {
PermissionUtil.checkPermissions(this, REQUEST_CODE_CONTACTS, mPermission, Manifest.permission.READ_CONTACTS);
public void requestMore() {
PermissionUtil.checkPermissions(this, REQUEST_CODE_MORE, mPermission, Manifest.permission.READ_CONTACTS, Manifest.permission.READ_CALENDAR, Manifest.permission.CALL_PHONE);
private void showPermissionTipDialog(final int requestCode, final List permissions) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(&I want you permissions&);
builder.setTitle(&Hello Permission&);
builder.setPositiveButton(&确认&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
PermissionUtil.requestPermission(MainFragment.this, requestCode, permissions);
builder.setNegativeButton(&取消&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
builder.create().show();
public IPermission mPermission = new IPermission() {
public void onGranted(int requestCode) {
Toast.makeText(getActivity(), &onGranted :& + requestCode, Toast.LENGTH_SHORT).show();
public void onDenied(int requestCode) {
Toast.makeText(getActivity(), &onDenied :& + requestCode, Toast.LENGTH_SHORT).show();
public void onRational(int requestCode, List permission) {
showPermissionTipDialog(requestCode, permission);
public boolean showRational(int requestCode) {
switch (requestCode) {
case REQUEST_CODE_MORE:
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.bt_requestCamera:
requestCamera();
case R.id.bt_requestContacts:
requestReadContacts();
case R.id.bt_requestMore:
requestMore();

我要回帖

更多关于 the room3安卓6.0黑屏 的文章

 

随机推荐