我有一个带有一个全屏 web 视图的简单应用程序。现在,当我单击某些网站上的按钮(上传文件时的 Google Docs,将文件附加到信件时的邮件等)建议选择下载文件的应用程序(图库、资源管理器等)时,什么都没有发生,例如这里:
我想让它们像在移动浏览器中一样工作,当您单击任何网站上的附加按钮时,显然会触发 Inplicit Intent,提示您选择适当的应用程序。
我从我发现的那些中大量指定了一堆 Permissons,但没有任何效果:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA"/>
请告诉我,如何实现这一点,我什至不知道用哪种方式挖掘,在哪里以及如何规定它。
该项目由两个文件组成:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
if (savedInstanceState != null) {
// Restore the previous URL and history stack
binding.webView.restoreState(savedInstanceState);
}
val myWebViewClient = MyWebViewClient(this)
binding.webView.settings.javaScriptEnabled = true
val currentUrl = myWebViewClient.sharedPref.getString(URL, "https://www.google.ru")
Log.d(tag, "sharedPref value: ${myWebViewClient.sharedPref.getString(URL, "")}")
if (currentUrl != null) {
binding.webView.loadUrl(currentUrl)
}
binding.webView.webViewClient = myWebViewClient
}
override fun onBackPressed() {
binding.webView.apply {
if (canGoBack()) {
goBack()
} else {
onBackPressed()
}
}
}
}
MyWebViewClient 类:
val tag = "CUSTOMTAG"
val SHARED_PREFS = "sharedPrefs"
val URL = "URL"
class MyWebViewClient(val context: Context) : WebViewClient() {
val sharedPref = context.getSharedPreferences(
SHARED_PREFS,
AppCompatActivity.MODE_PRIVATE
)
override fun shouldOverrideUrlLoading(view: WebView?, url: String): Boolean {
view?.let {
it.loadUrl(url)
}
return false
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
with(sharedPref.edit()) {
putString(URL, url)
apply()
}
if (url != null) {
sharedPref.getString(URL, "")?.let { Log.d(tag, "sharedPref: $it") }
}
}
}

这是使用 WebChromeClient 完成的,您需要在其中覆盖几个方法 onShowFileChooser 和 openFileChooser,如下所示:
在 onActivityResult 中,调用回调:
旧版本的 android 存在问题,因为它们有 onShowFileChooser 方法的重载变体