add url input to use user's lobechat mirror

This commit is contained in:
moreoronce 2024-10-05 14:25:31 +08:00
parent 51dd4fccbb
commit 38d2280c93
5 changed files with 106 additions and 19 deletions

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>

View file

@ -64,6 +64,7 @@ dependencies {
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.androidx.appcompat)
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)

View file

@ -21,6 +21,6 @@
<!-- 允许应用访问互联网 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

View file

@ -12,31 +12,39 @@ import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import android.widget.Toast
import android.widget.EditText
import android.widget.Button
import android.view.View
import androidx.appcompat.app.AlertDialog
import android.util.Log
import android.provider.Settings
class MainActivity : AppCompatActivity() {
private lateinit var webView: WebView
private var filePathCallback: ValueCallback<Array<Uri>>? = null
// 用于替代 startActivityForResult 的新文件选择器启动器
private lateinit var fileChooserLauncher: ActivityResultLauncher<Intent>
private lateinit var urlInput: EditText
private lateinit var loadUrlButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 检查并请求读取权限
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1)
}
// 初始化视图组件
webView = findViewById(R.id.webview)
urlInput = findViewById(R.id.urlInput)
loadUrlButton = findViewById(R.id.loadUrlButton)
// 检查并请求存储权限
checkStoragePermission()
// 设置状态栏为透明,使系统自动使用默认的颜色
window.statusBarColor = resources.getColor(android.R.color.transparent, theme)
// 初始化 WebView
webView = findViewById(R.id.webview)
// 启用 JavaScript
// 初始化 WebView 设置
val webSettings: WebSettings = webView.settings
webSettings.javaScriptEnabled = true
webSettings.domStorageEnabled = true
@ -72,17 +80,19 @@ class MainActivity : AppCompatActivity() {
});
""".trimIndent(), null
)
// 隐藏输入框和按钮
urlInput.visibility = View.GONE
loadUrlButton.visibility = View.GONE
}
}
// 设置 WebChromeClient 以处理文件选择
// 设置 WebChromeClient 以处理文件选择和 JavaScript 错误
webView.webChromeClient = object : WebChromeClient() {
override fun onShowFileChooser(
webView: WebView?,
filePathCallback: ValueCallback<Array<Uri>>,
fileChooserParams: FileChooserParams?
): Boolean {
// 处理新的文件选择请求
this@MainActivity.filePathCallback?.onReceiveValue(null)
this@MainActivity.filePathCallback = filePathCallback
@ -94,12 +104,54 @@ class MainActivity : AppCompatActivity() {
fileChooserLauncher.launch(Intent.createChooser(intent, "Select Picture"))
return true
}
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
Log.e("WebViewConsole", "JavaScript Error: ${consoleMessage?.message()} -- From line ${consoleMessage?.lineNumber()} of ${consoleMessage?.sourceId()}")
return true
}
}
// 加载您的网站
webView.loadUrl("https://chat.dolingou.com") // 替换为您的 URL
// 点击按钮后加载用户输入的 URL
loadUrlButton.setOnClickListener {
var url = urlInput.text.toString().trim()
if (url.isNotEmpty()) {
// 确保 URL 包含 http 或 https
if (!url.startsWith("http://") && !url.startsWith("https://")) {
url = "https://$url"
}
// 加载用户输入的 URL
webView.loadUrl(url)
} else {
Toast.makeText(this, "Please enter a valid URL", Toast.LENGTH_SHORT).show()
}
}
}
// 方法:检查存储权限
private fun checkStoragePermission() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
// 显示权限请求解释
AlertDialog.Builder(this)
.setTitle("Permission Required")
.setMessage("This app requires access to your storage to select images. Please grant the permission.")
.setPositiveButton("OK") { _, _ ->
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1)
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.dismiss()
}
.create()
.show()
} else {
// 直接请求权限
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1)
}
}
}
// 处理权限请求结果
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 1) {
@ -107,6 +159,21 @@ class MainActivity : AppCompatActivity() {
Toast.makeText(this, "Read permission granted", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "Read permission denied", Toast.LENGTH_SHORT).show()
// 引导用户前往设置手动开启权限
AlertDialog.Builder(this)
.setTitle("Permission Denied")
.setMessage("Storage permission is required for this app. Please allow it from settings.")
.setPositiveButton("Settings") { _, _ ->
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package", packageName, null)
intent.data = uri
startActivity(intent)
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.dismiss()
}
.create()
.show()
}
}
}

View file

@ -1,11 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/urlInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter your server URL"
android:inputType="textUri"
android:padding="16dp"
android:layout_margin="16dp"
android:layout_alignParentTop="true"/>
<Button
android:id="@+id/loadUrlButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Load URL"
android:layout_below="@id/urlInput"
android:layout_marginTop="8dp"
android:layout_marginStart="16dp"/>
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
android:layout_height="match_parent"
android:layout_below="@id/loadUrlButton"/>
</RelativeLayout>