老电影青春之歌歌wifi密码多少

android6.0 增加的权限控制还是没办法禁止软件开机启动吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
android6.0 增加的权限控制还是没办法禁止软件开机启动吗?
21:44:29 +08:00用 Android 发布 · 17500 次点击
在没有刷机 root 的情况下。
ota 升级完,发现还是没这功能,后台软件服务占用一大堆资源。无奈的很。
ps:
6.0 讯飞输入法,打字时拼音显示会一个字母一个字母闪烁
37 回复 &| &直到
23:56:12 +08:00
& & 21:53:33 +08:00
用 google 拼音就不错啊,很流畅。中英文切换停掉系统自带的 google 键盘会舒服的多,直接按小地球。
& & 21:56:07 +08:00 via Android
@ 谢谢,主要是想吐槽下开机启动问题,讯飞是刚发现的问题,顺便提了一下。下个版本应该会解决。
& & 22:07:31 +08:00
@ 系统软件其实还好,关掉些推送也可以了。主要还是老问题啊, bat 家族咱能躲就躲。再等等吧,能完美 root 就装个绿色加个 my android tools 也差不多能看住这些家伙了。
& & 00:05:58 +08:00
自启动问题,我估计 google 永远都不会管,短信、通讯录之类的已经是大发善心了,要知道, google 本身是家靠广告和用户数据谋利的公司,开发者也得靠放权才能拉拢,搞 OS ,就是在开发者和用户之间玩平衡。。。
& & 00:20:45 +08:00 via Android
@ 确实像是这样, google 这次那么多权限都能细分了,就故意留个自启不管,看来还是不要报希望了。。
& & 00:35:53 +08:00 via Android
@ 自启不光光是权限那么简单,他就是一大组钩子,在特定事件后触发,并不容易限制
不过系统应该在程序运行是允许这些事件关联,程序被任务切换界面退出后就不再触发,可惜系统没有这么做
& & 00:39:44 +08:00
google 要不是美国 android 市场份额下降,也不会加这些控制
& & 00:42:58 +08:00 via iPhone
在这样搞下去 Android 份额还会下降,其实这时候 WP 发力倒是可以一战,就是不知道微软在搞点什么鬼。
& & 00:54:21 +08:00
治理国产流氓 App 还得用国产 UI ,华为和魅族的权限管理都很严格,禁止软件开机启动只是基础功能。
& & 01:01:51 +08:00
我还吐槽苹果不让 app 跑后台服务限制太严格来着。。。
自启动我并不觉得有什么不好啊 只要没有明显影响使用时间的自启动应用就好了
并且 5.0 以上的安卓进程调度做的非常好的 我经常同时开几十个应用丝毫没有影响
& & 08:32:01 +08:00 via Android
@ cpu 和电池大部分倒是没感觉出来,但是内存很明显,刚重启的手机, 2g 一下子可用就剩四五百兆。
& & 09:02:32 +08:00
Android6.0 增加的权限管理都是涉及隐私的权限吧。而且正如 @ 所说自启不单是权限那么简单,就算禁用了权限,某些毒瘤还是会有 1001 种办法实现自启。
& & 09:25:02 +08:00
@ 内存是用的,不是看的,只要不卡,你管他有多少空闲内存干吗!
不过,我的 nexus5 有时会卡,关掉后台程序会明显流畅,尤其是几个知名应用。
至于自启管理,还是 root 吧
& & 09:28:04 +08:00
@ 隐私只占少部分,基本上所有权限都列出来了。
位置信息、存储空间、日历、电话、相机、短信、身体传感器、通讯录、麦克风、其他权限(撰写即时消息、查看 google 相册、汽车信息、获取数据库信息、请求访问你的 Twitter 账号、阅读即时消息)。
不是很懂 google 底层服务,但是 root (有些没 root )后的 LBE 啥的都能作用。 google 没控制这块,肯定不是因为技术问题。
& & 09:28:16 +08:00
@ 自启没啥,关键是各种推送跟广告就来了。。
& & 09:31:06 +08:00 via Android
@ 关键是耗电啊!!!
& & 09:31:36 +08:00
@ 对对对,说到痛点了,各种关不掉的推送,有些 app ,明明设置不需要推送资讯,退出之后,又自动给你开启,无耻的很。。
淘宝现在时不时推个广告出来。还没办法禁。
& & 09:37:27 +08:00 via Android
不是我做广告,三星在这方面还是很不错的。
自带了权限管理( knox )和开机启动管理功能
当然,这是不够的,还是要绿色守护禁止程序之间的调用
& & 10:24:26 +08:00
告诉非 Android 开发一件事: RECEIVE_BOOT_COMPLETED 一直是 level 为 normal 的权限, READ_CONTACTS 的 level 为 dangerous
6.0 的对权限处理方式的改变只针对 dangerous ,在 5.1 之前,所有的权限必须在安装时给定, 6.0 之后可以随时 revoke
& & 10:25:55 +08:00
@ ?谁知道谷歌怎么想。。。。。
& & 10:36:29 +08:00
@ 这个并没有什么所谓啊 你多出来的内存不 也是拿来用的吗 只要应用框架保证使用应用的时候不出现内存换页就可以了呀
& & 10:36:56 +08:00
@ 推送 广告都是可以禁的 长按就可以了
& & 11:11:47 +08:00
@ 请问停掉 google 键盘是不是 按小地球就可以直接切换 GOOGLE 输入法的英文了?
Google 拼音输入法 切换英文真是蛋疼无比
Google 键盘是不是只能删 APK ? 我看设置里面取消的勾是灰色的
& & 12:47:27 +08:00
@ 是的,非常简洁。当前输入法要预设为谷歌拼音。
系统默认应用停用即可。
& & 12:53:20 +08:00
@ 推送不可以在通知栏里直接屏蔽吗?
& & 14:16:34 +08:00
看到了,把不需要推送信息的 app 全部阻止通知了。
淘宝和支付宝的暂时保留。比如订单物流信息、转账通知等。
不过有个疑问,阻止通知,是不是后台仍然有交互,只是不显示出来而以?
& & 16:36:31 +08:00
& & 16:37:21 +08:00
@ 但是我的经验是 安卓上所有应用后台跑的流量加起来都没有 iOS 上苹果自己服务偷跑的流量多
& & 16:39:13 +08:00
SD Maid -& 应用控制 -& 切换自动开始条件
把所有 Receiver 都关掉,流氓再也无法自动唤醒了
& & 16:41:37 +08:00
对于国内的流氓就是需要时再安装。
把公司内部的沟通尽量转移到 Mail/国外 IM/自建 IM
& & 18:20:40 +08:00 via Android
@ 哪个手机上的功能?
& & 00:58:18 +08:00
@ 没用的,生态的建设不是一时半会的事情,而且最近 WP 的份额已经涨了
& & 01:23:21 +08:00
@ 果断卸载流氓 app
& & 12:44:32 +08:00
@ SD Maid 是一个 app
& & 06:31:44 +08:00 via Android
@ 然而我刚试了,关闭 Qzone 和 QQ 音乐的自动开始,还是被 QQ 唤醒了…
& & 23:49:17 +08:00
@ Baidu 系如果流氓得无法控制, Google 应该还是会有点意识到(这种流氓已经有点威胁平台健康了)。。。我现在被逼得:如果流氓 Push 再不加以控制, iOS10 再进一步开放,虽然再喜欢 android ,估计我也要叛变了。。。
& & 23:56:12 +08:00
有时候想想,在国内这乱象丛生的环境下,为了商业利益,这些厂商真的不会考虑用户、节操之类。把自己换在那个位置上看看,装上这样的 100 个国产 APP ,手机会变成什么样子——可他们终究不会觉得自己做错什么
& · & 2277 人在线 & 最高记录 2607 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.7.5 · 60ms · UTC 09:16 · PVG 17:16 · LAX 02:16 · JFK 05:16? Do have faith in what you're doing.Android(24)
部分1:出自://-s-Runtime-Permission/
android M 的名字官方刚发布不久,最终正式版即将来临!
android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响。惊讶的是android社区鲜有谈论这事儿,尽管这事很重要或许在不远的将来会引发很严重的问题。
这是今天我写这篇博客的原因。这里有一切关于android运行时权限你需要知道的,包括如何在代码中实现。现在亡羊补牢还不晚。
android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西。
难怪一些坏蛋利用这个缺陷恶意收集用户数据用来做坏事了!
android小组也知道这事儿。7年了!权限系统终于被重新设计了。在android6.0棉花糖,app将不会在安装的时候授予权限。取而代之的是,app不得不在运行时一个一个询问用户授予权限。
注意权限询问对话框不会自己弹出来。开发者不得不自己调用。如果开发者要调用的一些函数需要某权限而用户又拒绝授权的话,函数将抛出异常直接导致程序崩溃。
另外,用户也可以随时在设置里取消已经授权的权限。
你或许已经感觉到背后生出一阵寒意。。。如果你是个android开发者,意味着要完全改变你的程序逻辑。你不能像以前那样直接调用方法了,你不得不为每个需要的地方检察权限,否则app就崩溃了!
是的。我不能哄你说这是简单的事儿。尽管这对用户来说是好事,但是对开发者来说就是噩梦。我们不得不修改编码不然不论短期还是长远来看都是潜在的问题。
这个新的运行时权限仅当我们设置targetSdkVersion to 23(这意味着你已经在23上测试通过了)才起作用,当然还要是M系统的手机。app在6.0之前的设备依然使用旧的权限系统。
新运行时权限可能已经让你开始恐慌了。“hey,伙计!我三年前发布的app可咋整呢。如果他被装到android 6.0上,我的app会崩溃吗?!?”
莫慌张,放轻松。android小队又不傻,肯定考虑到了这情况。如果app的targetSdkVersion 低于 23,那将被认为app没有用23新权限测试过,那将被继续使用旧有规则:用户在安装的时候不得不接受所有权限,安装后app就有了那些权限咯!
然后app像以前一样奔跑!注意,此时用户依然可以取消已经同意的授权!用户取消授权时,android 6.0系统会警告,但这不妨碍用户取消授权。
问题又来了,这时候你的app崩溃吗?
善意的主把这事也告诉了android小组,当我们在targetSdkVersion 低于23的app调用一个需要权限的函数时,这个权限如果被用户取消授权了的话,不抛出异常。但是他将啥都不干,结果导致函数返回值是null或者0.
别高兴的太早。尽管app不会调用这个函数时崩溃,返回值null或者0可能接下来依然导致崩溃。
好消息(至少目前看来)是这类取消权限的情况比较少,我相信很少用户这么搞。如果他们这么办了,后果自负咯。
但从长远看来,我相信还是会有大量用户会关闭一些权限。我们app不能在新设备完美运行这是不可接受的。
怎样让他完美运行呢,你最好修改代码支持最新的权限系统,而且我建议你立刻着手搞起!
代码没有成功改为支持最新运行时权限的app,不要设置targetSdkVersion 23 发布,否则你就有麻烦了。只有当你测试过了,再改为targetSdkVersion 23 。
警告:现在你在android studio新建项目,targetSdkVersion 会自动设置为 23。如果你还没支持新运行时权限,我建议你首先把targetSdkVersion 降级到22
当用户安装或更新应用时,系统将授予应用所请求的属于 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支持新权限模型了,从设置compileSdkVersion&and&targetSdkVersion&为
compileSdkVersion 23
defaultConfig {
targetSdkVersion 23
例子,我想用以下方法添加联系人。
private static final String TAG = &Contacts&;
private void insertDummyContact() {
ArrayList&ContentProviderOperation& operations = new ArrayList&ContentProviderOperation&(2);
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());
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());
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&/&
下一步,不得不再写个方法检查有没有权限。如果没有弹个对话框询问用户授权。然后你才可以下一步创建联系人。
权限被分组了,如下表:
同一组的任何一个权限被授权了,其他权限也自动被授权。例如,一旦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被执行来弹出请求授权对话框,如下:
不论用户同意还是拒绝,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) {
insertDummyContact();
Toast.makeText(MainActivity.this, &WRITE_CONTACTS Denied&, Toast.LENGTH_SHORT)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
这就是新权限模型工作过程。代码真复杂但是只能去习惯它。。。为了让app很好兼容新权限模型,你不得不用以上类似方法处理所有需要的情况。
如果你想捶墙,现在是时候了。。。
如果用户拒绝某授权。下一次弹框,用户会有一个“不再提醒”的选项的来防止app以后继续请求授权。
如果这个选项在拒绝授权前被用户勾选了。下次为这个权限请求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 ,系统询问对话框不展示。
当然了有时候需要好多权限,可以用上面方法一次请求多个权限。不要忘了为每个权限检查“不再提醒”的设置。
修改后的代码:
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) {
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);
if (!shouldShowRequestPermissionRationale(permission))
return false;
return true;
如果所有权限被授权,依然回调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&();
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);
for (int i = 0; i & permissions. i++)
perms.put(permissions[i], grantResults[i]);
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) {
insertDummyContact();
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) {
但是太复杂,我建议用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()&andFragmentCompat.shouldShowRequestPermissionRationale()和activity效果一样。
以上代码真尼玛复杂。为解决这事,有许多第三方库已经问世了,真66溜真有速度。我试了很多最终找到了个满意的。
他和我上面做的一样,只是简化了代码。灵活易扩展,试一下吧。如果不满足你可以找些其他的。
权限随时可以被撤销。
当app开着的时候被撤消了会发生什么呢?我试过了发现这时app会突然终止 terminated。app中的一切都被简单粗暴的停止了,因为terminated!对我来说这可以理解,因为系统如果允许它继续运行(没有某权限),这会召唤弗雷迪到我的噩梦里。或许更糟…
我相信你对新权限模型已经有了清晰的认识。我相信你也意识到了问题的严峻。
但是你没得选择。新运行时权限已经在棉花糖中被使用了。我们没有退路。我们现在唯一能做的就是保证app适配新权限模型.
欣慰的是只有少数权限需要运行时权限模型。大多数常用的权限,例如,网络访问,属于Normal Permission 在安装时自动会授权,当然你要声明,以后无需检查。因此,只有少部分代码你需要修改。
两个建议:
1.严肃对待新权限模型
2.如果你代码没支持新权限,不要设置targetSdkVersion 23 。尤其是当你在Studio新建工程时,不要忘了修改!
说一下代码修改。这是大事,如果代码结构被设计的不够好,你需要一些很蛋疼的重构。每个app都要被修正。如上所说,我们没的选择。。。
列出所有你需要请求的权限所有情形,如果A被授权,B被拒绝,会发生什么。blah,blah。
祝重构顺利。把它列为你需要做的大事,从现在就开始着手做,以保证M正式发布的时候没有问题。
希望本文对你有用,快乐编码!
部分2:自己总结部分原创----------
举例:单个的权限申请很容易;在这里就不多说了;
下面是多个权限的申请的 案例说明:
直接代码---------------------------------------------
下面是两个权限的申请;
android:name=&android.permission.READ_PHONE_STATE&&&android:name=&android.permission.WRITE_EXTERNAL_STORAGE&&&
READ_PHONE_STATE
WRITE_EXTERNAL_STORAGE (内存读取申请一个就可以了;也就是同一组的权限申请一个;其他的权限也会自动申请添加进去)
//LS:多个 权限 管理 -------
int GetCode_Permission=100;
void checkPermission() {
final List&String& permissionsList = new ArrayList&&();
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.M) {
if ((checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED))
permissionsList.add(Manifest.permission.READ_PHONE_STATE);
if ((checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED))
permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionsList.size() != 0) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
GetCode_Permission);
//已经不是第一次,已经有权限
Log.e(&/已经不是第一次,已经有权限&,&permissionsList.size()==0&);
private int count=0;
@TargetApi(Build.VERSION_CODES.M)
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
count++;
Log.e(&test&,&onRequestPermissionsResult:&+count);
if (requestCode==GetCode_Permission){
if (grantResults.length&0 && (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) && (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
Toast.makeText(this, &成功&, Toast.LENGTH_SHORT).show();
Toast.makeText(this, &请申请权限---&, Toast.LENGTH_SHORT).show();
多个权限申请:
//TJ:添加定位权限-读写权限-读取电话状态权限
private final int SDK_PERMISSION_REQUEST = 127;
private String permissionI
@TargetApi(23)
private void getPersimmions() {
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.M) {
ArrayList&String& permissions = new ArrayList&String&();
* 定位权限为必须权限,用户如果禁止,则每次进入都会申请
// 定位精确位置
if(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
if(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
* 读写权限和电话状态权限非必要权限(建议授予)只会申请一次,用户同意或者禁止,只会弹一次
// 读写权限
if (addPermission(permissions, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissionInfo += &Manifest.permission.WRITE_EXTERNAL_STORAGE Deny \n&;
// 读取电话状态权限
if (addPermission(permissions, Manifest.permission.READ_PHONE_STATE)) {
permissionInfo += &Manifest.permission.READ_PHONE_STATE Deny \n&;
if (permissions.size() & 0) {
requestPermissions(permissions.toArray(new String[permissions.size()]), SDK_PERMISSION_REQUEST);
@TargetApi(23)
private boolean addPermission(ArrayList&String& permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { // 如果应用没有获得对应权限,则添加到列表中,准备批量申请
if (shouldShowRequestPermissionRationale(permission)){
permissionsList.add(permission);
@TargetApi(23)
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// TODO Auto-generated method stub
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
然后直接在项目需要申请权限或者项目的启动页面添加调用方法:
getPersimmions();
OK; &直接在代码中添加测试使用 &就可以了;
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12988次
排名:千里之外
原创:52篇
(11)(4)(1)(1)(12)(2)(6)(10)(1)(1)(8)

我要回帖

更多关于 青春之歌电视剧 的文章

 

随机推荐