Commit 7d66088f authored by wanglei's avatar wanglei

...

parent 6ee147a1
......@@ -15,7 +15,6 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
......@@ -25,7 +24,6 @@
</intent>
</queries>
<application
android:name=".MyApplication"
android:allowBackup="true"
......@@ -39,6 +37,9 @@
android:theme="@style/Theme.BrowserWhite"
android:usesCleartextTraffic="true"
tools:targetApi="34">
<activity
android:name=".ui.activity.scanqrc.QrcResultActivity"
android:exported="false" />
<activity
android:name=".ui.activity.appprocess.AppProcessActivity"
android:exported="false" />
......
......@@ -2,6 +2,7 @@ package com.base.browserwhite.help
import android.os.Build
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.bean.ConstObject.ifAgreePrivacy
import com.base.browserwhite.help.ReportUtils.doPost
import com.base.browserwhite.utils.AppPreferences
import com.base.browserwhite.utils.LogEx
......@@ -17,6 +18,10 @@ object EventUtils {
isSingleEvent: Boolean = false
) {
if (!ifAgreePrivacy) {
return
}
if (isSingleEvent) {
val stringSet = AppPreferences.getInstance().getStringSet("singleEvent", setOf())
if (stringSet.contains(key)) {
......@@ -48,7 +53,8 @@ object EventUtils {
.put("data", s)
.put("bp", s2)
.toString()
LogEx.logDebug(TAG, "data=${AppPreferences.getInstance().getString("uuid", "")}")
LogEx.logDebug(TAG, "uuid=${AppPreferences.getInstance().getString("uuid", "")}")
LogEx.logDebug(TAG, "gid=${AppPreferences.getInstance().getString("gid", "")}")
paramJson = AESHelper.encrypt(data)
} catch (e: JSONException) {
paramJson = ""
......
......@@ -2,18 +2,14 @@ package com.base.browserwhite.ui.activity.scanqrc
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.widget.Toast
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import com.base.browserwhite.ui.fragment.HomeFragment.Companion.isMatchesUrl
import com.base.browserwhite.utils.LogEx
import com.google.mlkit.vision.barcode.BarcodeScannerOptions
import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.barcode.common.Barcode.FORMAT_AZTEC
import com.google.mlkit.vision.barcode.common.Barcode.FORMAT_CODABAR
import com.google.mlkit.vision.common.InputImage
......@@ -22,7 +18,7 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
private val TAG = "QRImageAnalyzer"
var action: ((qrCodeValue: String) -> Unit)? = null
var parseAction: ((qrCodeValue: String, valueType: Int) -> Unit)? = null
//如需仅检测 Aztec 码和 QR 码
private val options = BarcodeScannerOptions.Builder().setBarcodeFormats(
......@@ -55,25 +51,21 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
}
}
private fun handleBarcodeList(barcodeList: List<Barcode>) {
private fun handleBarcodeList(
barcodeList: List<Barcode>,
) {
if (barcodeList.size == 1) {
val barcode = barcodeList[0]
val valueType = barcode.valueType
val qrCodeValue = barcode.rawValue ?: ""
// Barcode.FORMAT_QR_CODE, FORMAT_CODABAR, FORMAT_AZTEC, TYPE_TEXT
LogEx.logDebug(TAG, "valueType=$valueType")
when (valueType) {
Barcode.FORMAT_QR_CODE, FORMAT_CODABAR, FORMAT_AZTEC -> {
val qrCodeValue = barcode.rawValue ?: ""
LogEx.logDebug(TAG, "qrCodeValue=${qrCodeValue}")
if (isMatchesUrl(qrCodeValue) or qrCodeValue.startsWith("http") or qrCodeValue.startsWith("https")) {
action?.invoke(qrCodeValue)
}
}
}
parseAction?.invoke(qrCodeValue, valueType)
}
}
fun processImage( bitmap: Bitmap) {
fun processImage(context: Context, bitmap: Bitmap) {
val image = InputImage.fromBitmap(bitmap, 0)
val barcodeScanner = BarcodeScanning.getClient(options)
......@@ -83,7 +75,8 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
}
.addOnFailureListener { exception ->
// 处理失败情况
LogEx.logDebug(TAG,"$exception")
// LogEx.logDebug(TAG,"$exception")
Toast.makeText(context, "Unable to parse QR code", Toast.LENGTH_SHORT).show()
}
}
}
\ No newline at end of file
package com.base.browserwhite.ui.activity.scanqrc
import android.graphics.Color
import androidx.core.view.updatePadding
import com.base.browserwhite.databinding.ActivityQrcResultBinding
import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.utils.BarUtils
class QrcResultActivity : BaseActivity<ActivityQrcResultBinding>() {
override val binding: ActivityQrcResultBinding by lazy {
ActivityQrcResultBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
}
}
\ No newline at end of file
......@@ -3,14 +3,17 @@ package com.base.browserwhite.ui.activity.scanqrc
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.graphics.Color
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager
import android.net.Uri
import androidx.activity.addCallback
import androidx.camera.core.AspectRatio
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
import androidx.camera.core.CameraX
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
......@@ -19,7 +22,6 @@ import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import com.base.browserwhite.databinding.ActivityScanQrcBinding
import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import com.base.browserwhite.ui.views.DialogViews.showGerPermission
import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.LogEx
......@@ -101,7 +103,22 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
}
binding.ivShoudian.isSelected = !binding.ivShoudian.isSelected
}
binding.ivPhoto.setOnClickListener { }
binding.ivPhoto.setOnClickListener {
val safIntent = Intent(Intent.ACTION_OPEN_DOCUMENT)
safIntent.addCategory(Intent.CATEGORY_OPENABLE)
safIntent.setType("image/*")
launcher.launch(safIntent) {
LogEx.logDebug(TAG, "${it.resultCode}")
val dataIntent = it.data
if (it.resultCode == RESULT_OK && dataIntent != null) {
val uri: Uri = dataIntent.data ?: Uri.EMPTY
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri))
qrImageAnalyzer.processImage(this@ScanQRCActivity, bitmap)
}
}
}
}
private fun initCamera() {
......@@ -138,13 +155,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
//构建图片捕捉类
// imageCapture = buildImageCapture(aspectRation, rotation)
qrImageAnalyzer = QRImageAnalyzer()
qrImageAnalyzer.action = { qrCodeValue ->
binding.root.post {
startActivity(Intent(this@ScanQRCActivity, WebBrowserActivity::class.java).apply {
putExtra("url", qrCodeValue)
})
finish()
}
qrImageAnalyzer.parseAction = { qrCodeValue, valueType ->
// startActivity(Intent(this))
}
//构建图片分析器
......@@ -208,6 +220,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
override fun onDestroy() {
super.onDestroy()
cameraExecutor.shutdown()
imageAnalyzer?.clearAnalyzer()
cameraProvider?.unbindAll()
}
companion object {
......@@ -218,31 +232,33 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
private fun openFlash() {
val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
cameraManager.setTorchMode(getBackCameraId(), true)
// val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
// cameraManager.setTorchMode(getBackCameraId(), true)
camera?.cameraControl?.enableTorch(true)
}
private fun closeFlash() {
val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
cameraManager.setTorchMode(getBackCameraId(), false)
// val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
// cameraManager.setTorchMode(getBackCameraId(), false)
camera?.cameraControl?.enableTorch(false)
}
private fun getBackCameraId(): String {
var cameraId: String? = null
try {
val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
for (id in cameraManager.cameraIdList) {
val characteristics: CameraCharacteristics = cameraManager.getCameraCharacteristics(id)
if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) {
cameraId = id
break
}
}
} catch (e: CameraAccessException) {
e.printStackTrace()
}
return cameraId ?: ""
}
// private fun getBackCameraId(): String {
// var cameraId: String? = null
// try {
// val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
// for (id in cameraManager.cameraIdList) {
// val characteristics: CameraCharacteristics = cameraManager.getCameraCharacteristics(id)
// if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) {
// cameraId = id
// break
// }
// }
// } catch (e: CameraAccessException) {
// e.printStackTrace()
// }
// return cameraId ?: ""
// }
}
\ No newline at end of file
......@@ -61,7 +61,7 @@ class WebsiteAdapter(val uiType: Int = 0, val click: (bean: WebSiteBean) -> Unit
binding.ivIcon.visibility = View.VISIBLE
binding.ivAdd.visibility = View.GONE
val bordIconName = arrayOf("Ebay", "Bing", "Wikipedia", "Pinterest", "NBC News", "Shopee", "Drugs")
LogEx.logDebug(TAG, bean.name)
// LogEx.logDebug(TAG, bean.name)
if (bordIconName.contains(bean.name)) {
binding.ivIcon.borderColor = ContextCompat.getColor(context, R.color.color_cbcdd7)
binding.ivIcon.borderWidth = 1
......
......@@ -3,6 +3,7 @@ package com.base.browserwhite.ui.fragment
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Intent
import android.text.TextUtils
import android.view.KeyEvent
import android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import android.widget.TextView
......@@ -272,8 +273,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
if (actionId == IME_ACTION_DONE) {
val content = v?.text.toString()
LinkMatchUtils.handleInput(requireContext(),
if (TextUtils.isEmpty(content)) {
Toast.makeText(context, "input something please", Toast.LENGTH_SHORT).show()
return true
}
LinkMatchUtils.handleInput(
content,
loadUrl = { url ->
requireActivity().startActivity(Intent(requireContext(), WebBrowserActivity::class.java).apply {
......@@ -282,7 +286,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
})
},
performSearch = { url ->
searchAction.invoke(url)
val searchUrl = searchAction.invoke(url)
requireActivity().startActivity(Intent(requireContext(), WebBrowserActivity::class.java).apply {
putExtra("searchEngine", searchEngine)
putExtra("url", searchUrl)
})
})
return true; // 返回true表示事件已处理
......
package com.base.browserwhite.utils
import android.content.Context
import android.text.TextUtils
import android.widget.Toast
object LinkMatchUtils {
fun handleInput(
context: Context,
input: String,
loadUrl: (url: String) -> Unit,
performSearch: (search: String) -> Unit
) {
var tempInput = input
if (TextUtils.isEmpty(input)) {
Toast.makeText(context, "input something please", Toast.LENGTH_SHORT).show()
return
}
// 去除输入字符串两端的空白字符
tempInput = input.trim { it <= ' ' }
val tempInput = input.trim { it <= ' ' }
// 检查输入是否看起来像是一个网址
if (isLikelyUrl(tempInput)) {
// 补齐协议并加载网址
val formattedUrl = addProtocolIfNeeded(tempInput)
loadUrl(formattedUrl);
loadUrl(formattedUrl)
} else {
// 作为搜索关键词处理
performSearch(input);
performSearch(input)
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.scanqrc.QrcResultActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment