36

私は人々がウェブサイトの代わりとして使用するAndroidアプリを持っています。したがって、ユーザーがWebサイトへのURLに遭遇した場合、ブラウザーではなくアプリで「URLを開く」オプションをユーザーに提供したいと思います。つまり、ポップアップを表示して、自分のアプリとブラウザー(および場合によっては他のアプリ)のどちらかを選択できるようにします。

さまざまなソースから、正しい形式のURLをフィルタリングする「データ」フィルターを使用してアプリのアクティビティにインテントフィルターを追加する必要があることを理解しています。

問題のWebサイトはhttp://members.iracing.comであるため、次のインテントフィルターを追加しました。

    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:host="members.iracing.com" />
        </intent-filter>
    </activity>

両方の属性を持つ単一の「データ」ノードを使用するなど、これらのデータフィルターのさまざまな形式を試しました。

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" android:host="members.iracing.com"/>
        </intent-filter>

それは単に機能していません。他に何を言うべきかわかりません。私は自分のWebサイトで簡単なHTMLページをホストし、そのWebサイトのさまざまなページ(すべて「http://members.iracing.com / ...」で始まる)へのリンクをいくつか表示しました。これらのいずれかをクリックすると、単に開きます。使用したいアプリを聞かれることなく、ブラウザで。エミュレーターと物理デバイスにアプリをインストールした後の両方で試しましたが、何も機能しません。私はこれを完全に空白の新しいAndroidプロジェクトで試しましたが、それが機能するかどうかを確認するためだけに、何もしませんでした。

その後、Webサイトに認証が必要であることに気付きました。ログインしていない場合は、 https://members.iracing.com/membersite/login.jspのログインページにリダイレクトされるため、スキームを「https」に置き換えてみました。ホストを「www.members.iracing.com」に変更してみましたが、最終的にはこれらすべての組み合わせを試しました(これが機能するかどうかはわかりませんが、この時点では必死です。 ...)

       <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:host="members.iracing.com" />
            <data android:host="www.members.iracing.com" />
        </intent-filter>

まだ行きません。リダイレクトが適切かどうかはわかりませんが、ブラウザは明らかに最初にリダイレクトされていないサイトに移動し、次にログインページにリダイレクトしますが、アプリで開くことを選択することはできません。さらに、最初にブラウザに手動でログインした場合、リダイレクトがなく、それでも機能しません。

ここで明らかな何かが欠けていますか?なぜこれが機能しないのか、髪の毛を抜いていて、考えられるすべての可能な組み合わせを試す以外にデバッグすることはできません(私はそうしました...)。助けてくれてありがとう!

4

3 に答える 3

64

インテントフィルターが機能しなかった理由を調査するのに時間を費やしたので、これをここに投稿すると思いました。それはずっと機能していたことがわかりましたが、一致は正確です。したがって、http://myexample.comのインテントを登録し、http ://myexample.com/blahをクリックすると、機能しなくなります。

以下を追加すると、問題が修正されました。

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

したがって、インテントフィルタは次のようになります。

<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="example.com" />
            <data android:scheme="https" />
            <data android:pathPattern="/.*" />
</intent-filter>
于 2013-08-20T23:14:10.190 に答える
37

あなたのでこれらの3つを使用してください<intent filter>

<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
于 2012-11-08T13:31:52.830 に答える
10

@nurieta、あなたの答えは私のためにトリックをしましたありがとう!

潜在的なクエリ文字列を扱っているので、一言アドバイスします。アプリを開くだけなのか、アプリ内の特定の場所に送るのかを判断するために、.javaのコードを少し使って処理しました。私のアプリは、JQueryモバイルアプリを実行する単なるWebViewです。

    if(getIntent().getData()!=null){//check if intent is not null
        Uri data = getIntent().getData();//set a variable for the Intent
        String scheme = data.getScheme();//get the scheme (http,https)
        String fullPath = data.getEncodedSchemeSpecificPart();//get the full path -scheme - fragments

        combine = scheme+"://"+fullPath; //combine to get a full URI
    }

    String url = null;//declare variable to hold final URL
    if(combine!=null){//if combine variable is not empty then navigate to that full path
        url = combine;
    }
    else{//else open main page
        url = "http://www.example.com";
    }
    webView.load(url);
于 2014-08-13T20:35:38.880 に答える