2014-09-02 102 views
1

我需要爲單個文件myfile.ext定義IntentFilter。此刻我的清單看起來像:android:pathPattern for single file

 <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <action android:name="android.intent.action.EDIT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data 
       android:scheme="file" 
       android:mimeType="*/*" 
       android:host="*" 
       android:pathPattern=".*\\myfile\\.ext" 
      /> 
     </intent-filter> 

我也嘗試過其他變種,如:android:pathPattern=".*\\myfile.ext"等等 - 但仍不能處理我的文件。

任何線索?

+0

沒有像檢查的答案,解決方案,你評論說,它沒有工作。好運 – danny117 2014-09-09 14:32:27

回答

2

Android的模式細節:

  • .任何字符匹配。
  • *匹配0個或多個出現在其之前的字符。
  • .*匹配0個或更多的任何字符。
  • \用於轉義模式中的特殊字符。當從XML文件讀取字符串時,\也用作轉義字符。因此,爲了避免模式中的特殊字符,必須使用雙斜槓\\

問題: 在這種模式".*\\myfile\\.ext",你正試圖轉義字符m這是一個正常的字符。因此它沒有任何區別。它相當於".*myfile\\.ext"。意圖數據部分是file:///mnt/sdcard/tmp/myfile.ext。該模式與/mnt/sdcard/tmp/myfile.ext相匹配,但失敗。

.*嘗試匹配任何字符,直到第一次出現m,這恰好是第二個字符,即/mnt模式期望下一個字符是y,但它得到n,因此模式匹配失敗。

: 對於上面的路徑中,圖案/.*/.*/.*/myfile\\.ext作品。

對於/mnt/sdcard/myfile.ext路徑,模式/.*/.*/myfile\\.ext起作用。如果您不確定子目錄級別,則必須添加具有不同pathPattern值的多個<data>元素。

<data 
    android:scheme="file" 
    android:mimeType="*/*" 
    android:host="*" /> 

<data android:pathPattern="/.*/.*/.*/myfile\\.ext" /> <!-- matches file:///mnt/sdcard/tmp/myfile.ext --> 

<data android:pathPattern="/.*/.*/myfile\\.ext" /> <!-- matches file:///mnt/sdcard/myfile.ext --> 

下面是用於模式匹配的方法PatternMatcher.matchPattern

static boolean matchPattern(String pattern, String match, int type) { 
     if (match == null) return false; 
     if (type == PATTERN_LITERAL) { 
      return pattern.equals(match); 
     } if (type == PATTERN_PREFIX) { 
      return match.startsWith(pattern); 
     } else if (type != PATTERN_SIMPLE_GLOB) { 
      return false; 
     } 

     final int NP = pattern.length(); 
     if (NP <= 0) { 
      return match.length() <= 0; 
     } 
     final int NM = match.length(); 
     int ip = 0, im = 0; 
     char nextChar = pattern.charAt(0); 
     while ((ip<NP) && (im<NM)) { 
      char c = nextChar; 
      ip++; 
      nextChar = ip < NP ? pattern.charAt(ip) : 0; 
      final boolean escaped = (c == '\\'); 
      if (escaped) { 
       c = nextChar; 
       ip++; 
       nextChar = ip < NP ? pattern.charAt(ip) : 0; 
      } 
      if (nextChar == '*') { 
       if (!escaped && c == '.') { 
        if (ip >= (NP-1)) { 
         // at the end with a pattern match, so 
         // all is good without checking! 
         return true; 
        } 
        ip++; 
        nextChar = pattern.charAt(ip); 
        // Consume everything until the next character in the 
        // pattern is found. 
        if (nextChar == '\\') { 
         ip++; 
         nextChar = ip < NP ? pattern.charAt(ip) : 0; 
        } 
        do { 
         if (match.charAt(im) == nextChar) { 
          break; 
         } 
         im++; 
        } while (im < NM); 
        if (im == NM) { 
         // Whoops, the next character in the pattern didn't 
         // exist in the match. 
         return false; 
        } 
        ip++; 
        nextChar = ip < NP ? pattern.charAt(ip) : 0; 
        im++; 
       } else { 
        // Consume only characters matching the one before '*'. 
        do { 
         if (match.charAt(im) != c) { 
          break; 
         } 
         im++; 
        } while (im < NM); 
        ip++; 
        nextChar = ip < NP ? pattern.charAt(ip) : 0; 
       } 
      } else { 
       if (c != '.' && match.charAt(im) != c) return false; 
       im++; 
      } 
     } 

     if (ip >= NP && im >= NM) { 
      // Reached the end of both strings, all is good! 
      return true; 
     } 

     // One last check: we may have finished the match string, but still 
     // have a '.*' at the end of the pattern, which should still count 
     // as a match. 
     if (ip == NP-2 && pattern.charAt(ip) == '.' 
      && pattern.charAt(ip+1) == '*') { 
      return true; 
     } 

     return false; 
    } 
+0

好吧,我會檢查:) – barmaley 2014-09-05 07:27:02

+0

不行不行。任何其他想法? – barmaley 2014-09-05 07:31:38

+0

我定義了相同的意圖過濾器,並嘗試使用'adb shell啓動-a android.intent.action.VIEW -c android.intent.category.DEFAULT -d file:/// storage/emulated/0/myfile。 ext -t type/text'。我能夠用它開展活動。我不得不提及'-t'參數,但不會啓動。 – 2014-09-05 07:36:24

相關問題