2015-12-24 13 views
6

Ich habe das in meinem Manifest definiert folgende:Android Deep Linking mit benutzerdefinierter URI

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.app.package"> 
... 
    <activity 
     android:name="app.myActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data 
       android:host="www.example.com" 
       android:pathPrefix="/gizmos" 
       android:scheme="http" /> 
      <!-- note that the leading "/" is required for pathPrefix--> 
      <!-- Accepts URIs that begin with "example://gizmos”--> 
      <data 
       android:host="gizmos" 
       android:scheme="example" /> 
     </intent-filter> 
    </activity> 
... 

Und ich habe meine onCreate() als solche definiert:

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

    Intent intent = getIntent(); 
    Uri data = intent.getData(); 
    if (data != null) { 
     Log.d("URI",data.toString());    
    } 
} 

Dies ist in Übereinstimmung mit dem Android Dokumentation: Android Deep Linking

die Frage ist also:

Wie teste ich die URI-Deep-Linking? Gemäß der Dokumentation betreibe ich so etwas wie

adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos" com.app.package

Aber das erzeugt:

Error: Activity not started, unable to resolve Intent { act=android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.app.package }

Ich habe auch die Schale mit dem Namen und der Fundstelle der Aktivität, die Abschuss Aktivität und links versucht, das Paket leer . Die einzige, die ich bekommen kann zu arbeiten, ist:

adb shell am start -W -a android.intent.action.VIEW -d " http://www.example.com/gizmos "

Aber selbst wenn ich dieses Gehen bekam, die nicht zu sagen, dass es in anderen Anwendungen funktionieren wird. BENUTZERDEFINIERTE URIs (z. B. Beispiel: // gizmos) sind in anderen Apps wie Gmail und WhatsApp nicht anklickbar. Daher ist auch das Testen im Android-Ökosystem problematisch.

Die Antwort at this stack overflow question ist nicht akzeptabel, da es die Frage nicht beantwortet, sondern nur ermutigt die Verwendung der http: // Version, ich möchte das Beispiel: // Schema zu arbeiten.

+0

Bitte versuchen Sie nicht, mehrere Fragen in einen einzigen Beitrag zu stopfen. Selbst wenn Sie denken, dass sie verwandt sind. –

Antwort

11

Die ADB die Absicht sendet, es ist nur, dass Ihre App separaten Intent-Filter haben müssen, wenn Sie mehrere Verbindungstypen wollen:

<activity 
     android:name="app.myActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <!-- Accepts URIs that begin with "example://gizmos”--> 
      <data 
       android:host="gizmos" 
       android:scheme="example" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data 
       android:host="www.example.com" 
       android:pathPrefix="/gizmos" 
       android:scheme="http" /> 
      <!-- note that the leading "/" is required for pathPrefix-->     
     </intent-filter> 
    </activity> 

Dann wurde die folgende ADB Befehle beide arbeiten:

adb shell am start -W -a android.intent.action.VIEW -d "example://gizmos"
adb shell am start -W -a android.intent.action.VIEW -d " http://www.example.com/gizmos "

jedoch habe ich aufgetretenen Probleme mit mehreren Elementen auf URI angehängt an den benutzerdefinierten (zB Beispiel: // Gizmos data1 = ‚Hallo‘ & Daten2 = ‚Welt‘ - die ‚&‘ abgeschnitten wird?)

Und natürlich behebt dies nicht die Tatsache, dass diese Links in anderen Apps, wie WhatsApp und Gmail, nicht anklickbar sind ... und doch sind sie auf anderen Plattformen anklickbar.

+3

Danke! Das ist ** SO ** in der Referenzdokumentation von Android nicht klar! – swooby

+2

Ich bin manchmal erstaunt, wie eine Firma so bekannt sein kann, aber ihre Dokumentation kann so dunkel/irreführend sein. Dies war jedoch sehr hilfreich. – superuserdo

+1

Wirklich hilfreich !!! – Ajay

2

Wie die andere Antwort erwähnt, erfordert das Android-Framework, dass Sie separate Intent-Filter für jeden Deep-Link deklarieren, den Sie in Ihrer App aktivieren. Das ist der Grund, warum Sie den Fehler erhalten.

Auch anstelle von adb verwenden, können Sie Deep-Links testen direkt auf Android mit Deep-Link Tester App:

https://play.google.com/store/apps/details?id=com.manoj.dlt

Es besteht keine Notwendigkeit, jeden Paketnamen oder Komponentennamen zu nennen. Gib einfach den eigentlichen Deeplink ein und feuere ab.

Ich habe mit Deep Links gearbeitet und persönlich fand ich Tests über adb zeitaufwendig. Daher habe ich diese App erstellt, um Deep Links direkt zu testen und auf den Play Store zu laden.

Verwandte Themen