2014-10-05 58 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> 

..以及類似的另一個。

希望這會有所幫助。