新浦京81707con > 软件下载 > 0运行权限解决方案,行为变更指南

原标题:0运行权限解决方案,行为变更指南

浏览次数:132 时间:2020-02-15

Android O 除了提供许多新特征和功力外,还对系统和 API 行为做出了种种变动。本文入眼介绍您应该精晓并在支付应用时加以思忖的一些首要改动。

针对Android 6.0给出了大器晚成套施工方案,Github地址

别的对Android 6.0需求浓厚摸底的,能够看那篇文章Android 6.0运营权限深入深入分析(高级篇)

有三种差别的措施倡议权限,推荐应用第生机勃勃种方法

援救以下类中开展的伸手权限操作

其间许多改变会影响全体应用,而无论是接受针没错是何种版本的 Android。然而,有几项改成仅影响针对 Android O 的利用。为精通起见,本页面分为八个部分:针对具有 API 级其他选用和指向 Android O 的施用。

  • android.app.Activity

  • android.app.Fragment

  • android.support.v4.app.Fragment

图片 1

编写翻译时必要选取 targetSdkVersion >= 23 的Android版本实行编写翻译,框架经过3个月的不间断维护已经很完美,将近百次校订,做足了种种测量检验,对内部存款和储蓄器也开展了优化,完全能胜任各个植花朵费要求,使用起来差非常少方便,点击下载演示德姆o

这几个表现改换适用于在 Android O 平台上运维的拥有应用,无论那么些使用是指向性哪个 API 等级创设。全数开荒者都应查看那些修改,并更改其使用以准确帮衬这一个退换。

图片 2

Android O 对网络连接和 HTTP 连接行为做出了以下改造:

EasyPermissions.gif

无正文的 OPTIONS 央浼具备Content-Length: 0标头。此前,这么些诉求未有Content-Length标头。

合龙步骤

在Module工程的build.gradle文件中丰富信任

dependencies {
    compile 'com.hjq:easypermissions:6.0'
}

假使导入战败,请检查在Project工程的build.gradle文件的构造

allprojects {

    repositories {
        //添加对JCenter仓库的支持
        jcenter()
        ......
    }
    ......
}

急需注意的是千钧一发权限也亟需在AndroidManifest.xml事项清单文件中注册,否则将无法符合规律申请权限

比如诉求的权限组部分未有被授予,会同期调用成功和波折的秘诀,具体可通过措施的List参数获取到被授予或被反驳回绝给与的权限组

HttpUTucsonLConnection 在包罗斜线的主机或揭橥机构名称前边附加一条斜线,使包涵空路线的网站标准化。举例,它将

率先种办法(回调接口)

在Activity或Fragment下央浼权限示例,可间接复制粘贴

//请求的权限组
private static final String[] requestPermission = {Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE};

//动态申请文件读写权限
public void requestFilePermissions() {

    EasyPermissions.request(this, new OnRequestCallBack() {

        @Override
        public void hasPermission(List<PermissionInfo> granted) {
            Toast.makeText(mContext, "获取SD卡读取写入权限成功", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void noPermission(List<PermissionInfo> denied, boolean quick) {
            if(quick) {
                Toast.makeText(mContext, "被永久拒绝授权,请手动授予权限", Toast.LENGTH_SHORT).show();
                //如果是被永久拒绝就跳转到应用权限系统设置页面
                PermissionUtils.gotoPermissionSettings(mContext);
            }else {
                Toast.makeText(mContext, "获取SD卡读取写入权限失败", Toast.LENGTH_SHORT).show();
            }
        }

    }, requestPermission);
}

//必须覆盖Activity或Fragment中的方法,可将此方法封装到BaseActivity或者BaseFragment中
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    //回调权限请求框架,多个权限请求只需要调用一次
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

通过 ProxySelector.setDefault 设置的自定义代理选拔器仅针对所央求的网址。因而,仅可遵照这几个值选拔代理。传递至自定义代理接纳器的网站不分包所诉求的网站的门道、查询参数或一些。

其次种形式(申明方法)

在Activity或Fragment下央浼权限示例,可一向复制粘贴

//请求的权限组
private static final String[] requestPermission = {Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE};

//动态申请文件读写权限
public void requestFilePermissions() {

    SimplePermissions.request(this, requestPermission);
}

//必须覆盖Activity或Fragment中的方法,可将此方法封装到BaseActivity或者BaseFragment中
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    //回调权限请求框架,多个权限请求只需要调用一次
    SimplePermissions.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

@HasPermission
public void openFileSucceed() {
    Toast.makeText(mContext, "获取SD卡读取写入权限成功", Toast.LENGTH_SHORT).show();
}

@NoPermission
public void openFileFail() {
    Toast.makeText(mContext, "获取SD卡读取写入权限失败", Toast.LENGTH_SHORT).show();
}

//如果需要参数可以使用这两个方法,不能和上面的两个无参方法一起使用
//@HasPermission
//public void openFileSucceed(List<PermissionInfo> granted) {
//    Toast.makeText(mContext, "获取SD卡读取写入权限成功,有"   granted.length   "个权限请求成功", Toast.LENGTH_SHORT).show();
//}
//
//@NoPermission
//public void openFileFail(List<PermissionInfo> denied, boolean quick) {
//    Toast.makeText(mContext, "获取SD卡读取写入权限失败,有"   denied.length   "个权限请求失败", Toast.LENGTH_SHORT).show();
//}

U本田CR-VI 不能够包涵空白标签。

看清权限是或不是早就拿到

//请求的权限组
String[] requestPermission = {Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE};

if (PermissionUtils.isHasPermission(mContext, requestPermission)) {
    Toast.makeText(mContext, "已经获取到SD卡读写权限,不需要再次申请了", Toast.LENGTH_SHORT).show();
    return;
}

事情未发生前,平台支撑风姿罗曼蒂克种权宜方法,即允许主机名称中包蕴空白标签,但这是对 U宝马X3I 的非法使用。此活动方法只是为着保险与旧版 libcore 包容。开垦者如若对 API 使用不当,将会看见一条 ADB 新闻:“U奥迪Q3I example..com 的主机名包涵空白标签。此格式不正确,将不被以往的 Android 版本所收受。”Android O 废除了此权宜方法;系统对格式错误的 UENCOREI 会再次回到null。

跳转到应用权限设置页面

PermissionUtils.gotoPermissionSettings(mContext);

Android O 在促成 HttpsU大切诺基LConnection 时不会实行不安全的 TLS/SSL 左券版本回降。

Activity权限基类

能够让你的Activity恐怕BaseActivity世袭PermissionActivity,那样子类Activity及涉嫌的Fragment能够不用重写onRequestPermissionsResult方法,也不要求调用权限管理类中的方法

上面是PermissionActivity的源码,仅供参谋

public abstract class PermissionActivity extends AppCompatActivity {

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults);
        SimplePermissions.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

对隧道 HTTP 连接管理实行了如下改造:

PermissionInfo类

貌似在吸收结果的不二法门,有定义该List集结,集结贮存的体系为PermissionInfo

下边是PermissionInfo的源码,此处省略get和set方法,仅供参谋

public class PermissionInfo {

    /**
     * 权限名称
     */
    private String name;

    /**
     * 是否请求成功
     */
    private boolean granted;

    /**
     * 是否被永久拒绝
     */
    private boolean permanent;

    /**
     * 是否需要自行向用户解释
     */
    private boolean explain;
}

在经过接连几日塑造隧道 HTTP 连接时,系统会在 Host 行中国科高校学放置端口号 并将此消息发送至中间服务器。以前,端口号仅出以后 CONNECT 行中

安卓8.0权限适配

在 Android 8.0 早前,假使接受在运营时乞求权限并且被予以该权限,系统会错误地将归于同生机勃勃权限组并且在清单中注册的任何权限也一齐予以应用。

对于针对 Android 8.0 的采用,此行为已被匡正。系统只会授予应用分明央求的权力。不过,生机勃勃旦客商为利用给与某些权限,则具备继续对该权限组中权限的呼吁都将被活动批准。

比如,若是有些应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。应用央浼READ_EXTERNAL_STORAGE,何况顾客赋予了该权限。若是该行使针没有错是 API 等第 24 或更低端别,系统还也许会同有时候付与W奇骏ITE_EXTERNAL_STORAGE,因为该权限也归于同风华正茂 STORAGE 权限组何况也在项目清单中登记过。假若该使用针对的是 Android 8.0,则系统那时仅会予以 READ_EXTERNAL_STORAGE;不过,若是该选择后来又哀告W卡宴ITE_EXTERNAL_STORAGE,则系统会即时予以该权限,而不会提示顾客

Android 8.0 从前的本子,同生龙活虎组的任何一个权力被授权了,组内的别的权限也自动被授权,可是Android 8.0事后的本子,须求更显眼钦点所接受的权能,并且系统只会赋予申请的权位,不会付与未有组内的其它权限,那表示,借使只报名了表面存款和储蓄空间读取权限,在低版本下(API < 26)对表面存款和储蓄空间应用写入操作是不曾难题的,然而在高版本(API >= 26)下是会并发难点的,施工方案是索要多个将读和写的权位一同报名

public final class Permission {

    /**
     * 日历
     */
    public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
    public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";

    /**
     * 摄像头
     */
    public static final String CAMERA = "android.permission.CAMERA";

    /**
     * 联系人
     */
    public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
    public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
    public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";

    /**
     * 位置
     */
    public static final String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
    public static final String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";

    /**
     * 话筒
     */
    public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";

    /**
     * 电话
     */
    public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
    public static final String CALL_PHONE = "android.permission.CALL_PHONE";
    public static final String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
    public static final String WRITE_CALL_LOG = "android.permission.WRITE_CALL_LOG";
    public static final String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
    public static final String USE_SIP = "android.permission.USE_SIP";
    public static final String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS";

    /**
     * 传感器
     */
    public static final String BODY_SENSORS = "android.permission.BODY_SENSORS";

    /**
     * 短信
     */
    public static final String SEND_SMS = "android.permission.SEND_SMS";
    public static final String RECEIVE_SMS = "android.permission.RECEIVE_SMS";
    public static final String READ_SMS = "android.permission.READ_SMS";
    public static final String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
    public static final String RECEIVE_MMS = "android.permission.RECEIVE_MMS";

    /**
     * 存储
     */
    public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
    public static final String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
}

图片 3

DangerousPermissions.png

系统不再将隧道连接诉求中的 user-agent 和 proxy-authorization 标头发送至代理服务器。

张冠李戴配置

万风流洒脱利用回调接口的主意号令权限,则不须求别的配置

若是使用表明方法的艺术号召权限,须求在proguard中增添混淆准绳

#EasyPermissions避免混淆
-keepclassmembers class ** {
    @com.hjq.permissions.HasPermission <methods>;
}
-keepclassmembers class ** {
    @com.hjq.permissions.NoPermission <methods>;
}

在确立隧道时,系统不再将隧道 HttpUHavalLConnection 中的 proxy-authorization 标头发送至代理。相反,由系统生成 proxy-authorization 标头,在代理响应起头央求发送 HTTP 407 后将其发送至此代理。

如出风流罗曼蒂克辙地,系统不再将 user-agent 标头由隧道连接诉求复制到创立隧道的代办央求。相反,库为此恳请生成 user-agent 标头。

要是以前执行的 connect 函数战败,send( java.net.DatagramPacket 卡塔尔国函数将会引发 SocketException:

如若存在内部错误,DatagramSocket.connect 会引发 pendingSocketException。对于 Android O 早先的版本,纵然 send 调用成功,后续的 recv 调用也会抓住 SocketException。为保障大器晚成致性,未来那八个调用均会掀起 SocketException。

在回降至 TCP Echo 合计早前,InetAddress.isReachable 会尝试进行 ICMP:

对此有个别屏蔽端口 7 的主机(举个例子 google.com),假如它们承当 ICMP Echo 合同,现在说不许能够访谈它们。

对此真正不能够访谈的主机,此项改成意味着调用供给两倍的光阴能力重回结果。

后天,AbstractCollection.removeAll 和AbstractCollection.retainAll 始终抓住NullPointerException;以前,当集结为空时不会抓住NullPointerException。此项改成使行为相符文书档案须要。

倘使有个别应用设置的Thread.UncaughtExceptionHandler未移交给默许的Thread.UncaughtExceptionHandler,则当现身未捕获的那三个时,系统不会终止应用。从 Android O 发轫,在那境况下系统将记录极其仓库追踪意况;在早先的阳台版本中,系统不会记录特别饭馆追踪意况。

我们建议,自定义Thread.UncaughtExceptionHandler完结始终移交给暗许管理程序管理;据守此建议的利用不受 Android O 此项改成的影响。

随着 Android 应用出以后 Chrome 操作系统和机械Computer等别的大尺寸设备上,大家看来,顾客在 Android 应用中又再度开首接纳键盘导航。在 Android O 中,我们又再一次使用键盘作为导航输入设备,进而为依赖箭头键和 Tab 键的导航营造了一种更保障况且可预测的模型。

更进一层要建议的是,大家对成分核心行为做出以下改造:

今昔,假如你未有为View对象定义任何难点状态颜色,框架会为View设置暗许的热销卓越显示颜色。此关键优质显示标记是基于操作组件核心背景的涟漪图片。

如果您不期待View对象在选择大旨时行使此暗中认可卓绝呈现标志,请在满含View的构造XML 文件中将android:defaultFocusHighlightEnabled属性设置为false,或然将false传递至采取分界面逻辑中的setDefaultFocusHighlightEnabled 。

要测量试验键盘输入对分界面成分主题有啥影响,您可以启用 Drawing > Show layout bounds开采者选项。在 Android O 中,此选项在当下全部标准的要素上展现一个 “X” Logo。

除此以外,Android O 中的全数工具栏成分自动组成键盘导航键区,客户能够进一层自在地导航步入和间隔每一种作为贰个整机的工具栏。

如需详细询问如何在你的接受中改革对键盘导航的支撑,请阅读以下链接中的补助键盘导航指南。

Android O 包括以下与安全性有关的变动:

此平台不再支持 SSLv3

Android O 将动用安全计算过滤器来过滤全数应用。允许的体系调用列表仅限于通过 bionic 公开的体系调用。别的,还提供了其他多少个后向包容的类别调用,但我们不提出利用那一个系统调用。

在与未正确贯彻 TLS 合同版本协商的服务器营造 HTTPS 连接时,HttpsUMuranoLConnection不再尝试回退到从前的 TLS 合同版本等量齐观试的回旋方法。

现今,您的应用的WebView对象将在多进度格局下运维。网页内容在独立的历程中管理,此进程与包含应用的长河相隔开分离,以巩固安全性。

你不能够再假定 APK 驻留在名称以 -1 或 -2 结尾的目录中。应用应利用 sourceDir 获取此目录,而不能够直接利用目录格式。

有关提高利用安全性的其它准绳,请参阅以下链接中的面向 Android 开采者的安全性。

Android O 为增高电瓶续航时间而引进的更动之一是,当你的施用踏入已缓存状态时,如果未有运动的零零部件,系统将消逝应用具有的具有唤醒锁。

其它,为增加设备品质,系统会节制未在前台运维的接收的少数行为。具体来说:

前日,在后台运转的选取对后台服务的拜谒受到节制。

接受不能够接收其清单注册超越八分之四隐式广播(即,并非专门针对此采用的播音)。

Android O 还对一定函数做出了以下退换:

生机勃勃旦针对 Android O 的接收尝试在不容许其成立后台服务的景况下利用startService函数,则该函数将抓住三个IllegalStateException。

新的Context.startForegroundService函数将起动四个前台服务。以往,即便接纳在后台运行,系统也允许其调用Context.startForegroundService。可是,应用必须在开立服务后的五秒内调用该服务的startForeground 函数。

如需领会详细音信,请参阅以下链接中的后台试行限定。

Android O 对平台做出了以下与隐衷性有关的转移:

当今,平台改换了标记符的管理方式:

对此在 OTA 早前设置到有个别版本 Android O(API 品级 26)的施用,除非在 OTA 后卸载仁同一视新安装,不然ANDROID_ID的值将保持不改变。要在 OTA 后在卸载时期保留值,开荒者能够利用密钥/值备份涉及旧值和新值。

对此安装在运转 Android O 的设施上的行使,ANDROID_ID的值以后将依据使用签定密钥和顾客鲜明作用域。应用签订密钥、客商和设施的每种组合都具备唯生龙活虎的ANDROID_ID值。因而,在相通设备上运行但具有差别签订密钥的应用将不会拜拜到同样的 Android ID(就算对于同样客户来讲,也是那般)。

风流倜傥旦签订协议密钥相通(并且应用未在 OTA 以前安装到某些版本的 O),ANDROID_ID的值在软件包卸载或重新安装时就不会发生变化。

尽管系统更改招致软件包签定密钥产生变化,ANDROID_ID的值也不会转换。

要依赖三个回顾的规范种类完毕利用牟取利益,请使用广告 ID。广告 ID 是 GooglePlay 服务针对广告服务提供的唯朝气蓬勃 ID,此 ID 可由顾客重新设置。

询问net.hostname系统天性再次来到的结果为空。

图片 4

本文由新浦京81707con发布于软件下载,转载请注明出处:0运行权限解决方案,行为变更指南

关键词: 新浦京81707con Android Android... 指南

上一篇:你真的会用Gson吗

下一篇:没有了