it-swarm.com.de

Intent-Filter zum Starten von My Activity, wenn auf benutzerdefinierte URI geklickt wird

Ich versuche zuzulassen, dass eine URI registriert wird, um sie mit meiner App zu öffnen. Wie die PatternRepository am Blackberry und die CFBundleURLNameCFBundleURLSchemes am iPhone. Wie erreiche ich auf Android die gleichen Ergebnisse?

Das System sendet E-Mails mit folgendem Link: myapp://myapp.mycompany.com/index/customerId/12345. Die Idee ist, dass der Benutzer in der Lage sein sollte, auf den Link zu klicken, um die Kundenaktivität in der Anwendung zu öffnen. 

Ich habe zahlreiche Vorschläge aus anderen SO - Beiträgen ausprobiert, aber ich kann das Betriebssystem nicht dazu bringen, das Muster zu erkennen und meine App zu öffnen. 

In der Google Mail-App sieht das so aus: myapp: // myapp.mycompany.com/index/customerId/12345 . Er erkennt und unterstreicht den myapp.mycompany.com/index/customerId/12345-Teil des Links und öffnet ihn in einem Browser. Der myapp://-Teil ist nicht linkified

Die Standard-E-Mail-Anwendung behandelt den gesamten Link als Nur-Text.

Was fehlt mir hier?

PS: Ich habe mir bereits angesehen Wie implementiere ich mein eigenes URI-Schema auf Android Und Wie registriere ich einen URL-Namespace (myapp: //app.start/), um auf Ihren zuzugreifen Programm durch Aufrufen einer URL im Browser unter Android OS?

_/Das Manifest:

<manifest
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:versionCode="2"
    Android:versionName="0.0.8" 
    package="com.mycompany.myapp.client.Android">

    <uses-sdk 
        Android:minSdkVersion="7" 
        Android:targetSdkVersion="7"/>

    <uses-permission Android:name="Android.permission.INTERNET"/>
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission Android:name="Android.permission.READ_PHONE_STATE"/>

    <application 
        Android:label="@string/app_name" 
        Android:name="myappApplication" 
        Android:icon="@drawable/ic_icon_myapp" 
        Android:debuggable="true">

        <activity 
            Android:label="My App" 
            Android:name=".gui.activity.LoginActivity" 
            label="@string/app_name">

            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

        <activity Android:name=".gui.activity.CustomerDetailActivity" > 
            <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:scheme="myapp"/> 
            </intent-filter> 
        </activity>

        <activity Android:name=".gui.activity.CustomerDetailActivity"/>
        <activity Android:name=".gui.activity.CustomerImageViewerActivity" />
        <activity Android:name=".gui.activity.CustomerListActivity" Android:configChanges="orientation|keyboardHidden"/>
        <activity Android:name=".gui.activity.HomeActivity" Android:configChanges="orientation|keyboardHidden"/>
        <activity Android:name=".gui.activity.AboutActivity" Android:configChanges="orientation|keyboardHidden"/>
        <activity Android:name=".gui.activity.AccountActivity" Android:configChanges="orientation|keyboardHidden" />  
    </application>
</manifest>
23
tuxGurl

Die endgültige Lösung war eine harte Workaround, um alle Grundlagen abzudecken. Die E-Mail enthält jetzt auch einen Anhang mit einer Erweiterung, die zum Öffnen mit der App registriert ist. 

Das Manifest: 

        <activity Android:name=".gui.activity.CustomerDetailActivity" > 
        <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:scheme="https"
                 Android:Host="myapp.mycompany.com" /> 
        </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:scheme="myapp"
                 Android:Host="myapp.mycompany.com" /> 
        </intent-filter> 
        <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />
            <action Android:name="Android.intent.action.EDIT" />
            <action Android:name="Android.intent.action.PICK" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />
            <data Android:mimeType="application/myapp" />
        </intent-filter>
    </activity>
13
tuxGurl

Als ich mit Google Kalender an OAuth arbeitete, musste ich diesen Filter zu der Aktivität hinzufügen, die ich den Rückruf erhalten wollte:

<intent-filter>
<action Android:name="Android.intent.action.VIEW"></action>
<category Android:name="Android.intent.category.DEFAULT"></category>
<category Android:name="Android.intent.category.BROWSABLE"></category>
<data Android:scheme="yourapp" Android:Host="goog"></data>
</intent-filter>

Wenn der Browser die yourapp://goog-URL aufrief, kehrte er zu meiner Aktivität zurück.

6
BigFwoosh

Sie können das Problem umgehen, dass GMail keine Nichtstandardprotokolle verknüpft, indem Sie eine Standard-HTTP-URL mit einer 302-Weiterleitung verwenden. Sie können es entweder auf dem Webserver oder dem Anwendungsserver Ihrer Website einrichten oder für den schnellen und schmutzigen Test einen URL-Shortener wie http://bit.ly verwenden.

4
Michael Nutt

Haben Sie getrocknet, indem Sie Ihrem Intent-Filter eine Kategorie hinzufügen:

<category Android:name="Android.intent.category.BROWSABLE" />
0
azharb

Das ist die Lösung für mich. Danke @DanO 

<intent-filter>
        <data Android:scheme="yourcustomname"/>
        <data Android:Host="*"/>
                <action Android:name="Android.intent.action.VIEW" />
                <category Android:name="Android.intent.category.DEFAULT" />
                <category Android:name="Android.intent.category.BROWSABLE" />
  </intent-filter>
0
emily

Ich bin auch nur darauf gestoßen, aber für standard http: schema urls. Google Mail scheint der Absicht keine Kategorien hinzuzufügen. Jetzt überprüfe ich nach BROWSABLE, aber ich füge auch eine Prüfung auf! Intent.hasCategories () hinzu und lasse dies auch durch.

0
dangVarmit

Sie können immer versuchen, Ihre E-Mails mit HTML zu versenden, und anschließend einen <a>-Tag verwenden, um die URL zu erstellen. Ich glaube nicht, dass es eine Möglichkeit gibt, die Art und Weise zu ändern, wie Google Mail oder Mail ihren Text analysieren, da sie wahrscheinlich die Klasse Linkify verwenden.

Eine andere Option wäre die Verwendung von http: // und dann eine Analyse für eine bestimmte benutzerdefinierte Subdomäne, die Ihren Benutzern die Option bietet, sie in einem Browser oder in Ihrer Anwendung zu öffnen.

0
DanO