繁体   English   中英

从 webView 中的 JavaScript 调用 Android 共享意图

[英]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 中修改了 function,如下所示:

    @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 中可用,然后在ActivityContextWrapper中可用,因为它们是Context class 的子级。

AndroidJSInterface是一个简单的 object,不是Context的直接或间接子代,因此startActivity在该块中无法识别,因为this方法中的 this 指的是AndroidJSInterface类型的instance ,它不是Context的子代。 所以要在shareUrl方法中引用this或者MainActivityinstance

您可以在 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:"))
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM