【问题标题】:Permission Denial: Accessing service ComponentInfo {...} from pid=-1权限拒绝:从 pid=-1 访问服务 ComponentInfo {...}
【发布时间】:2014-05-16 01:34:11
【问题描述】:

我正在尝试使用 Google 的活动识别服务。几天前,一切都像一个魅力,即我可以连接使用该服务来获取活动信息。但是今天我发现我再也收不到了。查看日志后发现这个错误:

 05-15 21:19:27.196: W/ActivityManager(765): Permission Denial: Accessing service
 ComponentInfo{edu.umich.si.inteco.captureprobe/edu.umich.si.inteco.captureprobe.
 contextmanager.ActivityRecognitionService} from pid=-1, uid=10220 that is not exported   
 from uid 10223

我重新启动了手机,然后它又可以工作了。但是,在我重新安装应用程序后,同样的问题再次出现。谁能指出“真正的”问题是什么?它与“pid = -1”有关吗?我确实拥有 Manifest 文件中的权限

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>

我在 Google 上寻找答案,但大多数问题是他们没有在清单文件中放置权限。在我看来,这只是一个不同的问题......有人可以帮助我吗?谢谢!

更新: 这个问题总是可以通过重启手机来解决的。但是,当我卸载应用程序并通过 Eclipse 重新安装它时,它总是会重新出现。一个一致但奇怪的模式(至少对我来说)。我想知道手机是否会记住该应用程序并在我卸载它后停止它访问 Google Play 服务(或者由于某种原因 Google Play 服务不允许我的应用程序访问它)。有什么想法吗?

【问题讨论】:

  • 是的,我做到了。所以它以前可以工作。

标签: android permissions google-play-services


【解决方案1】:

我想出了解决办法。原因是由于两件事的结合:

  1. 重新安装会生成同一应用程序的新的不同 uid(注意,重新安装是指从手机上卸载应用程序,然后使用 Eclipse 重新安装)。

    李>
  2. 默认情况下,在服务标签中,“exported”的值为false,如here所述

其他应用程序的组件是否可以调用服务或与之交互——如果可以,则为“true”,否则为“false”。当值为“false”时,只有相同应用程序的组件或具有相同用户ID的应用程序才能启动服务或绑定到服务。 默认值取决于服务是否包含意图过滤器。没有任何过滤器意味着它只能通过指定其确切的类名来调用。这意味着该服务仅供应用程序内部使用(因为其他人不知道类名)。所以在这种情况下,默认值为“false”。另一方面,存在至少一个过滤器意味着该服务是供外部使用的,因此默认值为“true”。

所以我只需将标志设置为“true”就解决了我的问题。 (Google Activity Recognition 的示例代码使用值“false”而不是“true”。)

     <service
        android:name="edu.umich.si.inteco.captureprobe.contextmanager.ActivityRecognitionService"
        android:enabled="true"
        android:exported="true"
        >
    </service>

有趣的是,相同的代码适用于 Android 4.3 或更低版本。我在四款不同Android版本的手机上测试了我的代码,卸载/重新安装问题只发生在Android 4.4的手机上。所以这就是为什么我一直对这个问题感到困惑。为什么以前没有发生?无论如何,如果您遇到同样的问题(即重新安装后同一应用程序无法使用服务),请检查“导出”标志。

【讨论】:

  • 导出服务的唯一潜在问题是它可能会被恶意应用程序访问。最好创建一个 ActivityRecognitionService 来验证任何识别结果并将其转发到内部服务。
【解决方案2】:

这并非特定于活动识别;这显然是 4.4 中的安全改进,PendingIntents 已在系统中注册,更好的解决方案似乎是取消当前的待处理意图(使用 PendingIntent.FLAG_CANCEL_CURRENT)。

https://code.google.com/p/android/issues/detail?id=61850

【讨论】:

  • 这如何回答 OP 的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2020-04-02
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多