web-dev-qa-db-ja.com

Open Android intent-filterを使用してURLからアプリが機能しない

Androidウェブサイトの代替として使用するアプリがあります。したがって、ユーザーがウェブサイトへの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サイトのさまざまなページへのリンク(すべて「http://members.iracing.com/...」で始まる)を使用して、単純なHTMLページをWebサイトでホストし、それらのいずれかをクリックすると、単に開く使用したいアプリを尋ねることなく、ブラウザで。エミュレータで試してみただけでなく、物理デバイスにアプリをインストールした後も、何も機能しません。私はこれを完全に空白で試しました、新しいAndroidプロジェクトはそれが機能するかどうかを確認するだけで、何もしません。

その後、ウェブサイトには認証が必要であることに気付きました。ログインしていない場合は、 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>

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

ここで明らかな何かを見逃していますか?私はこれがうまくいかない理由を抜いています、そして私は考え得るあらゆる組み合わせを試すことを除いてそれをデバッグすることはできません(私は...)助けてくれてありがとう!

33
Nick Thissen

これら3つを<intent filter>

<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
33
Anuj

インテントフィルターが機能しなかった理由を調査したので、ここに投稿するつもりでした。ずっと動作していたことがわかりますが、一致は正確です。したがって、 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>
60
nurieta

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

私は潜在的なクエリ文字列を扱っているため、アドバイスの1つとして、アプリを単に開くかアプリの特定の場所に送信するかを判断するために、.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);
10
user2004796