微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SecurityException: 来自 uid xxx 的 <<other_package>> 不允许在调用 setPrimaryClip 时执行 READ_CLIPBOARD

如何解决SecurityException: 来自 uid xxx 的 <<other_package>> 不允许在调用 setPrimaryClip 时执行 READ_CLIPBOARD

我收到了有关以下崩溃的报告

SecurityException: <<other_package>> from uid xxx not allowed to perform READ_CLIPBOARD

用户单击将文本复制到剪贴板的按钮时发生崩溃,如下所示。

val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("label",shareUrl)
clipboard.setPrimaryClip(clip)

所以我的应用程序不会尝试从剪贴板读取任何内容。真的很困惑为什么会发生这个错误

有谁知道这次崩溃是如何发生的,我该如何解决

其他信息

此崩溃仅发生在 Android 9 和 Android 10 中,并且不会轻易发生(每月 20 万活跃用户中只有 6 个用户

我只在 Crashlytics 中看到了两个 >(一个是银行应用,另一个是音乐应用)。

我尝试阅读ClipboardService.javaAppOpsManager.java的源代码,发现崩溃可能来自noteOp中的AppOpsManager

这是崩溃的堆栈跟踪:

Fatal Exception: java.lang.SecurityException: <<other_package>> from uid xxx not allowed to perform READ_CLIPBOARD
       at android.os.Parcel.createException(Parcel.java:2087)
       at android.os.Parcel.readException(Parcel.java:2055)
       at android.os.Parcel.readException(Parcel.java:2003)
       at android.content.IClipboard$Stub$Proxy.setPrimaryClip(IClipboard.java:293)
       at android.content.ClipboardManager.setPrimaryClip(ClipboardManager.java:106)
       at my.package.MyClass.copyToClipboard(MyClass.java:63)
       at android.view.View.performClick(View.java:7375)
       at android.view.View.performClickInternal(View.java:7336)
       at android.view.View.access$3900(View.java:822)
       at android.view.View$PerformClick.run(View.java:28214)
       at android.os.Handler.handleCallback(Handler.java:883)
       at android.os.Handler.dispatchMessage(Handler.java:100)
       at android.os.Looper.loop(Looper.java:238)
       at android.app.ActivityThread.main(ActivityThread.java:7829)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:986)

Caused by android.os.remoteexception: Remote stack trace:
    at android.app.AppOpsManager.noteOp(AppOpsManager.java:2568)
    at com.android.server.clipboard.ClipboardService.clipboardAccessAllowed(ClipboardService.java:933)
    at com.android.server.clipboard.ClipboardService.setPrimaryClipInternal(ClipboardService.java:775)
    at com.android.server.clipboard.ClipboardService.setPrimaryClipInternal(ClipboardService.java:710)
    at com.android.server.clipboard.ClipboardService$ClipboardImpl.setPrimaryClip(ClipboardService.java:358)

解决方法

我终于可以在 Android 9 中重现崩溃了。这就是我发现的......

根本原因:当前台应用调用 ClipboardService 时,PrimaryClipChangedListener 会将事件广播到 AppOpsManager.noteOp(如果有),并且还会调用READ_CLIPBOARD 通知 READ_CLIPBOARD 操作。

如果监听器不允许 cmd appops set <package> READ_CLIPBOARD deny(用户可以使用 adb shell 命令禁止:AppOpsManager.noteOp),SecurityException 将抛出一个 try/catch 并使前台崩溃应用。

现在我确定我的代码没有做错任何事情,但不幸的是我认为我必须将 setPrimaryClip 放在 Postgres 周围

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。