在 webView 中调用 Android 从 JavaScript 分享意图
Call Android share intent from JavaScript in webView
我正在尝试使用本文的代码从 webView 中的 JavaScript 启动我的 Android 应用程序 (kotlin) 的共享意图。这是我用来启动的代码:
class MainActivity : AppCompatActivity() { object AndroidJSInterface {
@JavascriptInterface
fun onClicked() {
Log.d("HelpButton", "Help button clicked")
}
} override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) val webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
loadJs(view)
}
} val webView = WebView(this)
webView.webViewClient = webViewClient
webView.settings.javaScriptEnabled = true
webView.addJavascriptInterface(AndroidJSInterface, "Android") setContentView(webView)
webView.loadUrl("https://vuetifyjs.com/en/getting-started/quick-start")
} private fun loadJs(webView: WebView) {
webView.loadUrl(
"""javascript:(function f() {
var btns = document.getElementsByTagName('button');
for (var i = 0, n = btns.length; i < n; i++) {
if (btns[i].getAttribute('aria-label') === 'Support') {
btns[i].setAttribute('onclick', 'Android.onClicked()');
}
}
})()"""
)
}
}
我修改了 AndroidJSInterface 中的函数,如下所示:
@JavascriptInterface
fun shareUrl(url: String? = "") {
Log.d("JavaScript", "shareUrl: " + url)
if( !url.isNullOrEmpty() )
{
val intent= Intent()
intent.action=Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_TEXT, url)
intent.type="text/plain"
startActivity(Intent.createChooser(intent, "Share To:"))
}
}
我遇到的问题是 startActivity 在此处无法识别(我收到“未解决的参考:startActivity”)。如何从我的这部分代码访问 startActivity?
感谢您的帮助,
克里斯托夫
public abstract void startActivity(@RequiresPermission Intent intent);
此方法最初在 Context
class 中可用,然后在 Activity
和 ContextWrapper
中可用,因为它们是 Context
class 的子级.
AndroidJSInterface
是一个简单对象,不是 Context
的直接或间接子对象,因此 startActivity
在该块中无法识别,因为 this
在该方法中引用AndroidJSInterface
类型的 instance
不是 Context
的子类型。
所以要参考shareUrl
方法中MainActivity
的this
或者instance
你可以做到
在 Kotlin 中
this@MainActivity.startActivity(Intent.createChooser(intent, "Share To:"))
或在Java
MainActivity.this.startActivity(Intent.createChooser(intent, "Share To:"));
我找到了一个解决方案,虽然我不明白为什么会这样:
我替换了:
@JavascriptInterface
fun shareUrl(url: String? = "") {
Log.d("JavaScript", "shareUrl: " + url)
if( !url.isNullOrEmpty() )
{
val intent= Intent()
intent.action=Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_TEXT, url)
intent.type="text/plain"
startActivity(Intent.createChooser(intent, "Share To:"))
}
}
作者:
private inner class JavascriptInterface
{
@android.webkit.JavascriptInterface
fun shareUrl(url: String? = "") {
Log.d("JavaScript", "shareUrl: " + url)
// TODO: debug startActivity to launch Android sharing screen
if( !url.isNullOrEmpty() )
{
val intent= Intent()
intent.action=Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_TEXT, url)
intent.type="text/plain"
this@WebActivity.startActivity(Intent.createChooser(intent, "Share To:"))
}
}
}
我正在尝试使用本文的代码从 webView 中的 JavaScript 启动我的 Android 应用程序 (kotlin) 的共享意图。这是我用来启动的代码:
class MainActivity : AppCompatActivity() { object AndroidJSInterface {
@JavascriptInterface
fun onClicked() {
Log.d("HelpButton", "Help button clicked")
}
} override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) val webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
loadJs(view)
}
} val webView = WebView(this)
webView.webViewClient = webViewClient
webView.settings.javaScriptEnabled = true
webView.addJavascriptInterface(AndroidJSInterface, "Android") setContentView(webView)
webView.loadUrl("https://vuetifyjs.com/en/getting-started/quick-start")
} private fun loadJs(webView: WebView) {
webView.loadUrl(
"""javascript:(function f() {
var btns = document.getElementsByTagName('button');
for (var i = 0, n = btns.length; i < n; i++) {
if (btns[i].getAttribute('aria-label') === 'Support') {
btns[i].setAttribute('onclick', 'Android.onClicked()');
}
}
})()"""
)
}
}
我修改了 AndroidJSInterface 中的函数,如下所示:
@JavascriptInterface
fun shareUrl(url: String? = "") {
Log.d("JavaScript", "shareUrl: " + url)
if( !url.isNullOrEmpty() )
{
val intent= Intent()
intent.action=Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_TEXT, url)
intent.type="text/plain"
startActivity(Intent.createChooser(intent, "Share To:"))
}
}
我遇到的问题是 startActivity 在此处无法识别(我收到“未解决的参考:startActivity”)。如何从我的这部分代码访问 startActivity?
感谢您的帮助,
克里斯托夫
public abstract void startActivity(@RequiresPermission Intent intent);
此方法最初在 Context
class 中可用,然后在 Activity
和 ContextWrapper
中可用,因为它们是 Context
class 的子级.
AndroidJSInterface
是一个简单对象,不是 Context
的直接或间接子对象,因此 startActivity
在该块中无法识别,因为 this
在该方法中引用AndroidJSInterface
类型的 instance
不是 Context
的子类型。
所以要参考shareUrl
方法中MainActivity
的this
或者instance
你可以做到 在 Kotlin 中
this@MainActivity.startActivity(Intent.createChooser(intent, "Share To:"))
或在Java
MainActivity.this.startActivity(Intent.createChooser(intent, "Share To:"));
我找到了一个解决方案,虽然我不明白为什么会这样:
我替换了:
@JavascriptInterface
fun shareUrl(url: String? = "") {
Log.d("JavaScript", "shareUrl: " + url)
if( !url.isNullOrEmpty() )
{
val intent= Intent()
intent.action=Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_TEXT, url)
intent.type="text/plain"
startActivity(Intent.createChooser(intent, "Share To:"))
}
}
作者:
private inner class JavascriptInterface
{
@android.webkit.JavascriptInterface
fun shareUrl(url: String? = "") {
Log.d("JavaScript", "shareUrl: " + url)
// TODO: debug startActivity to launch Android sharing screen
if( !url.isNullOrEmpty() )
{
val intent= Intent()
intent.action=Intent.ACTION_SEND
intent.putExtra(Intent.EXTRA_TEXT, url)
intent.type="text/plain"
this@WebActivity.startActivity(Intent.createChooser(intent, "Share To:"))
}
}
}