Android Q适配(2)-------定位篇

前言

本来是准备第二篇直接写AndroidQ的存储权限等方面的修改和适配的,但是可能是由于我学艺不精,在实践中发现AndroidQ表现的跟Google官方文档描述出入较大,所以目前还在摸索中,那么第二篇文章就先写AndroidQ关于定位权限的修改了。本文分为2个部分,改动解决方案和实践代码。

改动

AndroidQ新引入了后台定位权限,是危险权限需要代码动态申请

<!--允许App在后台获得位置信息-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

这个权限必须配合下面两个权限使用,单独写没有任何效果

<!--允许获得精确的GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--允许获得粗略的基站网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Google加入这个权限,意在将App是否能定位的权利分为前台和后台分别交给用户决定,减少App在后台静默定位的可能性,减少用户的个人信息的泄露。

此项改动将会针对所有版本编译的App生效,所以你无法通过修改targetSdkVersion来回避这个问题,由于老版本sdk没有对应的后台定位权限,如果不对AndroidQ进行适配,那么反而会造成无法正常运行的问题。

适配

1、权限申请

首先根据自己app的实际需求设置对应的权限,如果不是地图导航软件,运动计步软件这种需要持续进行定位的情况,其实大多数应用根本就不用申请后台定位这个权限,请工程师不要滥用权限。

首先要在AndroidManifest.xml文件中写入对应的权限。

<manifest>
    <!--允许获得精确的GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--允许获得粗略的基站网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <!--允许App在后台获得位置信息-->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
</manifest>

在申请后台定位权限以前,用户必须先同意定位权限,否则后台定位权限将会被自动拒绝,所以如果你是一条一条申请权限的逻辑的话,需要先申请定位权限。

//android.permission.ACCESS_FINE_LOCATION或android.permission.ACCESS_COARSE_LOCATION
//任选其一申请定位权限
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);

你会看到这样的申请界面

前台定位权限申请界面

在确保用户同意了此权限以后,再申请后台权限

//申请后台权限
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION},
your-permission-request-code);

你会看到后台请求的说明


后台定位权限申请界面

得到这两个权限以后,既可以像老版本一样完成完全得到定位相关的权限了

当然你可以直接申请多个权限,AndroidQ对多个相同的权限组申请会合并成一个申请,所以我们也可以这么写

//同时申请所有定位权限,顺序不分先后
ActivityCompat.requestPermissions(this, 
new String[] {Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION},
your-permission-request-code);

这样就会得到3个选项的权限请求


合并定位权限请求界面

这里需要注意的是,如果是老版本的app,点击仅在使用该应用期间允许,系统会认为你拥有全部定位权限,回调会提示得到所有权限,但是事实上你并不能后台定位,也不可以再次申请这个权限。

如果是AndroidQ适配以后,点击仅在使用该应用期间允许,系统会认为你允许了前台定位权限,但是拒绝了后台定位权限,所以这次请求回调会提示失败,有权限未通过。下次再执行这个申请时,系统会只申请后台定位权限。

到这一步适配权限就全部讲完了,那么下一步咱们就来浅谈一下具体的情景适配方法

应用场景

1、前台定位,不需要后台定位权限

2、后台定位,需要对应权限

总体来说跟以前的方法是一样的,所以这里只讨论由于后台定位权限的加入,引发的一种新的应用场景----没有后台定位权限,依然进行类后台定位。

看了上文,肯定有同学有疑问,就是如果我没有申请后台定位权限,是不是我就真的无法做到关掉界面得到定位信息呢?事实是,依然可以。或者我把这个需求换个说法,就是用户选择拒绝我的App后台定位权限,我如何来继续完成诸如导航,计步这种需要关掉界面后依然在持续定位的需求呢。答案显而易见:foregroundService(前台服务)

前台服务就算你把app放到后台了,当前没有Activity可见,系统依然可以认为你是在前台状态,所以不需要申请后台定位权限,也可以继续进行定位。具体做法改动如下

     <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        ...
    </service>

首先在AndroidManifest.xml里注册service,AndroidQ新加入了foregroundServiceType这个属性,请选择"location"

在启动前台服务之前,请确保您的应用仍可访问用户的位置信息:

boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this,
            permission.ACCESS_COARSE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED;

    if (permissionAccessCoarseLocationApproved) {
        // App有前台定位权限. 启动你的有"location"的前台服务
    } else {
       // 没有权限,发起前台定位权限申请
       ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.ACCESS_COARSE_LOCATION},
           your-permission-request-code);
    }

打开对应的Service后,进行对应的定位操作就可以了。

后台定位的场景代码这里也翻译一下贴出来给大家,

boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED;

    if (permissionAccessCoarseLocationApproved) {
       boolean backgroundLocationPermissionApproved =
               ActivityCompat.checkSelfPermission(this,
                   permission.ACCESS_BACKGROUND_LOCATION)
                   == PackageManager.PERMISSION_GRANTED;

       if (backgroundLocationPermissionApproved) {
           // App可以访问前台和后台定位权限
           // 启动后台Service或者带“location”的前台Service
       } else {
           // App只能使用前台定位,显示一个Dialog提醒用户,你的App需要后台定位权限。
           // 然后申请后台定位权限
           ActivityCompat.requestPermissions(this, new String[] {
               Manifest.permission.ACCESS_BACKGROUND_LOCATION},
               your-permission-request-code);
       }
    } else {
       // App没有任何定位权限,重新申请全部定位相关权限
       ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_BACKGROUND_LOCATION
            },
            your-permission-request-code);
    }

后记

原本是准备做一套比较全的代码发上来,可以自动根据权限,开启对应服务这么一套代码,包括AndroidQ的权限申请和Service启动逻辑。但是后来由于没有真实的设备来给我测试,我不敢说我写的东西一定工作正常,所以目前暂时决定这个系列不加入我个人封装的AndroidQ相关的代码,以后再说。第三期大概率讲一讲android.permission.READ_PHONE_STATE,相关的改动,毕竟这个比较容易一些,这期就到这里。

如果看不懂或者我写的有问题的地方,欢迎在评论中指出,大家一切探究讨论!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • 前言 本文主要针对Android O的适配,文中大部分内容将来自官网,本文只是总结提取出适配需要的注意点,关于An...
    GrayMonkey阅读 4,023评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • 很可能你的应用是与一个支持HTTPS传输数据的服务器交互,但是并没有使用TLS 1.2或更高。在这种情况下,你定义...
    Www刘阅读 2,952评论 0 5
  • 1.java数组(先声明再分配内存):在栈内存中保留数组名,用来保存指向数组实体的地址的名称,在堆内存中保留所需内...
    JHW2017阅读 269评论 0 0
  • 说点闲话 起因是因为有个朋友问我能不能处理BAM文件,我找了一下python的确有处理BAM文件的模块,在没有搞清...
    糕糕python阅读 5,429评论 1 5