web-dev-qa-db-ja.com

スキームホストが機能していないAndroid Lollipop、リンクをクリックしてアプリを開く

このコードを使用して、リンクからアプリを起動しています。

<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>  

これはhrefリンクです。最後にキーを取得します。

customScheme://customHost/49FYTJTF00

以前のすべてのバージョンのAndroidでは問題なく動作しますが、Lollipopでは動作しません。
リンクをクリックすると、起動するブラウザのリストのみが表示されます。

私は何をすべきか?

16
Salmaan

Pathprefixを使用してください。

   Android:pathPrefix="/"

それはあなたの問題を解決するかもしれません。 Android開発者ガイド URLに従ってください。

6
Ahmad Arslan

編集:

テストとテストの結果、スキーマに大文字が含まれていると、ブラウザがそれを起動できないことがわかりました。スキームには小文字のみを含める必要があります!

また、chromiumプロジェクトのバグ459156でも、URLを直接起動することはできません。このJavaScriptコードを含むWebページをユーザーに参照する必要があります。

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

このページにアクセスしたユーザーには、Activity Chooserダイアログが表示されるか、直接アクティビティに送信されます。

試してみるには、Androidブラウザーを開いて以下のURLに移動し、エディターに上記のスニペットをコピーして貼り付けます: http://www.w3schools.com/html /tryit.asp?filename=tryhtml_intro

アクティビティを開くブラウザとJavaScriptを示すGIF

Gif

元の投稿

私はカスタムURIを試してみましたが、Android 5.0で動作します

ただし、次の2つのバグ/問題に注意する必要があります。

  1. Chromiumプロジェクトのバグ459156 これは、基本的にAndroidブラウザからカスタムスキームを起動することは、URLがJavaScriptを使用して適用されない限り機能しないことを意味します。回避策は、StackOverflowのこの投稿を参照してください: OAuthとカスタムスキームにより、Chromeで「ERR_UNKNOWN_URL_SCHEME」が発生します
  2. Bug 80971:カスタムスキームのURIはSMS Text(Linkify?) ではクリックできません。

私のアプローチ

私は2つの別々のアクティビティを作成しました。1つはインテントレシーバーとして、もう1つはインテントランチャーとしてです。起動アクティビティには、完全なURIを入力できるEditTextと、入力したURIを起動するためのボタンがあります。

Main.Java onClick(起動アクティビティ)

@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(アクティビティのみ)

<data Android:pathPattern=".*"/>部分。この部分は重要なので、ホスト以降はすべて有効として受け入れられます。

<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(受信アクティビティ)

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);
    }
}

スクリーンショット:

Result of sending the custom intent to the UriActivity

テストプロジェクトのダウンロード:

自分で試したくない場合は、プロジェクトの download を作成しました。

21
Rolf ツ

CustomScheme:// customHost/49FYTJTF00へのリンクを使用する代わりに、次のようなリンクを使用してみましたか?

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

Chromeはそれをアプリで問題なく開くことができるはずです。同時に、これはすべてのブラウザーで機能するとは限りません。

2
A J

あなたが書いた:

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

したがって、customScheme://customHostName/49FYTJTF00
の代わりに customScheme://customHost/49FYTJTF00

0
ytRino

Googleからアプリを実行する場合は、Chrome another way で実行する必要があります)ことに注意してください。

0
klimat