web-dev-qa-db-fra.com

schéma hôte ne fonctionne pas sur Android Lollipop, cliquez sur le lien pour ouvrir l'application

J'utilise ce morceau de code pour lancer mon application à partir d'un lien.

<activity
        Android:name="com.example.myApp.myClass"
        Android:label="@string/app_name" >
    <intent-filter>
        <data
            Android:Host="customHostName"
            Android:scheme="customScheme" />
        <action Android:name="Android.intent.action.VIEW" />
        <category Android:name="Android.intent.category.BROWSABLE" />
        <category Android:name="Android.intent.category.DEFAULT" />
    </intent-filter>
</activity>  

Ceci est un lien href, je veux obtenir la clé à la fin.

customScheme://customHost/49FYTJTF00

Cela fonctionne bien sur toutes les versions précédentes d'Android, mais ne fonctionne pas sur Lollipop.
Lorsque je clique sur le lien, il n'affiche que la liste des navigateurs à lancer.

Que devrais-je faire?

16
Salmaan

Veuillez utiliser pathprefix.

   Android:pathPrefix="/"

Cela pourrait résoudre votre problème. Veuillez suivre Guide du développeur Android URL.

6
Ahmad Arslan

Éditer:

Après avoir testé et testé, j'ai trouvé que si votre schéma contient un caractère majuscule, le navigateur ne pourra pas le lancer. Votre schéma ne doit contenir que des caractères minuscules!

Notez également que le bogue 459156 du projet chrome ne vous permet toujours pas de lancer directement les URL, vous devez référencer les utilisateurs vers une page Web contenant ce code JavaScript:

<!DOCTYPE html>
<html>
    <body>
        <script language="javascript">
            window.location = 'customscheme://customHost/49FYTJTF00';
        </script>
    </body>
</html>

Les utilisateurs qui atterrissent sur cette page seront automatiquement invités par une boîte de dialogue de sélection d'activité ou envoyés directement à votre activité.

Pour l'essayer, ouvrez le navigateur Android allez dans l'url ci-dessous et copiez collez l'extrait ci-dessus dans l'éditeur: http://www.w3schools.com/html/tryit. asp? filename = tryhtml_intro

Gif montrant le navigateur + JavaScript ouvrant l'activité

Gif

Message d'origine

J'ai essayé votre URI personnalisé et cela fonctionne sur Android 5.0

Mais vous devez être conscient des deux bugs/problèmes suivants:

  1. bogue 459156 du projet Chromium Cela signifie essentiellement que le lancement de schémas personnalisés à partir du navigateur Android ne fonctionne que si l'URL est appliquée à l'aide de JavaScript. Pour une solution de contournement, consultez cet article StackOverflow : OAuth et le schéma personnalisé entraînent un "ERR_UNknown_URL_SCHEME" dans Chrome
  2. Bogue 80971: l'URI avec le schéma personnalisé n'est pas cliquable dans SMS Text (Linkify?)

Mon approche

J'ai créé deux activités distinctes, l'une en tant que récepteur d'intention et l'autre en tant que lanceur d'intention. L'activité de lancement a un EditText où l'URI complet peut être entré et un bouton pour lancer l'URI entré.

Main.Java onClick (Activité de lancement)

@Override
public void onClick(View view) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(input.getText().toString()));
    try {
        startActivity(intent);
    } catch(ActivityNotFoundException e){
        Toast.makeText(this, "Auww!! No Activity can open this URI!", Toast.LENGTH_SHORT).show();
    }
}

manifest.xml (uniquement les activités)

Noter la <data Android:pathPattern=".*"/> partie. cette partie est importante, donc tout ce qui suit l'hôte sera accepté comme valide.

<activity
    Android:name=".Main"
    Android: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=".UriActivity"
    Android:label="@string/app_name">

    <!--
    This intent-filter will open any URI with the following forms:

    customscheme://customHost/49FYTJTF00
    customscheme://customHost
    https://www.google.com/something/something
    http://www.google.com/
    http://google.com/something
    -->

    <intent-filter>
        <data Android:scheme="https"/>
        <data Android:scheme="http"/>
        <data Android:Host="google.com"/>
        <data Android:Host="www.google.com"/>

        <data Android:scheme="customscheme"/>
        <data Android:Host="customHost"/>

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

        <action Android:name="Android.intent.action.VIEW"/>
        <category Android:name="Android.intent.category.DEFAULT"/>
        <category Android:name="Android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>

UriActivity.Java (Activité de réception)

public class UriActivity extends ActionBarActivity {

    private TextView tvText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_uri);
        tvText = (TextView) findViewById(R.id.text);
        setTextFromIntent();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setTextFromIntent();
    }

    private void setTextFromIntent(){
        StringBuilder text = new StringBuilder();

        Uri data = getIntent().getData();
        if(data != null){
            text.append("Path:\n");
            text.append(data.getPath());

            text.append("\n\nScheme:\n");
            text.append(data.getScheme());

            text.append("\n\nHost:\n");
            text.append(data.getHost());

            text.append("\n\nPath segments:\n");
            text.append(Arrays.toString(data.getPathSegments().toArray()));
        } else {
            text.append("Uri is null");
        }
        tvText.setText(text);
    }
}

Capture d'écran:

Result of sending the custom intent to the UriActivity

Téléchargement du projet de test:

J'ai fait un téléchargement pour le projet si vous ne voulez pas l'essayer vous-même.

21
Rolf ツ

Au lieu d'utiliser un lien vers customScheme: // customHost/49FYTJTF00, avez-vous essayé d'utiliser un lien comme

<a href="intent://customHostName/49FYTJTF00#Intent;scheme=customScheme;end">

Chrome devrait pouvoir ouvrir cela dans votre application très bien. En même temps, cela pourrait ne pas fonctionner sur tous les navigateurs.

2
A J

Tu as écrit:

    <data
        Android:Host="customHostName"
        Android:scheme="customScheme" />

Alors, utilisez customScheme://customHostName/49FYTJTF00
au lieu de customScheme://customHost/49FYTJTF00

0
ytRino

Gardez à l'esprit si vous souhaitez exécuter l'application à partir de Google Chrome vous devez le faire dans ne autre manière .

0
klimat