2012-06-21 57 views
3

我在我的应用程序有一个意图过滤器中的一个已经的活动是私人活动,但仍被标记为私有,即android:exported=falsequeryIntentActivities()包括结果

<activity android:exported="false" android:name=".facebook.PostToFacebookActivity" android:icon="@drawable/facebook_icon" android:label="@string/facebook_built_in"> 
     <intent-filter> 
      <action android:name="android.intent.action.SEND" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="text/plain" /> 
     </intent-filter> 
    </activity> 

(此活动是用于内部只使用;我的应用程序的一部分允许用户从所有可以在某处发送文本的活动列表中进行选择,这使我可以轻松地在整个列表中添加几个应用程序内部选项。)

但是,当我使用不同的应用程序中的queryIntentActivites()时,我的“私人”活动仍然存在返回:

// Returned list includes the above activity, even though it's declared private. 
List<ResolveInfo> infoList = pm.queryIntentActivities(
     myIntent, 
     PackageManager.MATCH_DEFAULT_ONLY | 
     PackageManager.GET_INTENT_FILTERS 
); 

基本安全似乎很好地工作,因为如果我尝试开始从其他应用程序的活动,我得到一个安全异常。但看起来很奇怪的是,为一个意图询问活动会给你一个包括你不允许开始的活动的列表。

我以为如果一个活动设置为不导出,它甚至不会出现在queryIntentActivities()结果中。无论如何,这就是我想要的行为。有没有可以用来表示“不要显示我的私人活动”的标志,还是一种过滤结果的简单方法,以摆脱我不允许开始的活动?

回答

4

我曾经想过,如果一个Activity被设置为不导出,它甚至不会出现在queryIntentActivities()结果中。

这就是方式太合乎逻辑了。 :-)

有一个标志,我可以用说“不显示我的私人活动”

被记录在案当然没有。

或过滤结果的简单方法摆脱活动我不被允许开始?

给定一个ResolveInfo,该activityInfo.exportedboolean应该对非出口活动的假。您可以循环访问您的queryIntentActivities()结果,并清除非导出的结果。

+0

我完全不知道为什么我没有把这个标记为两年前的答案!补救。 –

+0

@MattGibson有趣的是,没有看到这篇文章,我也写了一个活动,通过这个“作弊”从我的应用程序发布到FB。和你一样遇到同样的问题。其他应用程序正在寻找我的你找到解决方案吗? – theblitz

+1

@theblitz Nope;最终,我从不需要从试图使用我的第三方应用程序的角度来解决这个问题,所以我没有调查。我可能会问一个新的SO问题,如果你还没有这样做... –