Android 12 禁止所谓的通知蹦床: https://developer.android.com/about/versions/12/behavior-changes-12#notification-trampolines
目前,我正在通过分析工具跟踪通知点击事件,但使用“trampoline”,这是一个广播接收器,它在实际通知意图打开特定活动之前发送事件。
在这里和那里阅读时,我发现该方法的替代方案(也可以避免蹦床)包括使用发送分析事件所需的信息填充 Intent extras。但在这里我看到两个问题:
这是我用来消耗额外意图的函数:
fun consumeClickEventIfAny(intent: Intent) {
intent.extras?.let { extras ->
if (extras.containsKey(EXTRA_ANALYTICS_FOR_CLICK)) {
... trigger analytics event here
extras.remove(EXTRA_ANALYTICS_FOR_CLICK)
intent.replaceExtras(extras)
}
}
}
Run Code Online (Sandbox Code Playgroud)
您是否遇到过相同或类似的问题?你是怎么解决的?任何帮助将不胜感激。谢谢你!
在搭载 Android 12 (SPB5.210812.002) 的 Pixel 4a 上,当用户授予近似位置权限时,不会从FusedLocationProviderClient. 当我将权限更改为精确位置权限时,我就可以获取位置。
我在清单中拥有粗略和精细的位置权限,并在运行时请求这两种权限。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
一旦获得任一许可,我就会请求lastKnownLocation以及位置更新。有了精确的位置许可,我很快就能获得位置,但当用户提供大致位置许可时就无法获得位置。
对于位置请求优先级,我已经尝试过LocationRequest.PRIORITY_HIGH_ACCURACY和LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY。
在 Android 9 上,一切都按预期工作,所以我猜这与Android 12 中引入的精确/近似位置权限有关。
这是我的代码的一部分:
private val fusedLocationClient by lazy {
LocationServices.getFusedLocationProviderClient(requireContext())
}
private val cts: CancellationTokenSource = CancellationTokenSource()
private val locationRequest = LocationRequest()
.setPriority(LOCATION_REQUEST_PRIORITY)
.setFastestInterval(MIN_TIME_BETWEEN_STAMPS_IN_MILLIS) // 1000
.setInterval(TIME_BETWEEN_STAMPS_IN_MILLIS) // 10000
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult?.locations?.firstOrNull()?.let {
userLocation = it
onUserLocationUpdated() …Run Code Online (Sandbox Code Playgroud) location fusedlocationproviderclient android-12 android-api-31
所以我知道Android 12有新的蓝牙权限。在“应用程序信息权限”中,它现在看起来像“附近的设备”。我有这样的逻辑:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED) {
viewModel.connectDevice(macAddressDropdown.selectedItem.toString())
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.BLUETOOTH_CONNECT),
1
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在初次启动时,这似乎工作正常,它会提示附近设备权限,正如 Google 文档中所示。之后,我进入“应用程序信息”中的“权限”,并拒绝“附近的设备”权限。当我调试这个逻辑时,它说仍然允许BLUETOOTH_CONNECT。
s = ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED
a = ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED
b = ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH) == PackageManager.PERMISSION_GRANTED
c = ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN) == PackageManager.PERMISSION_GRANTED
d = ContextCompat.checkSelfPermission(this, Manifest.permission_group.NEARBY_DEVICES) == PackageManager.PERMISSION_GRANTED
Run Code Online (Sandbox Code Playgroud)
当我调试这个时,BLUETOOTH_CONNECT 是唯一显示为 true 的,其余的都是 false。关于为什么会发生这种情况以及如何解决它有什么想法吗?可能是一个错误?谢谢
我编写了一个 xamarin 表单应用程序,它使用 Plugin.BLE NuGet 包来扫描并连接到 ble 设备。它在我的手机上完美地工作/调试,直到它(我的手机)更新到 Android 12.0 - API 31。我正在使用插件的基本香草实现:
adapter.DeviceDiscovered += (s,a) => deviceList.Add(a.Device);
await adapter.StartScanningForDevicesAsync();
Run Code Online (Sandbox Code Playgroud)
我发现 Android 12 需要不同的运行时权限([https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#declare-android11-or-lower][1]),并且我尝试适应它们在清单文件中:
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:label="Rep_001.Android" android:theme="@style/MainTheme"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#declare-android11-or-lower
Run Code Online (Sandbox Code Playgroud)
但可惜我没有运气。我认为我需要在运行时询问用户扫描和连接权限,但我不确定如何执行此操作,因为 Xamarin.Essentials 没有蓝牙权限请求。
我正在开发一个使用蓝牙的 Android 应用程序,我想使用新的 Android 12 Bluetooth_SCAN 和 CONNECT 权限来消除对位置权限的需要
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
如蓝牙文档所示
问题是,该应用程序有一项主要功能和一项可选功能。主要功能在这些权限下运行良好。
然而,可选功能使用信标扫描。当使用“neverForLocation”标志时,Android 操作系统会从扫描中过滤掉这些信标。
注意:如果您在 android:usesPermissionFlags 中包含 neverForLocation,则会从扫描结果中过滤掉一些 BLE 信标。
如果从清单权限中删除了该标志,则在扫描期间会出现信标。
但是,如果我从清单中删除此标志,那么即使不想使用此功能的用户也必须提供位置权限,否则正常的 BLEScan 不会返回任何内容。这是我想避免提供的事实,即这些新权限的全部原因是避免询问用户位置。
有没有办法在向操作系统发出实际运行时请求权限时提供此标志,而不是在清单中声明它?任何帮助或想法表示赞赏。
我刚刚开始确保我的应用程序可以在 Android 12 上运行。我注意到(我相信)所有应用程序在按下后退按钮时都会调用 onPause(),但不会调用 onDestroy()。这意味着该应用程序仍在运行。
以前,当按下后退按钮时,onDestroy() 会在 onPause() 之后调用。
对于运行有(实际上必须有)通知的后台服务的人来说,这绝对是一个问题。停止服务通常是在 onDestroy() 中完成的,当然不是在 onPause() 中完成的。由于未调用 onDestroy(),因此服务继续运行并且通知保持有效。如果您选择通知,它会再次显示[正在运行]应用程序。除非通过概述(左)按钮终止进程,否则无法停止服务并因此停止通知。
我还注意到,如果带有服务的应用程序崩溃,则通知会保持不变。这肯定不是我们所期望的行为。
您可以而且显然必须使用概览(左)软按钮终止该进程。
我可以通过实现 onBackPressed 来解决这个问题:
Run Code Online (Sandbox Code Playgroud)@Override public void onBackPressed() { // This seems to be necessary with Android 12 // Otherwise onDestroy is not called Log.d(TAG, this.getClass().getSimpleName() + ": onBackPressed"); finish(); super.onBackPressed(); }
但这似乎是一个拼凑。
对于其他应用程序来说,它们是否仍在运行可能并不重要。然而,这是意想不到的行为。
稍后添加:这显然是故意的,并且是对之前行为的改变。这篇文章中提到了这一点(感谢@ianhanniballake):
https://developer.android.com/about/versions/12/behavior-changes-all#back-press
我有几个应用程序,并且我已经验证了 Android 12 上的所有应用程序都发生了这种情况。它给那些拥有服务的应用程序带来了问题。
这个问题隐含的问题是如何处理它。我个人正在为这些实现 onBackPressed 并保留其他的。
我已将 Android SDK 项目 30 升级到 31,并且还在清单中使用了权限: 。这是针对 SDK 28 及更高版本所必需的。在 Android 12 中,我在 100% 后台应用程序上经常遇到以下崩溃。另外,在 Android SDK 版本 30 以下,它的工作绝对正常。提前致谢 !
Non-fatal Exception: java.lang.RuntimeException: Unable to create service com.UploadService: android.app.ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false: service com.UploadService
at android.app.ActivityThread.handleCreateService(ActivityThread.java:4949)
at android.app.ActivityThread.access$1900(ActivityThread.java:310)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2296)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8633)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
Run Code Online (Sandbox Code Playgroud)
我在代码中使用了 startForegroundService 的工作管理器,如何在 Android12 及更高版本中使用 startForeground 的工作管理器来限制此崩溃 提前致谢
我正在尝试使用 BLE 连接到设备,但在 Android 12 上遇到错误。我尝试了很多不同的方法,但找不到任何解决方案。如何请求蓝牙权限?
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.bluetooth_le"
android:required="true" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
和权限请求代码
private static final String[] BLE_PERMISSIONS = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
};
private static final String[] ANDROID_12_BLE_PERMISSIONS = new String[]{
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.ACCESS_FINE_LOCATION,
};
public static void requestBlePermissions(Activity activity, int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
ActivityCompat.requestPermissions(activity, ANDROID_12_BLE_PERMISSIONS, requestCode);
else
ActivityCompat.requestPermissions(activity, BLE_PERMISSIONS, requestCode); …Run Code Online (Sandbox Code Playgroud) permissions android bluetooth bluetooth-lowenergy android-12
我的 Xamarin.Android 应用程序的推送通知仅适用于 Android 11 (Pixel 3 XL)。目前,我的应用程序针对的是 Android 11,但它也可以在 Android 12 (Pixel 6 Pro) 上运行。唯一不起作用的是 Firebase 推送通知。下面是我正在使用的代码。在过去的一周里,我一直在研究这个问题,并看到了有关 Android 12 (Pixel 6) 未收到推送通知的特定问题的帖子。我按照其他人的建议对手机配置进行了更改,另一个应用程序通知开始工作,但我的仍然没有。任何想法都会有所帮助。谢谢。
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
// Notification channels are new in API 26 (and not a part of the
// support library). There is no need to create a notification
// channel on older versions of Android.
var name = "NameOfChannel";
var description = "Notification Channel";
var channel = new NotificationChannel(CHANNEL_ID, name, NotificationImportance.Max)
{
Description = description …Run Code Online (Sandbox Code Playgroud) 我一直在关注文档,但不幸的是它不包括使用材质组件作为应用程序整体主题时的适应。
<style name="Theme.App" parent="Theme.MaterialComponents.DayNight">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryVariant">@color/colorPrimaryDark</item>
<item name="colorOnPrimary">@android:color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/colorPrimary</item> <!--Fab color-->
<item name="colorOnSecondary">@color/colorAccent</item> <!--Fab icon color-->
<item name="colorSecondaryVariant">@color/colorAccentDark</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<!--<item name="tabStyle">@style/AppTabLayout</item>-->
<!-- The color for all other text including the menu -->
<item name="android:textColor">@color/colorPrimary</item>
<item name="android:textColorHighlight">@color/colorAccentDark</item>
<item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
<item name="checkboxStyle">@style/AppCheckBoxStyle</item>
<item name="popupMenuBackground">@drawable/popup_bg_rounded</item>
<item name="materialAlertDialogTheme">@style/AppDialogTheme</item>
<item name="autoCompleteTextViewStyle">@style/AppCursor</item>
<item name="overlapAnchor">false</item>
<item name="android:dropDownVerticalOffset">?attr/actionBarSize</item>
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
</style>
<style …Run Code Online (Sandbox Code Playgroud) android material-components-android android-12 android-splashscreen
android-12 ×10
android ×7
bluetooth ×3
permissions ×2
xamarin ×2
analytics ×1
fusedlocationproviderclient ×1
java ×1
kotlin ×1
location ×1
material-components-android ×1
pixel ×1
trampolines ×1