【问题标题】:Call Android share intent from JavaScript in webView在 webView 中从 JavaScript 调用 Android 共享意图
【发布时间】:2021-01-16 04:47:16
【问题描述】:

我正在尝试使用本文的代码从 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?

感谢您的帮助,

克里斯托夫

【问题讨论】:

    标签: javascript android kotlin webview share-intent


    【解决方案1】:
    public abstract void startActivity(@RequiresPermission Intent intent);
    

    此方法最初在 Context 类中可用,然后在 ActivityContextWrapper 中可用,因为它们是 Context 类的子类。

    AndroidJSInterface 是一个简单的对象,不是Context 的直接或间接子对象,因此在该块中无法识别startActivity,因为该方法中的this 指的是AndroidJSInterface 类型的instance这不是Context 的孩子。 所以要参考shareUrl方法中MainActivitythisinstance

    你可以这样做 在科特林中

    this@MainActivity.startActivity(Intent.createChooser(intent, "Share To:"))
    

    或在 Java 中

    MainActivity.this.startActivity(Intent.createChooser(intent, "Share To:"));
    

    【讨论】:

    • 我使用Javascript接口的Activity叫做WebActivity。所以我尝试了'this@WebActivity.startActivity(Intent.createChooser(intent, "Share To:"))' 但我得到了这个错误:未解决的参考:@WebActivity
    • 你能把那个 sn-p 添加到你的问题中
    • 我找到了我在下面发布的解决方案 - 感谢您的回答,它促使我寻找 this@WebActivity 最初没有按预期工作的原因。
    【解决方案2】:

    我找到了一个解决方案,虽然我不明白为什么会这样:

    我换了:

    @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:"))
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      相关资源
      最近更新 更多