我正在开发一个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或主机名,路径和方案? -完成
我们如何才能强制我们的应用始终直接打开该应用(无需显示选择器对话框),因为即使用户单击浏览器也不会使用它,也不会发生任何事情。
快乐编码:-)
答案 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>