アプリで開くための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>
最終的な解決策は、すべての拠点をカバーするハックな回避策でした。メールには、アプリで開くように登録されている拡張子が付いた添付ファイルも含まれています。
マニフェスト:
<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>
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を呼び出すと、私のアクティビティに戻ります。
302リダイレクトで標準HTTP URLを使用することにより、GMailが非標準プロトコルをリンクしない問題を回避できます。 WebサイトのWebサーバーまたはアプリケーションサーバーに設定するか、クイックでダーティなテストを行うために http://bit.ly のようなURL短縮ツールを使用できます。
これが私の解決策です。ありがとう@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>
インテントフィルターにカテゴリを追加して乾燥させましたか。
<category Android:name="Android.intent.category.BROWSABLE" />
私もこれに遭遇しましたが、標準のhttp:スキームのURLです。 Gmailがインテントにカテゴリを追加していないようです。次に、BROWSABLEをチェックしますが、!intent.hasCategories()のチェックも含めて、それも通過できるようにします。
HTMLを使用してメールを送信してから、<a>
タグを付けてURLを作成します。おそらく Linkify
クラスを使用しているため、GmailまたはMailがテキストを解析する方法を変更する方法はないと思います。
別のオプションは、http://を使用してから、特定のカスタムサブドメインを解析することです。これにより、ユーザーはブラウザーまたはアプリケーションで開くオプションを利用できます。