2014-07-21 8 views
9

Sono in difficoltà con l'elemento <data> nel file AndroidManifest.xml per far funzionare la corrispondenza URI. Voglio abbinare i seguenti URI:URI di corrispondenza con <data> come http://example.com/something in AndroidManifest

ma non

ho preso per lo più a lavorare con

<data android:scheme="http" 
     android:host="example.com" 
     android:pathPattern="/..*" /> 

<data android:pathPattern="/..*/" /> 

ma corrisponde ancora http://example.com/something/else.

Come posso escluderli?

+0

Il problema è il '*' che è un carattere jolly per "tutto il resto dopo". Prova a rimuoverlo e controlla se funziona! – Leonardo

+0

@LeonardoFerrari Sì, ma è necessario anche il carattere jolly per associare tutti i tipi di caratteri tra le due o una barra. – Mahoni

+0

Mi dispiace se questo non aiuta, ma ecco un [regex che funziona per il tuo situtation] (http://regex101.com/r/rT5rZ5/1). Non so se questo aiuti perché non conosco Android. Spero che aiuti un po 'e buona fortuna! – skamazin

risposta

8

Purtroppo i caratteri jolly che possono essere utilizzati per il tag pathPattern sono molto limitate e ciò che si vuole è attualmente impossibile per pura xml.

Questo perché una volta accettato lo standard "/.*" viene accettato tutto (che include le barre). E poiché non possiamo fornire tag di dati che NON devono essere accettati, l'unico modo è controllare i dati all'interno della tua attività. Ecco come realizzare ciò che si sono fino a:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Uri data = getIntent().getData(); 

    Log.d("URI", "Received data: " + data); 
    String path = data.getPath(); 

    // Match only path "/*" with an optional "/" in the end. 
    // * to skip forward, backward slashes and spaces 
    Pattern pattern = Pattern.compile("^/[^\\\\/\\s]+/?$"); 
    Matcher matcher = pattern.matcher(path); 
    if (!matcher.find()) { 
     Log.e("URI", "Incorrect data received!"); 
     finish(); 
     return; 
    } 

    // After the check we can show the content and do normal stuff 
    setContentView(R.layout.activity_main); 

    // Do something when received path data is OK 
} 

attività all'interno del manifesto sarebbe simile a questa:

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="http" 
       android:host="example.com" 
      android:pathPattern="/.*"/> 
    </intent-filter> 
</activity> 

Se non si desidera la vostra attività per verificare se i dati sono corretti si vuole devi cambiare le tue esigenze.

+4

Il problema con questa soluzione è che una volta che la tua attività ha ricevuto l'Intento, se non fa nulla con esso, altre attività non avranno la possibilità di riceverlo. –

-6
<data android:scheme="http" 
    android:host="example.com" 
    android:pathPattern="\/[\w]+\/?$" /> 

Qui dicono che ci sarà un barra \/ (dal barra deve essere sfuggito) seguito da 1 o più carattere di parola dopo ci potrebbe essere un altro barra (ma questo è facoltativa) alla fine della stringa

Dai un'occhiata alla DEMO

+0

Non penso che questi caratteri di regexp siano legali qui. Già il vantaggio non funziona. – Mahoni

+0

Oh Manifest accetta solo. * ed escape \\ secondo http://stackoverflow.com/questions/4762251/android-matching-a-url-pattern quindi sembra che il tuo compito non sia possibile quindi – gaw

4

A meno che non si abbiano molte varianti di percorsi che si desidera catturare, è sufficiente dichiararli tutti in modo esplicito (utilizzando path e pathPrefix) per evitare motivi troppo ampi.

<data android:scheme="http" android:host="example.com" android:path="/something" /> 
<data android:scheme="http" android:host="example.com" android:pathPrefix="/foo" /> 
+1

android: path and android: i valori pathPrefix dovrebbero iniziare con '/'. – Thupten

+0

Infatti, risolto ora. –

Problemi correlati