标签: android-12

在没有蹦床的情况下跟踪通知点击(Android 12 中禁止)

Android 12 禁止所谓的通知蹦床: https://developer.android.com/about/versions/12/behavior-changes-12#notification-trampolines

目前,我正在通过分析工具跟踪通知点击事件,但使用“trampoline”,这是一个广播接收器,它在实际通知意图打开特定活动之前发送事件。

在这里和那里阅读时,我发现该方法的替代方案(也可以避免蹦床)包括使用发送分析事件所需的信息填充 Intent extras。但在这里我看到两个问题:

  1. 此逻辑应在所有涉及的活动上复制,因此很难使其可靠以避免错误/错误
  2. AFAIK,在活动重新创建时清理 Intent 额外内容是不可能的,这意味着,即使您删除了发送事件所需的 Intent 额外内容,如果重新创建相同的活动(即使用“不保留活动”开发选项),使用原始 Intent 附加功能,导致单个实际通知点击产生多个事件。

这是我用来消耗额外意图的函数:

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 analytics trampolines android-12

8
推荐指数
0
解决办法
963
查看次数

Android 12 不会返回具有大致位置权限的位置

在搭载 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_ACCURACYLocationRequest.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

8
推荐指数
1
解决办法
4093
查看次数

Android 12 BLUETOOTH_CONNECT 权限被拒绝时授予

所以我知道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。关于为什么会发生这种情况以及如何解决它有什么想法吗?可能是一个错误?谢谢

permissions android bluetooth kotlin android-12

8
推荐指数
1
解决办法
1万
查看次数

Xamarin Forms BLE 插件扫描问题 Android 12

我编写了一个 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 没有蓝牙权限请求。

bluetooth bluetooth-lowenergy xamarin android-12

8
推荐指数
1
解决办法
5720
查看次数

如何在运行时更改 Android 12“neverForLocation”BLUETOOTH_SCAN 权限标志

我正在开发一个使用蓝牙的 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 android-permissions android-bluetooth android-12

8
推荐指数
0
解决办法
2859
查看次数

对于 Android 12,后退按钮不会导致 onDestroy

我刚刚开始确保我的应用程序可以在 Android 12 上运行。我注意到(我相信)所有应用程序在按下后退按钮时都会调用 onPause(),但不会调用 onDestroy()。这意味着该应用程序仍在运行。

以前,当按下后退按钮时,onDestroy() 会在 onPause() 之后调用。

对于运行有(实际上必须有)通知的后台服务的人来说,这绝对是一个问题。停止服务通常是在 onDestroy() 中完成的,当然不是在 onPause() 中完成的。由于未调用 onDestroy(),因此服务继续运行并且通知保持有效。如果您选择通知,它会再次显示[正在运行]应用程序。除非通过概述(左)按钮终止进程,否则无法停止服务并因此停止通知。

我还注意到,如果带有服务的应用程序崩溃,则通知会保持不变。这肯定不是我们所期望的行为。

您可以而且显然必须使用概览(左)软按钮终止该进程。

我可以通过实现 onBackPressed 来解决这个问题:

@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();
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个拼凑。

对于其他应用程序来说,它们是否仍在运行可能并不重要。然而,这是意想不到的行为。

稍后添加:这显然是故意的,并且是对之前行为的改变。这篇文章中提到了这一点(感谢@ianhanniballake):

https://developer.android.com/about/versions/12/behavior-changes-all#back-press

我有几个应用程序,并且我已经验证了 Android 12 上的所有应用程序都发生了这种情况。它给那些拥有服务的应用程序带来了问题。

这个问题隐含的问题是如何处理它。我个人正在为这些实现 onBackPressed 并保留其他的。

android android-12

8
推荐指数
1
解决办法
1583
查看次数

android.app.ForegroundServiceStartNotAllowedException:由于 mAllowStartForeground false 而不允许 Service.startForeground()

我已将 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 的工作管理器来限制此崩溃 提前致谢

java android-workmanager android-12

8
推荐指数
0
解决办法
5509
查看次数

Android 12 蓝牙权限

我正在尝试使用 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

7
推荐指数
2
解决办法
3万
查看次数

在 Android 12 上未收到 Firebase 推送通知

我的 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)

android pixel xamarin google-cloud-firestore android-12

7
推荐指数
2
解决办法
6193
查看次数

Android 12 启动画面 API 无法与 Material 组件配合使用

我一直在关注文档,但不幸的是它不包括使用材质组件作为应用程序整体主题时的适应。

<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

7
推荐指数
1
解决办法
2719
查看次数