appapp store 反复验证咋整

APP注册商标怎么选择类别&?
APP9353842
APP,351-34
93842APPAPP38360APP42
APP9353842
APP9353842
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。你的创业项目,如果腾讯跟进复制了,你会怎么办?本文是来自“知乎问答”整理的回答,一起来看看如何应对大公司的抄袭。@朱继玉:. 本文是写给普通用户和创业者看的,而不是给投资人看的。加个更确切的标题:创业者该如何看待腾讯的“跟进”。第一,并不是非此即彼!这世界上的东西,有些有一个就够了,有些则多存在一个,给大家多一种选择更好。比如QQ这样的通讯工具,有一个就够了,多了也没用,但是像BBS论坛,则多一个挺好,每一个氛围都会不一样的。所
以,小公司最好是选择做后者,当腾讯过来抢市场的时候,它的大举进入,会大大扩大市场空间,使得更多的人接受这个新事物。人家并不是抢了你的市场,而是帮
你扩大了市场。因此,你就可以跟着它发展,利用它快速扩张的能力,实现自己的扩张。只要你能做出自己的个性来,用户通常都会选择在使用腾讯服务的时候,也
来尝试一下你的服务。所以在用户身上下功夫,只要做出自己的特色,一定能留住大量用户的。世
界上用户只需要一个的东西很少,也所以这么多年,腾讯真正踩死了的公司没几家,反倒是很多可以利用腾讯的竞争,更好地发展自己。像论坛门户网店这些,用户
自然是喜欢多一家,多一个选择。即使像QQ这样的小工具,像操作系统这样复杂的工具(这个只是表明上用户看到的简单和复杂,实际上背后QQ未必比操作系统
简单),世界上都不会只能活一家。所以说,要求用户只能用什么,不能用什么是件多傻逼的事情!大部分人都是可以在腾讯的竞争中获益的。第二,看清竞争的本质。据我所知,过去的十年里,真正是被腾讯吃掉的有了名气的公司,也就联众一家吧。说这个的时候,一定还会有知友出来跟我提开心农场的例子。那就一起说说它们,虽然一个是企业,一个只是一款应用。联众之死,有多少原因是因为腾讯,还是要两说的。如果联众有个好的掌舵人,它应该是可以参考盛大和4399小游戏的发展过程,而不该走关门大吉的路。如果说腾讯挡了联众的路,把它逼到死胡同,那盛大和4399这两种模式怎么就活下来并不断壮大呢?农
场的事,可以换个更通俗点的说法。世界上有几家赌场,开始都只玩牌,突然有一天,你在自己的小赌场里开始玩一种新东西,叫农场或者麻将都行,突然吸引了很
多人来你这玩。这个时候,大赌场看到这个玩法很受欢迎,赌客被你抢走了不少,于是也引进到自己的场子里玩,又把大部分赌客给抢回来了。你能说人家抄袭你,
只有你的场子能玩农场或者麻将,而人家不能玩吗?一家赌场的发展,要靠的是自己的服务和环境,而无法做到靠一种别的场子都不能玩的新玩法。不
同的生意,竞争因素也各不相同。开饭馆和开赌场就大不一样,饭馆可以靠名厨师做出独一无二的美食来供顾客享用,而赌场里的玩法都一样。因此你要明白自己做
的是一个什么生意。但是,不管腾讯的赌场有多大,你也还是可以再开一家的。而如果你开的新场子,又能第一个提供农场这样大热的玩法,使得赌场一炮打响,那
该是个多么成功的开始啊!之后最该考虑的是如何提高服务质量留住赌客。之所以腾讯留住了,而其他公司做农场没有留住,那是因为腾讯提供的配套设施齐全,在
玩农场的时候,能得到更多的其他服务,而其他公司没有那么好的服务和配套。我
们如果只做一个农场,或者只把眼光局限在提供一个农场的玩法,或者再挖空心思想一个更新的玩法,那我们根本就不能算一个生意人。应该知道,不论是开始做游
戏大厅的联众,还是后来靠农场起家的开心,只要是在互联网上玩数字娱乐,不管你玩法如何新鲜,都不过是先开一个场子,或者在腾讯之外再开一个场子而已,最
后的竞争都是一样的。不要说我是什么”社交网络“新事物,太阳底下就没有新事物,一切不过是过去种种的重复而已。最后的竞争本质还是要回到谁提供的服务
好,谁的配套设施齐全,谁的环境气氛好上来。因此,弄明白你的创新是只是一种玩法,还是一种完全不同于腾讯的新生意是很重要的。第三,别把创新、模式、点子看得太高。把
自己的姿态放低点,生意就是生意!而做生意并不必然需要创新啥的。做生意只要诚信、服务好、为顾客提供价值就行了。顾客也不在乎你是创新的,还是抄袭的。
我斗地主的时候,只在乎在哪斗地主好玩,哪管它斗地主是谁想出来的。所以,创业只需要会做生意就行,而不需要会创新。这也是为啥很多初中高中毕业的人,最
后在生意场上比那些学历更高的人还要成功的原因所在,而他们起家的时候,甚至完全没有什么创新,只有模仿。因为生意并不必然要求创新,会模仿就够了。所
以,你应该明白:你做的是生意,不是创新,腾讯抄袭的是创新,而不是生意。因为腾讯早就在做生意了,它抄你的创新,不过是为了给顾客提供更好的服务,让自
己的配套设施更齐全而已,是无可厚非的。而创新之后,你要做的就是学习腾讯,学它怎么做生意,或者叫抄袭腾讯,山寨腾讯都行。它山寨你的产品,你山寨它的
生意。关于腾讯的竞争,我想说的就这三点了。不过,对一种企图避免别人来竞争的错误观点,我还想说几句。这种错误观点的做法,无非一是保持神秘,二是持续创新,以做到让别人无法模仿抄袭。游戏是游戏,生意是生意,游戏可以保持神秘,但生意不行。这世界上,你完全让别人看不懂,无法抄袭的生意,你根本就找不到客户和投资人。如果你这么认为,只能说明你自己都还没弄明白你究竟是在做什么。看
看互联网上的一切事物,有几件是别人从战略上就看不明白,然后根本就无法抄袭的?当然有一种做法,就是前期根本不赚钱,拿钱使劲烧着赚吆喝,别人不知道你
将来如何盈利,自然无法抄袭。自己人说我们不急着赚钱,外人想不明白怎么能赚钱。不赚钱的事情,根本就还不是一个生意,自然也就无从竞争了。但事实上,现
在只要圈用户的东西,不管赚不赚钱,是不是生意,都会有竞争了。太阳底下没有什么新鲜事,是别人无从下手抄袭,或者抄了”画虎不成反类犬“的,就算有也太少了。反倒是大多数的事物,都是大家越抄越改进,然后变的越漂亮越好用。对
于一个创业者来说,能创新一次就已经难能可贵了,你还想不断创新下去,这世界上有几人能有这个能力?除非是上帝,或者接近上帝的人。Jobs算是一个。而
一个普通人,一开始就想着,我靠自己的创新能力,一直持续创新下去,其最后的结果,只能是拖垮自己。因为一开始就走上歧途了。既然谈到这个,最后顺带给创
业者一句话:你做的是生意,不是创新,别搞反了。
创新只是手段,生意才是最终的目的。没有真正创过业的人,往往很难理解,不断涌现的新IDEA,是创业公司最大的敌人。还
有一种观点是“快”。看着有点像是武侠小说里,高手们在谈论剑法,天下武功,唯快不破。但是现实生活中,有谁能举一个大公司是靠快人一步成功的吗?微软在
IBM之后,google也不是第一个做搜索的,facebook在myspace之后,腾讯的QQ,也是在ICQ之后,何来快啊!反倒是,我支持相反的
做法:图大则缓。缓不是目的,缓是为了做精,慢功出细活。一个公司最后在竞争中胜出的关键,还是要靠产品精、服务好!否则即使你跑得快,后期也会被人把客
户抢走。@韩冰Bill:确实是很现实的问题,也很容易被问到。目前国内的市场环境,企业并购的市场并不十分健全,收购一个企业的难度大于复制或者挖核心团队成员。往往出现的情况是,大企业来谈合作,NDA也签了,但是实际上没有遵守,转头就复制了个一模一样的。Idea不值钱,时间和开发成本的门槛也不成立。大企业想要挤死某个小公司很容易,且有不少先例。如果你的产品和腾讯主要是QQ的目标客户群重合度较高,且他们的开发成本并不高,就确实需要认真考虑一下了。@江南刀客:我
认为还是要从分析腾讯的战略着手,假如你要做IM,跟qq一样的套路,加班加到死也不可能超越腾讯。腾讯可能会模仿你,但如果你的业务模式并非腾讯的主要
战略方向,你还是有可能在夹缝中获得成功。或者即便腾讯跟进了,如果在整个腾讯集团层面不是核心业务,那这个团队可能也不会太强,你的先发优势还是很有机
会让你在跟腾讯非主力部队的对抗上占据优势。腾
讯最核心的利益是IM,眼下最重点的是平台型的SNS,总是要圈住人。所以像米聊就撞在腾讯最敏感的区域,微信是腾讯不得不做成功的产品,马化腾一定投入
重兵和你死磕。腾讯投资开心网,与其说是投资,更像一种防御。但比如电子商务,我觉得腾讯虽然也很重视,但还没有想好要不要动用全力。至于团购,腾讯更是
一开始就没怎么看好,所以更多选择了找当地渠道合作伙伴。其次,这些也许是你可以做的重技术并保持警惕@冯明鹏:这个问题就好比十年前VC问软件企业,如果微软也做的话你怎么办。Google给的答卷就是最好的回答。1.技术上的质变始终是最重的筹码,埋头做技术,保证代码质量和程序稳定性,在初期将竞争对手远远甩在身后,创业阶段的公司在模式上做创新本身就是一件容易被抄袭的事情,技术上的创新才能让你走的更远。2.时刻保持警惕,不犯之前死在微软(腾讯)手上的企业犯过的错误(如网景被微软的系统绑定整死,Google就选择先微软一步谈下了Firefox的预装协议)。3.
找准大公司身后的盲点,大公司转型慢本身就是一个通病,比如摩托罗拉不愿放弃在模拟手机上的优势,导致数字手机来临的时候被对手钻了空子,而诺基亚也不愿
放弃他封闭的塞班平台,导致智能机时代失掉行业老大的地位,而微软就更不必说了,软件收费模式是其收入的主要来源,所以Google
Doc和其他的软件就能通过这一点蚕食它的市场。4.IT产业中某种类型产品的老大一般会占据6-7成的份额,总有你生存的空间,如果做不到老大就乖乖把你那剩余份额争取到,细分市场,垂直领域都是方法。想点不一样的,走差异化竞争路线@Kenneth:在一个强大敏捷执行能力强的对手面前,你做出再多特色,也是有可能被copy过去。所以单单特色是无法生存的。那
应该怎么办?其实答案很简单,差异化竞争。只不过,很多人其实不明白什么叫差异化竞争。还拿腾讯的微信做个例子,微信走的是熟人社交的思路,它所有的功能
都是方便熟人之间交流、沟通的——这是它的产品基调。那如果我做一个产品,专门给陌生人社交做体验优化,腾讯能抄吗?不能!为什么不能,因为基因不同,根
本无法抄进微信里面去。所以,陌陌和遇见就诞生了,并且生存的还不错。腾讯如果想依靠微信干掉陌陌,那它一定会把微信的熟人社交体验搞得乱七八糟,得不偿
失。所以,微信是搞不定陌陌的。和竞争对手产品的本质特点不相容的特色,就是差异化。选择一个垂直的领域@曾轶:不要做内容做产品,腾讯想介入的话,砸一笔钱买版权,分分钟做死你。如果是做功能创新产品,那就没有什么关系,有比较大的几率等腾讯跟进的时候,市场规模已经起来了,你自己不要作死就不会那么容易死。腾讯跟着你抄,还是你们都是在跟着国外抄,这个要分清楚。前者往往说明你方向对了,成果希望大了,后者大概是自我感觉良好,然并卵。小公司创业做垂直领域,腾讯这样的企业也很难跟进,因为用户规模太小,他们看不上。在产品变化中做决定@李江明:创
业者应该合理判断自己所处位置。我方有兵100万,敌方有兵5000万,当然腾讯在其它地方也要打仗不会拿5000万兵跟你打。那此刻就要判断它会出多少
兵来跟你打,也就是重视这个项目的程度与投入资源多少。出兵多,则避之,打差异化在细分渠道取胜。出兵少,迎头死磕让他继续做老二。变化之中作出决定,时
刻了解自己所处的境地。找风投或者卖卖卖@Allen:在美国,VC会在关键产品和模式上和创业者一起赌一把。即:投入资金,和现有的巨头掀起一场战争。虽然现有的巨头有可能就是这些VC几年前投出来的,但是硅谷的残酷和循环往复做事完全被VC们对收益率的追求所驱动。对
于他们来说,很简单,Facebook、Google也许是会在自己的产品中加入你的功能,或者做一个类似的产品,但是对于VC来说,他们不能把钱投到这
些巨头上去。也很简单,这些巨头已经不需要VC的钱,只要用自己的资本就可以进入(或者做大)这个市场。而VC的钱放在自己的手里也是很烫手的,毕竟要和
LP们交待自己的回报率。所以,这就是为什么,Instagram这样的应用出来的时候,硅谷的VC都蠢蠢欲动,给了它5亿美金的估值,想和Facebook赌一把移动端图片社交的未来。当然高智商的马克给了双倍估值果断拿下了Instagram也断了这些capitalist的念想。这些故事告诉我们的道理是,如果VC们都怕腾讯/facebook进入什么市场,还要VC干什么?这其实也是今天中国市场被BAT垄断的一个驱动因素。一个科技市场如果没有血性和赌性的VC存在,市场最后会走向寡头垄断。带来的结果是VC的回报率越来越低。@王政:一旦腾讯跟入了,赶快找风投啊!腾讯都跟入了这不就给应用打上了“值钱”的标签了嘛!这个时候不忽悠风投投个几百万你甘心么?大风起兮,才能云飞扬啊。当BAT三家里面,出现第二家要做你这个产品类似的产品的时候,就可以待价而沽了——B还是A,卖个好价钱——当然,如果你觉得能继续和腾讯斗下去,欢迎继续。@金洪运:这是天使轮融资经典问题,最好的回答是,上门劝BAT收购了你。最后,说了这么多,但是仔细想想,你的成功率真与腾讯有关?@王翌:如果你做的是IM,那么恭喜你,成功率大概0.0001%,就算成功了,也是被腾讯收购,在很早的时候。如果不是IM类,那么恭喜你,你的成功率与腾讯没什么关系,忘记腾讯可能是个正确的选择转载来源:电商头条 
 文章为作者独立观点,不代表微头条立场
的最新文章
作者:信海光互联网那些事hlw0823导读:如果说BAT纷纷加码互联网保险市场,标志着我国保险资本时代的正式华为、联想、海尔、万科,相比较起BAT,在移动互联网时代显然需要重新起航,然而这些规模巨大的“传统行业”巨舰德意志,一度落后的工业帝国德意志民族是很晚才开始搞工业化的,英、法完成工业革命时,德国还是个农业国。德国人进今天是中秋佳节,在等待举杯赏月的夜晚前,平日各种掐的互联网公司好像也安静了些。在今天这个特殊日子,大家在页面苹果对保密工作的严格要求是出了名的,它对公司日常经营事务的保密程度高得令人咂舌,实际上,直到乔布斯在发布会上3年前,优酷和土豆的“联姻”震惊了互联网圈,中国亿万网民瞠目:互联网企业家还可以这么玩儿?3年后的今天,583年前,优酷和土豆的“联姻”震惊了互联网圈,中国亿万网民瞠目:互联网企业家还可以这么玩儿?3年后的今天,58导读:2015年11月,互动百科使用第三方平台“问卷网”,发起了一项互联网员工性生活满意度调查,我们通过不同苹果对保密工作的严格要求是出了名的,它对公司日常经营事务的保密程度高得令人咂舌,实际上,直到乔布斯在发布会上这么多年接触了很多聪明人,的确通过聊天满受益的,无论他们现在是否与我合作,当初有些观点是对我们有帮助的。但是3年前,优酷和土豆的“联姻”震惊了互联网圈,中国亿万网民瞠目:互联网企业家还可以这么玩儿?3年后的今天,58今天是中秋佳节,在等待举杯赏月的夜晚前,平日各种掐的互联网公司好像也安静了些。在今天这个特殊日子,大家在页面Facebook、阿里巴巴、京东和小米背后都有同一个男人:尤里·米尔纳。他投的公司中已经出现了两家千亿美元级去年阿里巴巴上市似乎全世界都聚焦在马云身上那是我第一次意识到:【一个男人的内心,可以弥补外表所有的硬伤!】下从上市企业看看你的机会在哪里?大家好,我是downpour。今天由我来发起第一个话题:中国互联网企业的赴美上摘要随着微信的使用越来越广泛,安全问题也成为人们日常关注的一大问题,微信帐号什么情况下可能被盗?如果被盗怎么【导读】被外界视为小米直接竞争对手的华为荣耀品牌,从2014年12月宣布独立运作之后,与小米之间的市场竞争就曾几何时,各行的电商巨头的LOGO都开始集体卖萌,向着动物路线出发,大部分的互联网公司都是以动 物为设计元素打开google,设定好时间区间,搜索关键词“下一个BAT”,得到下面这组数据:可以看到,对“下一个BAT”
  YY女主播到底有多赚钱?ID名为“毒药”的四川女孩月收入保守估计5万元。而这么多年接触了很多聪明人,的确通过聊天满受益的,无论他们现在是否与我合作,当初有些观点是对我们有帮助的。但是这么多年接触了很多聪明人,的确通过聊天满受益的,无论他们现在是否与我合作,当初有些观点是对我们有帮助的。但是摘要扒了扒这一年在微信朋友圈投放广告的土豪品牌们,还真不少呢!五光十色的广告中,又有哪些能够给你留下深刻印象12月17日消息,第二届世界互联网大会昨日在浙江省乌镇开幕,各国领导人及互联网精英齐聚于此。出席此次大会的他左起:陈亮 任泉 陈龙以前企业花钱请明星当代言人,现在明星成为投资人给企业投钱,“跨界”这件事儿,明星们现在hulianwangapp互联网APP,关注PC互联网和移动互联网,报道互联网应用资讯及微信最新动态,爆料剖析行业最新新闻。力求接地气!热门文章最新文章hulianwangapp互联网APP,关注PC互联网和移动互联网,报道互联网应用资讯及微信最新动态,爆料剖析行业最新新闻。力求接地气!Android M 新的运行时权限开发者需要知道的一切 - 简书
下载简书移动应用
写了19237字,被187人关注,获得了311个喜欢
Android M 新的运行时权限开发者需要知道的一切
翻译的国外一篇文章。
android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响。惊讶的是android社区鲜有谈论这事儿,尽管这事很重要或许在不远的将来会引发很严重的问题。这是今天我写这篇博客的原因。这里有一切关于android运行时权限你需要知道的,包括如何在代码中实现。现在亡羊补牢还不晚。
新运行时权限
android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西。难怪一些坏蛋利用这个缺陷恶意收集用户数据用来做坏事了!android小组也知道这事儿。7年了!权限系统终于被重新设计了。在android6.0棉花糖,app将不会在安装的时候授予权限。取而代之的是,app不得不在运行时一个一个询问用户授予权限。
Paste_Image.png
注意权限询问对话框不会自己弹出来。开发者不得不自己调用。如果开发者要调用的一些函数需要某权限而用户又拒绝授权的话,函数将抛出异常直接导致程序崩溃。
Paste_Image.png
另外,用户也可以随时在设置里取消已经授权的权限。
Paste_Image.png
你或许已经感觉到背后生出一阵寒意。。。如果你是个android开发者,意味着要完全改变你的程序逻辑。你不能像以前那样直接调用方法了,你不得不为每个需要的地方检察权限,否则app就崩溃了!是的。我不能哄你说这是简单的事儿。尽管这对用户来说是好事,但是对开发者来说就是噩梦。我们不得不修改编码不然不论短期还是长远来看都是潜在的问题。这个新的运行时权限仅当我们设置targetSdkVersion to 23(这意味着你已经在23上测试通过了)才起作用,当然还要是M系统的手机。app在6.0之前的设备依然使用旧的权限系统。
已经发布了的app会发生什么
新运行时权限可能已经让你开始恐慌了。“hey,伙计!我三年前发布的app可咋整呢。如果他被装到android 6.0上,我的app会崩溃吗?!?”莫慌张,放轻松。android小队又不傻,肯定考虑到了这情况。如果app的targetSdkVersion 低于 23,那将被认为app没有用23新权限测试过,那将被继续使用旧有规则:用户在安装的时候不得不接受所有权限,安装后app就有了那些权限咯!
Paste_Image.png
然后app像以前一样奔跑!注意,此时用户依然可以取消已经同意的授权!用户取消授权时,android 6.0系统会警告,但这不妨碍用户取消授权。
Paste_Image.png
问题又来了,这时候你的app崩溃吗?善意的主把这事也告诉了android小组,当我们在targetSdkVersion 低于23的app调用一个需要权限的函数时,这个权限如果被用户取消授权了的话,不抛出异常。但是他将啥都不干,结果导致函数返回值是null或者0.
Paste_Image.png
别高兴的太早。尽管app不会调用这个函数时崩溃,返回值null或者0可能接下来依然导致崩溃。好消息(至少目前看来)是这类取消权限的情况比较少,我相信很少用户这么搞。如果他们这么办了,后果自负咯。但从长远看来,我相信还是会有大量用户会关闭一些权限。我们app不能再新设备完美运行这是不可接受的。怎样让他完美运行呢,你最好修改代码支持最新的权限系统,而且我建议你立刻着手搞起!代码没有成功改为支持最新运行时权限的app,不要设置targetSdkVersion 23 发布,否则你就有麻烦了。只有当你测试过了,再改为targetSdkVersion 23 。警告:现在你在android studio新建项目,targetSdkVersion 会自动设置为 23。如果你还没支持新运行时权限,我建议你首先把targetSdkVersion 降级到22
PROTECTION_NORMAL类权限
当用户安装或更新应用时,系统将授予应用所请求的属于 PROTECTION_NORMAL 的所有权限(安装时授权的一类基本权限)。这类权限包括:
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
只需要在AndroidManifest.xml中简单声明这些权限就好,安装时就授权。不需要每次使用时都检查权限,而且用户不能取消以上授权。
让你的app支持新运行时权限
是时候让我们的app支持新权限模型了,从设置compileSdkVersion and targetSdkVersion 为 23开始吧.
compileSdkVersion 23
defaultConfig {
targetSdkVersion 23
例子,我想用一下方法添加联系人。
private static final String TAG = "Contacts";
private void insertDummyContact() {
// Two operations are needed to insert a new contact.
ArrayList&ContentProviderOperation& operations = new ArrayList&ContentProviderOperation&(2);
// First, set up a new raw contact.
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null);
operations.add(op.build());
// Next, set the name for the contact.
op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
monDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.monDataKinds.StructuredName.DISPLAY_NAME,
"__DUMMY CONTACT from runtime permissions sample");
operations.add(op.build());
// Apply the operations.
ContentResolver resolver = getContentResolver();
resolver.applyBatch(ContactsContract.AUTHORITY, operations);
} catch (RemoteException e) {
Log.d(TAG, "Could not add a new contact: " + e.getMessage());
} catch (OperationApplicationException e) {
Log.d(TAG, "Could not add a new contact: " + e.getMessage());
上面代码需要WRITE_CONTACTS权限。如果不询问授权,app就崩了。下一步像以前一样在AndroidManifest.xml添加声明权限。
&uses-permission android:name="android.permission.WRITE_CONTACTS"/&
下一步,不得不再写个方法检查有没有权限。如果没有弹个对话框询问用户授权。然后你才可以下一步创建联系人。权限被分组了,如下表:
Paste_Image.png
同一组的任何一个权限被授权了,其他权限也自动被授权。例如,一旦WRITE_CONTACTS被授权了,app也有READ_CONTACTS和GET_ACCOUNTS了。源码中被用来检查和请求权限的方法分别是Activity的checkSelfPermission和requestPermissions。这些方法api23引入。
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
private void insertDummyContactWrapper() {
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
insertDummyContact();
如果已有权限,insertDummyContact()会执行。否则,requestPermissions被执行来弹出请求授权对话框,如下:
Paste_Image.png
不论用户同意还是拒绝,activity的onRequestPermissionsResult会被回调来通知结果(通过第三个参数),grantResults,如下:
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
insertDummyContact();
// Permission Denied
Toast.makeText(MainActivity.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
这就是新权限模型工作过程。代码真复杂但是只能去习惯它。。。为了让app很好兼容新权限模型,你不得不用以上类似方法处理所有需要的情况。如果你想捶墙,现在是时候了。。。
处理 “不再提醒”
如果用户拒绝某授权。下一次弹框,用户会有一个“不再提醒”的选项的来防止app以后继续请求授权。
Paste_Image.png
如果这个选项在拒绝授权前被用户勾选了。下次为这个权限请求requestPermissions时,对话框就不弹出来了,结果就是,app啥都不干。这将是很差的用户体验,用户做了操作却得不到响应。这种情况需要好好处理一下。在请求requestPermissions前,我们需要检查是否需要展示请求权限的提示通过activity的shouldShowRequestPermissionRationale,代码如下:
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
private void insertDummyContactWrapper() {
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
showMessageOKCancel("You need to allow access to Contacts",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
insertDummyContact();
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
当一个权限第一次被请求和用户标记过不再提醒的时候,我们写的对话框被展示。后一种情况,onRequestPermissionsResult 会收到PERMISSION_DENIED ,系统询问对话框不展示。
Paste_Image.png
一次请求多个权限
当然了有时候需要好多权限,可以用上面方法一次请求多个权限。不要忘了为每个权限检查“不再提醒”的设置。修改后的代码:
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
private void insertDummyContactWrapper() {
List&String& permissionsNeeded = new ArrayList&String&();
final List&String& permissionsList = new ArrayList&String&();
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&String& permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
// Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission))
如果所有权限被授权,依然回调onRequestPermissionsResult,我用hashmap让代码整洁便于阅读。
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
Map&String, Integer& perms = new HashMap&String, Integer&();
// Initial
perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED);
// Fill with results
for (int i = 0; i & permissions. i++)
perms.put(permissions[i], grantResults[i]);
// Check for ACCESS_FINE_LOCATION
if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
// All Permissions Granted
insertDummyContact();
// Permission Denied
Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
条件灵活的,你自己设置。有的情况,一个权限没有授权,就不可用;但是也有情况,能工作,但是表现的是有所限制的。对于这个我不做评价,你自己设计吧。
用兼容库使代码兼容旧版
以上代码在android 6.0以上运行没问题,但是23 api之前就不行了,因为没有那些方法。粗暴的方法是检查版本
if (Build.VERSION.SDK_INT &= 23) {
// Marshmallow+
// Pre-Marshmallow
但是太复杂,我建议用v4兼容库,已对这个做过兼容,用这个方法代替:
ContextCompat.checkSelfPermission()被授权函数返回PERMISSION_GRANTED,否则返回PERMISSION_DENIED ,在所有版本都是如此。
ActivityCompat.requestPermissions()这个方法在M之前版本调用,OnRequestPermissionsResultCallback 直接被调用,带着正确的 PERMISSION_GRANTED或者 PERMISSION_DENIED 。
ActivityCompat.shouldShowRequestPermissionRationale()在M之前版本调用,永远返回false。用v4包的这三方法,完美兼容所有版本!这个方法需要额外的参数,Context or Activity。别的就没啥特别的了。下面是代码:
private void insertDummyContactWrapper() {
int hasWriteContactsPermission = ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
Manifest.permission.WRITE_CONTACTS)) {
showMessageOKCancel("You need to allow access to Contacts",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
ActivityCompat.requestPermissions(MainActivity.this,
new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
insertDummyContact();
后两个方法,我们也可以在Fragment中使用,用v13兼容包:FragmentCompat.requestPermissions() and FragmentCompat.shouldShowRequestPermissionRationale().和activity效果一样。
第三方库简化代码
以上代码真尼玛复杂。为解决这事,有许多第三方库已经问世了,真屌真有速度。我试了很多最终找到了个满意的。他和我上面做的一样,只是简化了代码。灵活易扩展,试一下吧。如果不满足你可以找些其他的。
如果我的app还开着呢,权限被撤销了,会发生生么
权限随时可以被撤销。
Paste_Image.png
当app开着的时候被撤消了会发生什么呢?我试过了发现这时app会突然终止 terminated。app中的一切都被简单粗暴的停止了,因为terminated!对我来说这可以理解,因为系统如果允许它继续运行(没有某权限),这会召唤弗雷迪到我的噩梦里。或许更糟...
我相信你对新权限模型已经有了清晰的认识。我相信你也意识到了问题的严峻。但是你没得选择。新运行时权限已经在棉花糖中被使用了。我们没有退路。我们现在唯一能做的就是保证app适配新权限模型.欣慰的是只有少数权限需要运行时权限模型。大多数常用的权限,例如,网络访问,属于Normal Permission 在安装时自动会授权,当然你要声明,以后无需检查。因此,只有少部分代码你需要修改。两个建议:1.严肃对待新权限模型2.如果你代码没支持新权限,不要设置targetSdkVersion 23 。尤其是当你在Studio新建工程时,不要忘了修改!
说一下代码修改。这是大事,如果代码结构被设计的不够好,你需要一些很蛋疼的重构。每个app都要被修正。如上所说,我们没的选择。。。列出所有你需要请求的权限所有情形,如果A被授权,B被拒绝,会发生什么。blah,blah。祝重构顺利。把它列为你需要做的大事,从现在就开始着手做,以保证M正式发布的时候没有问题。希望本文对你有用,快乐编码!艹
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
· 83157人关注
简书程序员大本营
投稿须知:
1.本专题仅收录与程序有关的文章。
2.请在代码框里写代码,尽量保证可看性。
· 68340人关注
《知了》专题大到包罗IT业及互联网的大情小态,小到收罗便利的工具和应用,准则是“用大脑思考、用良心酿字、用简单逻辑表述、用诚意筛选”,...
· 40881人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 app验证问题忘记了 的文章

 

随机推荐