web-dev-qa-db-ja.com

カスタムURIがクリックされたときにマイアクティビティを起動するインテントフィルター

アプリで開くためのURIの登録を許可しようとしています。 BlackberryのPatternRepositoryやiPhoneのCFBundleURLName/CFBundleURLSchemesと同様です。 Androidで同じ結果を得るにはどうすればよいですか?

システムは次のリンクを含むメールを送信します:myapp://myapp.mycompany.com/index/customerId/12345。アイデアは、ユーザーがリンクをクリックしてアプリケーションの顧客アクティビティを開くことができるようにする必要があるということです。

他のSO投稿からの提案を数多く試しましたが、OSにパターンを認識させてアプリを開くことができません。

Gmailアプリでは次のようになります:myapp:// myapp.mycompany.com/index/customerId/12345 。リンクのmyapp.mycompany.com/index/customerId/12345部分を認識して下線を引き、ブラウザで開きます。 myapp://の部分はlinkifiedではありません。

標準メールアプリケーションは、リンク全体をプレーンテキストとして扱います。

ここで何が欠けていますか?

PS:私はすでに Androidに独自のURIスキームを実装する方法プログラムにアクセスするためのURL名前空間(myapp://app.start/)を登録する方法)を見てきましたAndroid OS? のブラウザでURLを呼び出す

マニフェスト:

<manifest
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:versionCode="2"
    Android:versionName="0.0.8" 
    package="com.mycompany.myapp.client.Android">

    <uses-sdk 
        Android:minSdkVersion="7" 
        Android:targetSdkVersion="7"/>

    <uses-permission Android:name="Android.permission.INTERNET"/>
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission Android:name="Android.permission.READ_PHONE_STATE"/>

    <application 
        Android:label="@string/app_name" 
        Android:name="myappApplication" 
        Android:icon="@drawable/ic_icon_myapp" 
        Android:debuggable="true">

        <activity 
            Android:label="My App" 
            Android:name=".gui.activity.LoginActivity" 
            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=".gui.activity.CustomerDetailActivity" > 
            <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="myapp"/> 
            </intent-filter> 
        </activity>

        <activity Android:name=".gui.activity.CustomerDetailActivity"/>
        <activity Android:name=".gui.activity.CustomerImageViewerActivity" />
        <activity Android:name=".gui.activity.CustomerListActivity" Android:configChanges="orientation|keyboardHidden"/>
        <activity Android:name=".gui.activity.HomeActivity" Android:configChanges="orientation|keyboardHidden"/>
        <activity Android:name=".gui.activity.AboutActivity" Android:configChanges="orientation|keyboardHidden"/>
        <activity Android:name=".gui.activity.AccountActivity" Android:configChanges="orientation|keyboardHidden" />  
    </application>
</manifest>
23
tuxGurl

最終的な解決策は、すべての拠点をカバーするハックな回避策でした。メールには、アプリで開くように登録されている拡張子が付いた添付ファイルも含まれています。

マニフェスト:

        <activity Android:name=".gui.activity.CustomerDetailActivity" > 
        <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="https"
                 Android:Host="myapp.mycompany.com" /> 
        </intent-filter> 
        <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="myapp"
                 Android:Host="myapp.mycompany.com" /> 
        </intent-filter> 
        <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />
            <action Android:name="Android.intent.action.EDIT" />
            <action Android:name="Android.intent.action.PICK" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />
            <data Android:mimeType="application/myapp" />
        </intent-filter>
    </activity>
13
tuxGurl

GoogleカレンダーでOAuthに取り組んでいたとき、コールバックを受信するアクティビティにこのフィルターを追加する必要がありました:

<intent-filter>
<action Android:name="Android.intent.action.VIEW"></action>
<category Android:name="Android.intent.category.DEFAULT"></category>
<category Android:name="Android.intent.category.BROWSABLE"></category>
<data Android:scheme="yourapp" Android:Host="goog"></data>
</intent-filter>

ブラウザがyourapp://goog URLを呼び出すと、私のアクティビティに戻ります。

6
BigFwoosh

302リダイレクトで標準HTTP URLを使用することにより、GMailが非標準プロトコルをリンクしない問題を回避できます。 WebサイトのWebサーバーまたはアプリケーションサーバーに設定するか、クイックでダーティなテストを行うために http://bit.ly のようなURL短縮ツールを使用できます。

4
Michael Nutt

これが私の解決策です。ありがとう@DanO

<intent-filter>
        <data Android:scheme="yourcustomname"/>
        <data Android:Host="*"/>
                <action Android:name="Android.intent.action.VIEW" />
                <category Android:name="Android.intent.category.DEFAULT" />
                <category Android:name="Android.intent.category.BROWSABLE" />
  </intent-filter>
1
emily

インテントフィルターにカテゴリを追加して乾燥させましたか。

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

私もこれに遭遇しましたが、標準のhttp:スキームのURLです。 Gmailがインテントにカテゴリを追加していないようです。次に、BROWSABLEをチェックしますが、!intent.hasCategories()のチェックも含めて、それも通過できるようにします。

0
dangVarmit

HTMLを使用してメールを送信してから、<a>タグを付けてURLを作成します。おそらく Linkify クラスを使用しているため、GmailまたはMailがテキストを解析する方法を変更する方法はないと思います。

別のオプションは、http://を使用してから、特定のカスタムサブドメインを解析することです。これにより、ユーザーはブラウザーまたはアプリケーションで開くオプションを利用できます。

0
DanO