首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android10中,当代码在Android9中工作正常后,getLastKnownLocation总是返回null

的原因可能是由于Android10对于位置权限的变更导致的。在Android10中,位置权限的获取方式发生了改变,需要使用新的权限模型来获取位置信息。

在Android9及之前的版本中,getLastKnownLocation方法可以直接获取上一次已知的位置信息,而不需要进行额外的权限请求。但是在Android10中,getLastKnownLocation方法需要获取ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限才能正常工作。

解决这个问题的方法是,在代码中添加位置权限的请求,并在运行时动态请求权限。可以使用以下步骤来解决问题:

  1. 在AndroidManifest.xml文件中添加位置权限的声明:
代码语言:txt
复制
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  1. 在代码中检查并请求位置权限:
代码语言:txt
复制
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}
  1. 处理权限请求的回调:
代码语言:txt
复制
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_LOCATION_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限已授予,可以进行位置相关操作
        } else {
            // 权限被拒绝,无法获取位置信息
        }
    }
}
  1. 在获取位置信息之前,确保已经获取到位置权限:
代码语言:txt
复制
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if (lastKnownLocation != null) {
        // 获取到位置信息
    } else {
        // 位置信息不可用
    }
} else {
    // 未获取到位置权限
}

需要注意的是,getLastKnownLocation方法返回的位置信息可能为null,因为它只返回上一次已知的位置信息。如果需要实时的位置信息,可以使用其他方法,如使用LocationListener监听位置变化。

推荐的腾讯云相关产品:腾讯位置服务(https://cloud.tencent.com/product/location)可以提供位置信息相关的服务,包括地理编码、逆地理编码、周边搜索等功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android8.0、9.0、10.0、11.0的新特性兼容适配代码修改

《Android Studio开发实战 从零基础到App上线(第2版)》书后面的附录给出了Android8和Android9的主要特性说明,附录表格如下图所示: 不过附录表格只涵盖了常见的功能代码适配...,而Android8和Android9的众多新特性还涉及到其它的代码适配,下面就补充列出Android8、Android9Android10的额外兼容处理说明: Android8.0 1、属性动画组合...首先确保代码已经添加动态申请存储权限的逻辑,然后给AndroidManifest.xml的application节点增加以下属性: android:requestLegacyExternalStorage...此时要在代码添加版本号判断,如果当前系统版本大于等于29,就不再开关WiFi,代码例子如下: if (Build.VERSION.SDK_INT >= 29) { // Android10...Android10及以下版本,该值默认为true,但从Android11开始该值默认为false。 设置代码示例如下: // 设置是否允许访问文件,如WebView访问存储卡的文件。

1.1K20
  • Android Zero day CVE-2019-2215安全漏洞

    该漏洞位于Android操作系统的内核代码,可用于帮助攻击者获得对该设备的root访问权限。...具有讽刺意味的是,该漏洞已于2017年12月Android内核版本3.18、4.14、4.4和4.9进行了修补,但发现较新版本存在漏洞。...哪些手机有漏洞 此漏洞会影响以下运行Android 8.x及更高版本的Android手机型号: 具有Android9Android10预览版的Pixel2 华为P20 小米Redmi5A 小米...“这一漏洞与NSO无关;我们的工作重点是开发旨在帮助获得许可的情报和执法机构挽救生命的产品。” CVE-2019-2215 好消息是,此次的Android的Zeroday漏洞没有过去的漏洞那么危险。...一个线程使用 epoll方式通过使用BINDER_THREAD_EXIT显式退出,该等待队列被释放,但是永远不会从相应的epoll数据结构删除。

    61420

    Essential Phone Root教程

    有专门对此机型开发的recovery,可以做很多其它的操作:比如刷入busy box、xposed等框架; 配置及预算,部门预算有限,这款机型价格便宜,但配置是晓龙835的处理器 4GB内存 128G存储,采购今后...3年内配置也是够的; Android版本选择 由于Android10.0以后无法直接获取IMEI,Android10root的手机交给其它项目做开发的时候便遇到了这个问题,无法做到我们的工具获取IMEI...的方式和app一致,所以选择了Android10.0的前一个版本:Android9 root详细教程 方式1: 参见知乎专栏 方式2: 知乎专栏的方式是刷入recovery,然后刷入MagiskFace...,确保系统是ok的; 重启至bootloader模式,查看当前激活的分区,刷入boot root的img文件到当前的激活分区,重启即可; 步骤3重启进入系统,会多出一个Magisk Face的应用,...点击发现无法使用,这个时候需要我们安装Magisk Face的apk应用,安装完,打开显示正常即表示root成功; 常用命令 1.重启到bootloader adb reboot bootloader

    70510

    Android开发笔记(一百七十四)图像解码器ImageDecoder

    开始便支持浏览这两种格式的图片,从Android10开始更允许将拍摄的照片保存为HEIF格式(同时需要硬件支持)。...ImageDecoder正是Android9推出的新型图像解码器,它不但兼容常规的JPEG和PNG图片,还适配GIF、WebP、HEIF的动图效果,可谓新老图片类型一网打尽。...当然,ImageDecoder的存在意义是为了处理新的图片格式,而不是老格式上一争高下。...它主要在如下两个方面做了增强: (1)调用带两个参数的decodeDrawable方法,此时输入第二个监听器参数,监听器可以获得图像的媒体类型,以及该图像是否为动图; (2)判断解码得到的图形对象是否为...Animatable类型,如果是的话,则调用start方法播放动画; 根据上述两个增强手段,补齐的动图播放代码如下所示: // 显示指定来源的图像 private void showImageSource

    1.6K10

    项目需求讨论 - 定位功能小结

    正文 我们按照二大块来进行分析:一块是相关权限,一块是具体获取地理信息的相关代码。(而实际开发代码代码这二块是写在一起的,单纯是为了文章分析从而分开。) ? 1.相关权限 ?...1.2 手机的定位开关 确定我们的app本身已经具有了定位权限,我们需要知道本身的手机是否已经打开了定位功能。...既然我们用了statActivityForResult来启动,当我们返回回到自己的app界面的时候,onActivityForResult需要来判断,本来因为习惯性思维,所以以为自动onActivityForResult...的返回参数resultCode可以用来判断,后来发现不管开启不开启,都是返回RESULT_CANCELED,也就是0,毕竟在那个设置界面我们并没有设定setResult(xxx);所以判断了requestCode...也可以参考相关的链接了解一下:Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null),不过貌似也没有找到百分百直接获取GPS定位获取信息的方式。

    95750

    Android 10 和Android 11的适配

    背景 最近在项目中着手做Android10和Android11 适配时候,期间遇到了不少的坑。之前有专门写过qq、微信分享的适配。但是此次针对偏业务侧适配工作的时候还是碰到了一些新的问题。...以上的场景,涉及到了这些关键点: 把图片存储到sd卡 把绝对路径path传递给qq或者微信 1.1 直接访问sd卡的根目录 通过FileOutPutStream来完成,Android10以下都没问题...但是,这里有个坑: Android10上不行,Android11上又可以!!为什么? 因为Google改回来了,让Android11支持file://格式了。。。。 (wtf?...0)); cursor.close(); } 拿到绝对路径Android11上都 glide、qq分享、第三方的图片选择框架等都可以正常访问。...答: 如果按照上面正常适配,肯定完全没得问题!

    1.4K41

    拖不得了,Android11真的来了,最全适配实践指南奉上

    但是android10的时候,Google还是为开发者考虑,留了一手。...targetSdkVersion = 29应用,设置android:requestLegacyExternalStorage="true",就可以不启动分区存储,让以前的文件读取正常使用。...应用安装到设备上,如果用户使用过程屡次针对某项特定的权限点按拒绝,此操作表示其希望“不再询问”。 ” 这个都算不上改动,只是官方的一个良好建议。建议在用户多次拒绝之后,不要再展示权限申请。...程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。系统的进程也就是使用了这个fd来标示打开的文件,有了它就能对文件做各种操作,获得文件的各种相关信息了。...但是Android 11 设备,不好意思,不能随意使用这些信息了。只有当isUserUnlocked()方法返回true的时候,才能正常访问这些数据。

    7K340266

    干货 | 携程Android 10适配踩坑指南

    (); 备注:应用已完成存储适配工作且已打开分区存储开关,如果当前应用以兼容模式运行,覆盖安装应用仍然会以兼容模式运行,卸载重新安装应用才会以分区存储模式运行 2.5 适配方案 2.5.1 方案概览...允许其他应用访问,并且应用卸载不允许删除的文件,文件需要存储共享目录,应用可以选择是否进行目录整改,将文件迁移到Android10要求的media集合目录。...ID时,会直接返回null targetSdkVersion>=29 的应用,其获取设备ID时,会直接抛出异常SecurityException 如果您的App希望Android 10以下的设备仍然获取设备...该问题有两种解决方案: 1)AndroidManifest.xmlApplication节点添加如下代码 <application android:usesCleartextTraffic="true...添加如下节点<em>代码</em>。

    3.3K77

    Android10填坑适配指南(实际经验代码)

    Android10填坑适配指南,包含实际经验代码,绝不照搬翻译文档 1.Region.Op相关异常:java.lang.IllegalArgumentException: Invalid Region.Op...Application添加如下节点代码 <application android:usesCleartextTraffic="true" 第二种解决方案:res目录新建xml目录,已建的跳过 ...xml目录新建一个xml文件network_security_config.xml,然后AndroidManifest.xmlApplication添加如下节点代码 android:networkSecurityConfig...7.剪切板兼容 Android Q只有当应用处于可交互情况(默认输入法本身就可交互)才能访问剪切板和监听剪切板变化,onResume回调也无法直接访问剪切板,这么做的好处是避免了一些应用后台疯狂监听响应剪切板的内容...因此如果还需要监听剪切板,可以使用应用生命周期回调,监听APP后台返回,延迟几毫秒访问剪切板,再保存最后一次访问得到的剪切板内容,每次都比较一下是否有变化,再进行下一步操作。

    1K21

    PSI 与ULMK --android low memory killer

    但内存回收并不总是理想的,一定条件下,为了保证系统的正常运行,会采用更加激进、直接的方式——杀进程。low memory killer(lmk)。 android 系统LMK经历了两次演进。...KLMK KLMKandroid存在了很长的时间,其基本原理是基于minfree来控制kill 相关的app的相关测试。...如代码维护,由于KLMK 是android 独有的,因此linuxupstream 并不愿意维护这部分代码,因此内核4.12开始,kernel KLMK驱动程序。...PSI+ULMK Android10以及以后的版本,android变采用基于PSI 的ULMK PSI 是Facebook搞的一套东西并在2018 年开源。PSI提供了一种评估系统资源压力的方法。...&psi_memory_fops); proc_create("pressure/cpu", 0, NULL,&psi_cpu_fops); psi_init 函数初始化统计管理结构和更新任务的周期

    2.8K20

    安卓MVP框架的简介与搭建

    MVP是由MVP模式进化而来的,MVP改进了MVC的控制器过于臃肿的问题。 与MVC一样,MVP将应用程序的数据处理、数据显示和逻辑控制分开,用一种业务逻辑、数据显示和界面相分离的方法组织代码。...二、MVP与MVC的比较(以Android开发为例) MVP模式是MVC模式Android上的一种变体,要介绍MVP就得先介绍MVC。MVC模式,Activity应该是属于View这一层。...MVP作为一个新的模式,与MVC有一个重大的区别:MVPView并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部;而在MVCView...MVP解决了MVC问题: MVP,Presenter完全把View与Model进行分离,主要的程序逻辑Presenter实现。...这个特性非常有用,因为视图的变化总是比模型的变化要频繁。 4、把程序逻辑放在Presenter,我们就可以脱离用户接口来测试这些逻辑了。

    1.6K10

    安卓开发过程的RatingBar、Handler以及GPS大型项目中的使用【Android】

    RatingBar 点击评分栏,通过Toast显示当前分数 单击按钮获取当前分数并将其显示TextView上 <RatingBar android:id="@+id/rb_normal...关键是<em>在</em>加载页面时使用onload()加载相应的js脚本。js脚本<em>中</em>定义的一个函数是取出传递的对象,获取其中的数据,并通过for循环以单位行的形式打印出来! 有图片和事实。...<em>当</em>系统创建UI线程时,它将初始化Looper对象并创建与其关联的MessageQueue; 处理程序:用于发送和处理信息。...如果希望处理程序<em>正常</em><em>工作</em>,则当前线程<em>中</em>必须有Looper对象 Message:处理程序接收并处理的消息对象 MessageQueue:消息队列。先进先出管理邮件。...毕竟,我们的设备不能<em>总是</em>水平的。Android<em>返回</em>的方向值是一个长度为3的flaot数组,包括三个方向的值!

    1.8K10

    Android 获取进程名函数,如何优化到极致?

    一、获取进程名的常规方法,通过ActivityManager 多进程的APP,常常需要知道当前进程是主进程还是后台进程?还是什么进程。...如下代码,是我们常见的一个用法,进程启动时,根据进程名判断当前进程是哪个进程: public class MyApp extends Application { private static final...最恐怖的是 ActivityManager.getRunningAppProcesses() 有可能调用失败,返回null,也可能 AIDL 调用失败。...我们开头描述的使用场景,出现进程名获取失败的情况,将会是非常恐怖。 一旦导致进程的某些组件没有初始化,整个进程大概率是要gg了。...Application.getProcessName()方法直接返回当前进程名。这不就是我们想要的API吗! 但是这个方法只有android9【也就是aip28】之后的系统才能调用。

    4.8K31
    领券