我正在尝试使用Google的 Activity 识别服务。几天前,一切正常运作,例如,我可以使用该服务进行连接以获取 Activity 信息。但是今天我发现我再也收不到了。查看日志后,我发现此错误:

 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”有关吗?我确实在 list 文件中有权限
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>

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

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

最佳答案

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

  • 重新安装会生成,它是同一应用程序的新的不同uid(请注意,通过重新安装,我的意思是从手机上卸载该应用程序,然后使用Eclipse重新安装)。
  • 默认情况下,在服务标签中,“exported”的值为false,如here
  • 所述

    其他应用程序的组件是否可以调用服务或与之交互-如果可以,则为“true”,否则为“false”。当值为“false”时,只有相同应用程序或具有相同用户ID的应用程序的组件才能启动服务或绑定(bind)到该服务。
    默认值取决于服务是否包含 Intent 过滤器。没有任何过滤器意味着只能通过指定其确切的类名来调用它。这意味着该服务仅供内部应用程序使用(因为其他人将不知道类名)。因此,在这种情况下,默认值为“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的手机上。所以这就是为什么我对这个问题感到困惑。为什么以前没有发生呢?无论如何,如果您遇到相同的问题(即,相同的应用程序在重新安装后无法使用服务),请选中“已导出”标志。

    10-08 03:08