2014-10-05 59 views
0

我患有Intent解析机制。意图解析 - 隐含意图来自ContentProvider的数据

我有一个内容提供商:

<provider 
android:authorities="com.company.app" 
android:name=".content.MyProvider" 
android:exported="false" /> 

我有一个活动:

<activity 
     android:name=".activity.DetailedFlowActivity" 
     android:parentActivityName=".activity.LauncherActivity"> 

    <intent-filter> 
      <action android:name="com.company.app.EDIT_CATEGORY" /> 

      <action android:name="com.company.app.ANOTHER_EDIT_ACTION" /> 

      <data 
       android:scheme="content" 
       android:host="com.company.app" 

       /> 


     </intent-filter> 
    <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".activity.LauncherActivity" /> 
</activity> 

提供商具有两个特定路径(即,在SQLite的分贝两个表),并且Activity本身知道如何查询这两个路径。因此,我只用<data>来声明权限和方案,假设这足以解决这个意图。

的问题是:每当我这样做:

Intent intent = new Intent(DetailedFlowActivity.ACTION_EDIT_CATEGORY); 
intent.setData(
     Uri.withAppendedPath(CategoryItemContract.CONTENT_URI, 
     String.valueOf(categoryId))); 

startActivity(intent); 

我期望意图解析为DetailedFlowActivity,但它无法告诉我,没有合适的Activity发现来处理这样的意图:其中动作= com.company.app.EDIT_CATEGORY and data = content://com.company.app/categories/123

我当然可以转向使用明确的意图,因为东西发生在我的应用程序内部,但我宁愿使其在美丽的REST风格的方法:)

帮助赞赏。

+1

http://developer.android.com/guide/components/intents-filters.html#Receiving-有一个说明,你应该阅读。 – Luksprog 2014-10-05 07:42:39

+0

@Luksprog,谢谢你迫使我重读这个文档:) – Drew 2014-10-05 08:30:02

回答

1

好吧,现在我明白了。 Luksprog的评论迫使我再次阅读Intent resolution documentation,并多注意URI数据匹配部分。

第一个,指定CATEGORY_DEFAULT,因为意图是隐含的。这是必要的,我错过了这件事。

,虽然它说:

包含URI但没有MIME类型(既不明确也不由URI 可推断)的意图传递只有当它的URI匹配 过滤器的URI测试格式和过滤器同样没有指定MIME类型

我发现,在我的ContentProvider的情况下,我需要将MIME类型指定为intent-filter。并通过动作将我的意图过滤器分成两个过滤器:

<intent-filter> 
    <action android:name="com.company.app.EDIT_CATEGORY" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
      <data 
       android:scheme="content" 
       android:host="com.trustydroid.xpense" 
       android:mimeType="vnd.android.cursor.item/vdn.categories" 
       /> 

</intent-filter> 

..以及类似的另一个。

希望这会有所帮助。