点击外部链接,如何打开特定应用的特定活动?

时间:2018-10-04 06:44:56

标签: android android-activity uri

我正在开发一个Android应用程序,用户必须先登录才能使用它的功能。因此,通常用户必须使用提供的用户凭证登录。

但是我不希望用户总是一遍又一遍地输入用户名和密码,这样我才可以与用户共享一个URL,并且如果用户单击电话中任何位置的共享链接(通过邮件,WhatsApp或Facebook,等),电话必须提示选择我的应用程序,并且如果用户名和密码正确,则应用程序应自动提取URL并通过单击登录api将应用程序直接重定向到我的主屏幕。

共享的网址如下所示-http://www.myurl.com/sso?username=Scb56745&password=!l0Aeu0yQazxssx

目前,我已经设法使用AndroidManifest文件中的此代码来提示对话框-

 <activity
         android:name="com.my.par.activities.UserActivity"
         android:label="@string/app_name"
         android:screenOrientation="portrait"
         android:windowSoftInputMode="stateHidden">
         <intent-filter android:autoVerify="true" tools:targetApi="m">
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data
                        android:host="www.myurl.com"
                        android:path="/sso"
                        android:scheme="http" />
                    <data
                        android:host="www.yoururl.com"
                        android:path="/sso1"
                        android:scheme="https" />
         </intent-filter>
 </activity>

我在我的UserAcitivity的getIntent()方法上获得了此单击的URL链接,就像这样-

Uri uri = getIntent().getData();
String path = uri.getPath();
  • 所以我真正的问题是如何分别提取用户名和密码,以便可以通过从此url发送此用户名和密码(例如http://www.myurl.com/sso?username=Scb56745&password=!l0Aeu0yQazxssx)来调用我的登录api。 -完成

  • 如何在AndroidMenifest文件中放置动态URL或主机名,路径和方案? -完成

  • 我们如何才能强制我们的应用始终直接打开该应用(无需显示选择器对话框),因为即使用户单击浏览器也不会使用它,也不会发生任何事情。

快乐编码:-)

2 个答案:

答案 0 :(得分:1)

尝试使用如下代码:

fun getUsernameFromUrl(url: String): String? {
    return Uri.parse(url).getQueryParameter("username")
}
fun getPasswordFromUrl(url: String): String? {
    return Uri.parse(url).getQueryParameter("password")
}

并称呼它

val username = getUsernameFromUrl(path)

更新:

我知道的唯一“动态”添加URL的方式是使用类似这样的东西: https://developer.android.com/studio/build/manifest-build-variables 您可以根据您的构建版本来更改此URL。

正如这里所说的: https://stackoverflow.com/a/43339476/8713068 您不能直接通过代码更新Android Manifest

答案 1 :(得分:1)

Karzel也是对的,但它写在Kotlin中,我相信您期望Java的解决方案,我会在Java中回答同样的问题

Uri uri = getIntent().getData();
String strUsername = "", strPassword = "";
if (uri != null) {
   strUsername = uri.getQueryParameter("username");
   strPassword = uri.getQueryParameter("password");
}
else {
   // Your app will pop up even if http://www.myurl.com/sso is clicked, so better to handle null uri
}

要回答有关动态URL的下一部分,您可以为此设置多个intent-filters

<activity
         android:name="com.my.par.activities.UserActivity"
         android:label="@string/app_name"
         android:screenOrientation="portrait"
         android:windowSoftInputMode="stateHidden">
         <intent-filter android:autoVerify="true" tools:targetApi="m">
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data
                        android:host="www.myurl.com"
                        android:path="/sso"
                        android:scheme="http" />
         </intent-filter>
         <intent-filter android:autoVerify="true" tools:targetApi="m">
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data
                        android:host="www.myurl.com"
                        android:path="/sso"
                        android:scheme="https" />
         </intent-filter>
         <intent-filter android:autoVerify="true" tools:targetApi="m">
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data
                        android:host="www.myurl.com"
                        android:path="/debug"
                        android:scheme="http" />
         </intent-filter>
 </activity>

以此类推。

要通过单击链接直接打开您的应用并且不显示选择器对话框,则必须使用自定义URI,例如:

syn3sthete://myurl.com/sso?username=Scb56745&password=!l0Aeu0yQazxssx

您可以将syn3sthete更改为所需的任何自定义值。 不要忘记为您的自定义URI添加一个intent-filter

<intent-filter android:autoVerify="true" tools:targetApi="m">
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data
                        android:host="myurl.com"
                        android:path="/sso"
                        android:scheme="syn3sthete" />
</intent-filter>