android - Firebase 是否可以从 Android 应用程序的 html 页面注销?
问题描述
使用 Firebase 身份验证,当用户通过身份验证时,他们会被带到活动中,我从WebView 中htmlPages
加载 Url 。android_asset
我有两个 html 页面。index.html
和profile.html
。有没有办法在页面中显示经过身份验证的用户配置文件并在该 html 页面上profile.html
设置按钮?Sign Out
工作流程如下:
- 从
SignIn
活动开始,成功认证后,htmlPages
活动开始。 htmlPages
活动profile.html
在其 WebView 组件内打开页面。- 在
profile.html
页面中,有一个Sign Out
按钮和一个字段,显示登录用户的电子邮件地址。 - 单击页面
Sign Out
按钮时profile.html
,用户退出,htmlPages
活动结束,SignIn
活动开始。
我真的很好奇有没有办法在 html 页面中实现这样的功能。
假设这是我的htmlPages
活动:
public class htmlPages extends Activity implements AdvancedWebView.Listener {
private AdvancedWebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.html_pages);
mWebView = (AdvancedWebView) findViewById(R.id.webview);
mWebView.setListener(this, this);
mWebView.setGeolocationEnabled(false);
mWebView.setMixedContentAllowed(true);
mWebView.setCookiesEnabled(true);
mWebView.setThirdPartyCookiesEnabled(true);
mWebView.loadUrl("file:///android_asset/home.html");
}
}
这是我的profile.html
:
<!DOCTYPE html>
<head>
<title>Profile</title>
</head>
<body>
Your email address is: <!-- User email address-->
<button type="button">Sign Out</button>
</body>
</html>
解决方案
是的,我们可以做到,这很简单,我们必须为 web 视图编写自己的 javascript 接口,如下所示,并将其放在包含 web 视图的活动类下
inner class JSInterface(context: Context) {
@JavascriptInterface
fun performLogoutButtonClick() {
Log.d("SSB Log", "Logout button clicked")
// Perform logout action here
}
}
然后我们如下向 web 视图添加属性并加载 html 页面
fun loadWebViewWithButtonClick() {
val htmlString = "<html><body><button type=\"button\", onClick=\"JSInterface.performLogoutButtonClick()\">Logout</button></body></html>"
wvTest.apply {
settings.javaScriptEnabled = true
addJavascriptInterface(JSInterface(context), "JSInterface")
loadData(htmlString, "text/html", "UTF-8")
}
}
在这里,我正在加载具有注销按钮的 html 字符串,并且正在调用我们的 javascript 界面的 performLogoutButtonClick() (您的活动中的代码,因此您可以轻松地从 firebase 注销用户)
因此,htmlPages
活动将是:
public class htmlPages extends Activity implements AdvancedWebView.Listener {
private AdvancedWebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.html_pages);
mWebView = (AdvancedWebView) findViewById(R.id.webview);
mWebView.setListener(this, this);
mWebView.setGeolocationEnabled(false);
mWebView.setMixedContentAllowed(true);
mWebView.setCookiesEnabled(true);
mWebView.setThirdPartyCookiesEnabled(true);
mWebView.loadUrl("file:///android_asset/profile.html");
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(this), "JSInterface");
}
private class JSInterface {
JSInterface(Context context) {
}
@JavascriptInterface
public void performLogoutButtonClick() {
Log.d("SSB Log", "Logout button clicked");
}
}
}
而且profile.html
是:
<!DOCTYPE html>
<head>
<title>Profile</title>
</head>
<body>
Your email address is: <!-- User email address-->
<button type="button", onClick="JSInterface.performLogoutButtonClick()">Sign Out</button>
</body>
</html>
推荐阅读
- mysql - MySQL优化几何查询
- shell - 当我在 docker 容器中执行 shell 脚本时,错误是“没有这样的文件或目录”
- gridview - 如何在 yii2 中将复选框列添加到现有的 gridview 列?
- biztalk - 用于词汇表的 BizTalk BRE 实用程序
- javascript - getImageData() 数组在角度 5 中返回全 0
- angular - 如何防止为 prod 编译调试代码
- json - 在 Swift 中解码 Codable
- json - 如何使用 React JS + Redux 使用 JSON API 映射对象而不是数组
- docker - Jenkins 中来自 docker.push 的 UnsatisfiedLinkError 和 JNLP4-connect 问题
- java - Android appcompat-v7 库无法识别