将目标 SDK 切换到 API 级别 30 后,Samsung Accessory Protocol 不工作?

Samsung Accessory Protocol not working after switching target SDK to API level 30?

我们的应用程序依赖三星配件协议在我们的 Android 应用程序和 Galaxy Watch 应用程序之间进行通信。在将我们的目标和编译 SDK 从 API 级别 29 升级到 30 后(为未来几个月发布 Android 11 做准备)手表和 phone 应用程序将不再连接。除了升级 SDK 外,应用内没有其他更改。使用最新版本的 Samsung Accessory SDK 2.6.1.

有没有人找到针对 Android 11 的解决方案?还是我们只需要等待三星解决这个问题?

您回答了问题。我猜三星在自己的设备上推出 Android 11 之前(在 Android 11 将在最多 Google 设备上推出之前,它实际上会解决这些问题。我知道许多其他问题。等待修复。

我在将近一年后找到了这个问题的答案,因为同时我只是针对 Android 10 的内容。由于 Android 11 中所做的更改,需要将其添加到应用程序清单中:

<queries><package android:name="com.samsung.accessory"/></queries>

添加此行解决了问题,Samsung 配件协议再次工作。

Jordan 提供的答案是正确的,但我想详细解释一下原因并向清单添加更多查询权限。

从API 30 开始Android 已决定禁止查询除Android 的系统应用程序以外的所有包。常规应用程序必须为其要查询的每个包提供明确的权限。这只是另一种情况,我们应该共同感谢 Google 根本不关心向后兼容性。

如果反编译 SAP 代码,您会看到查询不同类型的包,例如

public static String a = "com.samsung.accessory";
PackageManager packageManager = paramContext.getPackageManager();
try {
  PackageInfo packageInfo;
  if ((packageInfo = packageManager.getPackageInfo(a, 0)) != null) {
...
  try {
    int i = (paramContext.getPackageManager().getPackageInfo("com.samsung.android.providers.context", 128)).versionCode;
...
etc.

由于我没有足够的时间来分析调用该 SAP 代码时所有可能的情况和场景,并且希望安全而不是因为沮丧的用户而感到遗憾,我只是添加了所有这些,所以我的查询权限如下所示:

  <queries>
    <package android:name="com.samsung.accessory" />
    <package android:name="com.samsung.android.providers.context" />
    <package android:name="com.samsung.android.app.watchmanager" />
    <package android:name="com.samsung.accessory.safiletransfer" />
    <package android:name="com.samsung.accessory.goproviders" />
    <package android:name="com.samsung.accessory.saproviders" />
</queries>