- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我将 targetSdkVersion 升级到 31 后,telephonyManager.listen 不起作用。考虑以下代码行:
telephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);
logcat 错误信息如下:
2022-02-27 13:51:36.313 6426-6426/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 6426
java.lang.RuntimeException: Unable to start service com.example.app.myPlayService@7ace64e with Intent { cmp=com.example.app/.myPlayService (has extras) }: java.lang.SecurityException: listen
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4657)
at android.app.ActivityThread.access$2000(ActivityThread.java:247)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2091)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.lang.SecurityException: listen
at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
at android.os.Parcel.createException(Parcel.java:2409)
at android.os.Parcel.readException(Parcel.java:2392)
at android.os.Parcel.readException(Parcel.java:2334)
at com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.listenWithEventList(ITelephonyRegistry.java:1036)
at android.telephony.TelephonyRegistryManager.listenFromListener(TelephonyRegistryManager.java:250)
at android.telephony.TelephonyManager.listen(TelephonyManager.java:5999)
at com.example.app.myPlayService.onStartCommand(myPlayService.java:186)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4639)
at android.app.ActivityThread.access$2000(ActivityThread.java:247)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2091)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.internal.telephony.TelephonyPermissions.enforceCarrierPrivilege(TelephonyPermissions.java:634)
at com.android.internal.telephony.TelephonyPermissions.checkReadPhoneState(TelephonyPermissions.java:149)
at com.android.internal.telephony.TelephonyPermissions.checkCallingOrSelfReadPhoneState(TelephonyPermissions.java:94)
at com.android.server.TelephonyRegistry.checkListenerPermission(TelephonyRegistry.java:3093)
at com.android.server.TelephonyRegistry.listen(TelephonyRegistry.java:1024)
我在 Android Manifiest 文件上添加了以下权限,但仍然无法正常工作。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
在低于 31 或 Android 12 之前,它运行良好。如何在 Android SDK 31 上解决这个问题?提前致谢。
最佳答案
当目标 API 31 TelephonyManager.listen给出:java.lang.SecurityException: listen
TelephonyManager.registerTelephonyCallback 也是如此, 除非 ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION被禁用。
开发人员选项/应用程序兼容性更改/选择应用程序/为 targetSdkVersion >= 31 启用
从 TelephonyManager.listen在 API 级别 31 和 TelephonyManager.registerTelephonyCallback 中已弃用在 API 级别 31 中添加,您应该编写如下代码:
更新 为 callStateListener
添加了示例和 phoneStateListener
private void registerCallStateListener() {
if (!callStateListenerRegistered) {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
telephonyManager.registerTelephonyCallback(getMainExecutor(), callStateListener);
callStateListenerRegistered = true;
}
} else {
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
callStateListenerRegistered = true;
}
}
}
@RequiresApi(api = Build.VERSION_CODES.S)
private static abstract class CallStateListener extends TelephonyCallback implements TelephonyCallback.CallStateListener {
@Override
abstract public void onCallStateChanged(int state);
}
private boolean callStateListenerRegistered = false;
private CallStateListener callStateListener = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) ?
new CallStateListener() {
@Override
public void onCallStateChanged(int state) {
// Handle call state change
}
}
: null;
private PhoneStateListener phoneStateListener = (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) ?
new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String phoneNumber) {
// Handle call state change
}
}
: null;
文档链接:
关于java - 在 targetSdkVersion 设置为 31 或 android 12 后,telephonyManager.listen 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71285519/
我刚刚将 Android SDK 更新到版本 18 并修改了我正在处理的项目以使用它而不是版本 17。事实证明我的 ListView 现在看起来有很大不同。但是,只需将 list 文件中的 targe
我们使用 Microsoft Azure Pipelines 为 ios 和 android 构建 Ionic 应用程序。不幸的是,我们在构建 Android 应用程序时遇到以下错误。 FAILURE
我是基于 API 10 (android 2.3.3) 开发 android 应用程序的新手,我想在我的应用程序中添加操作栏,但 API 10 不支持它。所以我使用 ActionBarSherlock
这个问题在这里已经有了答案: What is the difference between compileSdkVersion and targetSdkVersion? (12 个答案) 关闭 5
简单问题:在 Eclipse 中,“新建 Android 项目”命令总是尝试使用最后一个可用的 sdk。这总是一个好主意吗? 更新: 我试着解释一下。现在在 Eclipse 中,“新项目”生成一个 l
Manifest 文件中设置的 targetSdkVersion 与构建环境(例如 Eclipse)中设置的 Project 构建目标有什么区别? 我试图找到关于这两个功能的更多信息,但我找不到任何明
从 Android 11 开始,我在 Pixel 3a Xl(更新到 android11 之后)上请求权限时遇到了问题。 所以我有这个应用程序 gradle 文件: apply plugin: 'co
我正在尝试将Android支持库(appcompat)添加到空项目,该空项目仅分配用于API级别10。 因此,我使用以下选项创建Android Studio项目。 然后,在依赖项区域中添加支持库。 b
根据到 2018 年 11 月将目标 SDK 版本更新到 26 的要求,我在几个月前尝试更新我的 gradle 文件并发布了我的应用程序的新版本,在更新目标 sdk 和编译 sdk 版本之后到 26(
因此,我从 Github 克隆了这个项目,并在浏览其 build.gradle 时,发现了这个奇怪的配置,尤其是 targetSdkVersion。现在,在我详细介绍它是什么之前,让我提一下该项目有两
我们在 Google Play 上有一个应用程序,它利用了 Google Play 的多 apk 功能。第一个 apk 是针对 Lollipop 之前的设备的旧 apk,并为尚未更新智能手机的用户保留
我刚刚从 Android SDK Manager 下载了最新的 SDK 版本,并将我的应用程序的项目构建目标设置为 Google API 级别 17,如下所示 并添加到我的应用程序的 AndroidM
我已阅读 Android 文档 here还有这个类似的问题here ,但对该版本的现实生活影响有疑问。 在开发过程中,我的应用的 targetSdkVersion 为 25,我在 SDK 级别 27
我正在尝试了解在我的项目中更新 targetSdkVersion 的原因。 让我来解释一下, 当我第一次创建我的项目时,我将 targetSdkVersion 设置为 22。 现在我可以根据需要将其更
我看过documentation用于使用 Gradle 进行构建,但我仍然不确定 compileSdkVersion 和 targetSdkVersion 之间有什么区别。 它说的是: The `co
我有这个错误:未针对最新版本的 Android;兼容模式适用。考虑测试和更新此版本。有关详细信息,请参阅 android.os.Build.VERSION_CODES JavaDoc。在行:andro
我在 Lollipop 及以下发生了奇怪的崩溃。尝试从服务器下载文件时出现安全异常,但在运行 Marshmallow 及以上版本的设备中,应用程序不会崩溃。 Logcat: Caused by: ja
目前我正面临一个我无法解决的问题。由于一个错误,我必须将较低的 targetsdkVersion 设置为 25(这是本文发布时可能的最大目标版本) 它的解决方案可能需要我很多时间来解决,所以同时我想为
我在 Android 6.0 (API 23) 中面临检查权限值的问题。即使从应用程序的设置中启用或禁用权限,也始终获得 0 值。 下面是我采取的步骤。 从设备设置->应用->我的应用->权限->禁用
我想避免 Activity 在屏幕方向改变时重新启动。在旧的 sdk 版本中,它是由 configChanges="orientation" (在 list 中)完成的。在较新的版本中,添加了 scr
我是一名优秀的程序员,十分优秀!