web-dev-qa-db-ja.com

Android Deep Linking issue!カスタムURLスキームmyapp:// some_dataの使用方法

私は試しました link1link2linklink4link5 、- link6

DeepLinking について説明したすべてがここにあります

私が欲しいのは、カスタムuri myapp:// some_dataで、アプリケーションを初期化するためにsome_dataを必要とするデバイスにインストールされているネイティブアプリケーションを開きます。

カスタムURLをクリックできるシナリオは2つあります。

1)SMSアプリ内から、ユーザーがリンクをタップすると、自動的にインストールされているアプリを開く必要があります。そうでない場合は、アプリがホストされているgoogleplayストアを開きます

2)電子メールメッセージの本文内から。

上記のリンクをすべて試してみましたが、どれもうまくいきません。スキームの部分に大きな問題があります。

これが私のAndroidManifest.xmlです

<?xml version="1.0" encoding="utf-8"?>
<uses-sdk
    Android:minSdkVersion="8"
    Android:targetSdkVersion="18" />

<application
    Android:allowBackup="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    <activity
        Android:name="MainActivity"
        Android:label="@string/app_name"
         Android:exported="true" >
        <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />

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

            <data Android:scheme="inderbagga" />
        </intent-filter>
    </activity>
</application>

そして、これがMainActivity.Javaです

TextView tvText=(TextView)findViewById(R.id.tvid);

    if (getIntent().getAction() == Intent.ACTION_VIEW&&getIntent().getScheme().equals("inderbagga")) {
        Toast.makeText(getApplicationContext(), ""+getIntent().getScheme(), Toast.LENGTH_SHORT).show();
        Uri uri = getIntent().getData();
        // do stuff with uri
        tvText.setText(uri.toString());
    }
    else tvText.setText("NULL");

具体的には、smsアプリケーションまたはgmail/yahoomailメールメッセージ本文から、inderbagga:// a1b22c333タイプのURLがクリックされたときにネイティブアプリケーションを開きます。

同じことを実現するために、インテントフィルターを使用してスキームを設定しました。およびgetIntent()を使用して、MainActivityのa1b22c333に等しいデータを読み取ります。

24
inderbagga

リンクをクリックすると、このコードが機能します

          <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="http"
      Android:Host="domain.com(google.com)"Android:pathPrefix="/wp/poc1/(sufexes)" />

    </intent-filter>

uRLデータを取得する

        //get uri data
     Uri data = getIntent().getData();
     //get schma
     String scheme = data.getScheme(); // "http"
     //get server name
     String Host = data.getHost(); // Ipaddress or domain name
    //get parameter
     String urltextboxname=data.getQueryParameter("name");
     //set value in textview
     name.setText(urltextboxname);
16
prakash

具体的には、smsアプリケーションまたはgmail/yahoomailメールメッセージ本文から、inderbagga:// a1b22c333タイプのURLがクリックされたときにネイティブアプリケーションを開きます。

Androidで利用できるSMSとメールアプリケーションが多数あります。正確には、inderbagga://a1b22c333クリック可能なエントリに。これらすべてのアプリのリストを作成し、各開発チームに連絡して、追加するよう依頼することができます。

または、アプリに特定のhttp://代わりにURL。ユーザーにはセレクターが表示されますが、アプリまたはWebブラウザーでそのURLを表示するには、少なくともクリック可能です。

9
CommonsWare

また、ディープリンクの宣言と必要なパラメーターの抽出を容易にするこのライブラリを試してみることもできます。

https://github.com/airbnb/DeepLinkDispatch

これにより、自分で構文解析を行うことなく、関心のあるURIと注釈を通じて抽出したいパラメータを宣言できます。

2
Christian

あなたが抱えている問題は、メールとSMSクライアントがURIスキームとパスを正しく解析していないことです。ほとんどの場合、URIスキームに直接入力することはできません。アプリがインストールされていない場合は、ユーザーに優れたエクスペリエンスを提供するために、Playストアにフォールバックする必要があります。

これを行うには、クライアント側のJSでURIスキームを呼び出す必要があります。簡単なWebホストをセットアップして、次のスクリプトを使用できます。

<script type="text/javascript">
    window.onload = function() {
        var method = 'iframe';
        var fallbackFunction = function() {
            if (method == 'iframe') {
                window.location = "market://details?id=your.package.name";
            }
        };
        var addIFrame = function() {
            var iframe = document.createElement("iframe");
            iframe.style.border = "none";
            iframe.style.width = "1px";
            iframe.style.height = "1px";
            iframe.src = "inderbagga://a1b22c333";
            document.body.appendChild(iframe);
        };
        var loadChromeIntent = function() {
            method = 'intent';
            document.location = "intent://a1b22c333#Intent;scheme= inderbagga;package=your.package.name;end";
        };
        if (navigator.userAgent.match(/Chrome/) && !navigator.userAgent.match("Version/")) {
            loadChromeIntent();
        }
        else if (navigator.userAgent.match(/Firefox/)) {
            window.location = "inderbagga://a1b22c333";
        }
        else {
            addIFrame();
        }
        setTimeout(fallbackFunction, 750);
    };
</script>

または、 branch.io のようなサービスを使用して、デスクトップとiOSでの作業に加えて、このクライアント側JSを自動的にアセンブルします。

0
Alex Austin