以前我都是用一个前台的IntentService来处理纷至沓来的各种事件。然后当 Android 11 到来时(Android R,API 30)它就被弃用了,据说更喜欢使用使用setForegroundAsync 的Worker ,所以我就这么做了。
val builder = NotificationCompat.Builder(context,...)...
setForegroundAsync(ForegroundInfo(notificationId, builder.build()))
Run Code Online (Sandbox Code Playgroud)
随着 Android 12 的到来(Android S,API 31),仅在之后的一个版本,现在setForegroundAsync被标记为已弃用,并且我被告知要使用setExpedited来代替:
* @deprecated Use {@link WorkRequest.Builder#setExpedited(OutOfQuotaPolicy)} and
* {@link ListenableWorker#getForegroundInfoAsync()} instead.
Run Code Online (Sandbox Code Playgroud)
问题是,我不确定它到底是如何工作的。之前,我们有一个通知,当用户使用前台服务时应该向用户显示该通知(至少对于“旧”Android 版本)。现在看来getForegroundInfoAsync用于它,但我认为它不会用于 Android 12 :
在 Android S 之前,WorkManager 代表您管理和运行前台服务来执行 WorkRequest,显示 ForegroundInfo 中提供的通知。要随后更新此通知,应用程序可以使用NotificationManager。
从 Android S 及更高版本开始,WorkManager 使用即时作业来管理此 WorkRequest。
关于它的另一个线索是(这里):
从 WorkManager 2.7.0 开始,您的应用程序可以调用 setExpedited() 来声明 Worker 应使用加急作业。这个新 API 在 Android 12 上运行时使用加急作业,并且该 API 使用以前版本的 Android …
我发现 Crashlytics 发生了崩溃,但我无法重现或找到其原因。该崩溃仅发生在运行 Android 12 的 Google Pixel 设备上,并且崩溃始终发生在后台。
这是来自 Crashlytics 的崩溃日志:
Fatal Exception: android.app.RemoteServiceException$CannotDeliverBroadcastException: can't deliver broadcast
at android.app.ActivityThread.throwRemoteServiceException(ActivityThread.java:1939)
at android.app.ActivityThread.access$2700(ActivityThread.java:256)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2190)
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:7870)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Run Code Online (Sandbox Code Playgroud)
我看过类似的问题(比如this和this),但 Crashlytics 显示这些用户都有足够的可用内存,并且我们的代码库中没有任何地方可以调用registerReceiver,sendBroadcast所以第二个问题中的解决方案没有任何帮助。
根据有限的日志,我很确定当用户收到推送通知时会发生崩溃,但我有一台运行 Android 12 的 Google Pixel 4a,在向自己发送通知时根本无法重现它。
我们有一个习惯FirebaseMessagingService来监听我们在清单中注册的通知,还有一些BroadcastReceiver监听地理围栏更新并WorkManager在检测到转换时利用来执行一些工作。最近唯一改变的是我们更新为使用Android 的应用程序启动库WorkManager来初始化自身,但我不确定这是否相关,因为崩溃日志没有给我任何信息,以及我们的实现是否存在问题它不会仅限于运行 Android 12 的 Pixel 设备。
有人以前见过这个吗?或者运行 Android 12 的 Pixel 设备上是否存在专门的错误?我花了几个小时深入研究这个问题,但完全不知所措。
自从 Android 在 Android 12 中发布了新的 Splash Screen API 以来,许多应用程序都存在重复的启动屏幕、缺乏自定义等问题。
现在,可以设置背景颜色和中间的图标,但是可以自定义更多吗?由于现在我们只能使用单色背景和不可调整大小的徽标图标,这看起来不太好。
我想要实现的是一个自定义的启动屏幕,带有可绘制的图像作为背景(或包含 2 个项目的图层列表 - 一个背景图像和一个居中徽标),因为它可以在 Android 12 之前使用。
有人成功地实现了这种行为吗?
有一种解决方法可以将 windowIsTranslucent 属性设置为 true 并仅显示第二个启动画面(右侧的启动画面),但它会带来糟糕的用户体验,因为应用程序似乎有几秒钟没有响应。
我正在开发一个SDK,需要从后台启动Foreground服务。因为它使用的是后台定位和蓝牙相关的作品。如果应用程序被终止,监控将在后台执行。这就是我使用前台服务的原因。有一个条件是从后台启动前台服务。
目前,我的 SDK 使用Service来处理这项工作。但Android 12上不支持从后台启动服务。
我试图从后台启动服务,下面的异常抛出。
ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false
Run Code Online (Sandbox Code Playgroud)
我如何使用WorkManager 来解决这个问题,我的所有处理都是由 Service 类完成的,如何将 Service 对象传递给Worker类并在 Worker 类中启动此作业。
实际上,我的项目是基于信标技术的。信标信号用于向用户显示不同的推荐。
在我当前的实现中,如果应用程序被用户杀死,并且还接受前台服务,则SDK将在后台运行。并检测信标并提供适当的操作。
我的实现是,如果应用程序使用前台服务“关闭”来初始化我的 SDK,那么稍后,当应用程序位于后台并尝试从后台启动前台服务时,会抛出此异常。与前台服务相关的决策由服务器端 API 持有。我定期检查服务器端值是否更改,如果值更改,则更改后的操作会反映在 SDK 中。
android android-service foregroundnotification android-workmanager android-12
问题是在 Android 12 或更高版本中通过链接打开应用程序。
\n在较低版本的 Android 上一切正常。
\n当我查看我的 \xe2\x80\x9cApp Info\xe2\x80\x9d -> \xe2\x80\x9c 默认打开\xe2\x80\x9d 屏幕时。我看到未经批准的链接。
\n当我打开受支持网址内批准的链接时,可以通过链接打开应用程序。
\n\n我已经阅读了有关在 android 文档中验证意图过滤器的内容,一切对我来说看起来都很好。
\nhttps://developer.android.com/training/app-links/verify-site-associations#add-intent-filters
\n已将 .well-known/assetlinks.json 添加到我的域\n https://my.domain.net/.well-known/assetlinks.json \n.well-known/assetlinks.json 的内容(使用https生成并检查) ://developers.google.com/digital-asset-links/tools/generator)
\n[{\n "relation": ["delegate_permission/common.handle_all_urls"],\n "target" : { "namespace": "android_app", "package_name": "my.package.name",\n "sha256_cert_fingerprints": ["SHA_256"] }\n}]\nRun Code Online (Sandbox Code Playgroud)\n三次检查我使用的 SHA_256 是否正确。
\n还测试了 .json 是否可以使用 \xe2\x80\x9cStatement List Generator 和 Tester\xe2\x80\x9d(上面提到的链接)。
\nAndroidManifest.xml 内的 Intent 过滤器
\n<intent-filter\n android:autoVerify="true"\n android:label="@string/login_to_app">\n \n <action android:name="android.intent.action.VIEW" />\n\n <category android:name="android.intent.category.DEFAULT" />\n <category android:name="android.intent.category.BROWSABLE" …Run Code Online (Sandbox Code Playgroud) 在 Android 12 上,
如果我们开启一个活动
进入手机主屏幕更换壁纸
切换回我们的 Activity,该 Activity 重新启动。
看起来它与 Material You 主题有关。
我想在我的应用程序进入前台时禁用活动的重新启动。有办法吗?
我正在定制正在实施的新启动屏幕Android 12。
我已经能够将图标更改为我想要使用的图标
"< item name="windowSplashScreenAnimatedIcon">@drawable/...</item >"
Run Code Online (Sandbox Code Playgroud)
但因为它是一个单词而不是一个适合圆形的图标,但是单词已经拉伸以适合圆形。有没有办法改变图标或图标背景的形状或大小,这样就不会发生这种情况?
所以我有一个连接到蓝牙打印机的应用程序。它很好并且可以在除以下设备之外的所有设备上运行:
关于Google开发者,android 12使用这三个权限
android.permission.BLUETOOTH_CONNECT
android.permission.BLUETOOTH_SCAN
android.permission.BLUETOOTH_ADVERTISE
Run Code Online (Sandbox Code Playgroud)
但是当我尝试连接打印机时,我收到了这个错误,这让我抓狂。
2022-03-21 09:23:49.039 29022-29206/com.xxxx.xxxxx E/BThermalPrinterPlugin: UID 10324 / PID 29022 lacks permission android.permission.BLUETOOTH
java.lang.SecurityException: UID 10324 / PID 29022 lacks permission android.permission.BLUETOOTH
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 android.bluetooth.IBluetoothSocketManager$Stub$Proxy.connectSocket(IBluetoothSocketManager.java:227)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:404)
at id.kakzaki.blue_thermal_printer.BlueThermalPrinterPlugin.lambda$connect$1$id-kakzaki-blue_thermal_printer-BlueThermalPrinterPlugin(BlueThermalPrinterPlugin.java:544)
at id.kakzaki.blue_thermal_printer.BlueThermalPrinterPlugin$$ExternalSyntheticLambda1.run(Unknown Source:6)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
Run Code Online (Sandbox Code Playgroud)
是这种 ROM/平台/设备特定的问题。android.permission.BLUETOOTH 应该在 android 11 及更低版本上使用,因为 android 12 及更高版本将其替换为 …
我正在寻找一种在用户按下通知中的某个按钮后关闭通知面板的方法。目前,我正在这样做:
sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
Run Code Online (Sandbox Code Playgroud)
但是,这种方式在 Android 12 上已被弃用,官方建议使用GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADE来自AccessibilityService.
有没有办法以某种方式做到这一点而不需要AccessibilityService?
我正在尝试将现有的自定义启动屏幕实现迁移到 Android 12。我的实现方式与提供的链接中提到的完全相同:如提供的链接中所述
当我在 SplashActivity 中编写以下语句时,它显示错误:
SplashActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SplashScreen.installSplashScreen(this);
setContentView(R.layout.activity_splash);
}
Run Code Online (Sandbox Code Playgroud)
错误:
Cannot resolve method 'installSplashScreen' in 'SplashScreen'
Run Code Online (Sandbox Code Playgroud)
为了
SplashScreen.installSplashScreen(this);
Run Code Online (Sandbox Code Playgroud)
我添加了以下依赖项:
implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
Run Code Online (Sandbox Code Playgroud) android-12 ×10
android ×9
kotlin ×2
bluetooth ×1
flutter ×1
google-pixel ×1
google-play ×1
material-you ×1