【问题标题】:SecurityException thrown only in Samsung devices with Android version 6 and above仅在 Android 版本 6 及更高版本的三星设备中引发 SecurityException
【发布时间】:2018-01-20 14:17:22
【问题描述】:

以下问题与 Android 6 及以上版本有关。

我已经编写了一些代码,可以在 motoG、Nexus、Pixel 等每台设备上运行,但代码在三星设备中会引发 SecurityException。

异常消息是

UiAutomatorTestRunner: java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@a70d2 (pid=25949) 获取内容提供程序设置时

我在三星 Galaxy S5 上做了一次尝试,它成功了。 但是对于三星 J7,这个异常也会在代码的其他地方抛出。 我不认为在这里添加 try catch 块是正确的方法。

抛出异常的代码是:

意图意图 = AndroidServicesUtil.getPackageManager().getLaunchIntentForPackage(packageName);

异常堆栈是: >

java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@123375c (pid=6375) when getting content provider settings
at android.os.Parcel.readException(Parcel.java:1621)
at android.os.Parcel.readException(Parcel.java:1574)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4292)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:6570)
at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:2388)
at android.content.ContentResolver.acquireProvider(ContentResolver.java:1505)
at android.provider.Settings$NameValueCache.lazyGetProvider(Settings.java:1431)
at android.provider.Settings$NameValueCache.getStringForUser(Settings.java:1505)
at android.provider.Settings$Secure.getStringForUser(Settings.java:8662)
at android.provider.Settings$Secure.getIntForUser(Settings.java:8732)
at android.provider.Settings$Secure.getInt(Settings.java:8722)
at android.app.ApplicationPackageManager.getHiddenList(ApplicationPackageManager.java:814)
at android.app.ApplicationPackageManager.isHidden(ApplicationPackageManager.java:859)
at android.app.ApplicationPackageManager.queryIntentActivitiesAsUser(ApplicationPackageManager.java:925)
at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:907)
at android.app.ApplicationPackageManager.getLaunchIntentForPackage(ApplicationPackageManager.java:302)
at com.myclass.launchApp(SessionManager.java:595)

任何人都可以帮助我理解为什么仅在适用于 Android 版本 >= 6 的三星设备中引发 SecurityException。

谢谢。

【问题讨论】:

  • 请编辑您的问题并提供minimal reproducible example。这将包括整个 Java 堆栈跟踪(不仅仅是错误消息)和触发崩溃的 Java 代码。
  • 我了解您的查询,但我的问题与我的代码无关,而是一个一般性问题。 (因为在不同设备的代码的不同位置引发了异常)为什么 SecurityException 仅在三星设备中引发,而在 Android vs >=6 的任何其他设备中均不引发?我们需要为三星设备做些什么吗?
  • “为什么 SecurityException 只在三星设备中抛出,而不是在任何其他 Android 设备中引发 >=6?” -- 首先,您尚未测试所有可能的 Android 6.0+ 设备,因此您不一定知道此代码失败的设备的确切列表。至于失败的原因,我们无法回答,因为您没有按照我的原始评论中的要求提供minimal reproducible example。欢迎设备制造商和定制ROM开发者更改Android;问题是错误是在您的代码中还是在他们的更改中。
  • 更新了堆栈跟踪和我得到安全异常的代码。
  • 您传递的packageName 的值可能无效,但我希望这里出现不同的错误消息。如果此代码因已知良好的包名称而失败,则责任落在三星(以破坏getLaunchIntentForPackage() 的方式更改 Android)和可能的谷歌(如果设备已发货,则没有涵盖此场景的 CTS 测试用例)有这个错误)。

标签: java android samsung-mobile samsung-mobile-sdk


【解决方案1】:

如果您的设备运行的是 Android 版本 >= 6,则您必须添加运行时权限,因为这些 Android 版本仅从运行时获取权限,而不是清单文件。

那些版本低于 6,它们会自动从清单文件中获取权限。如果您要添加运行时权限,您的问题将得到解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2016-09-13
    • 2020-09-16
    • 2018-03-04
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多