Commit 7d66088f authored by wanglei's avatar wanglei

...

parent 6ee147a1
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<queries> <queries>
<intent> <intent>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
...@@ -25,7 +24,6 @@ ...@@ -25,7 +24,6 @@
</intent> </intent>
</queries> </queries>
<application <application
android:name=".MyApplication" android:name=".MyApplication"
android:allowBackup="true" android:allowBackup="true"
...@@ -39,6 +37,9 @@ ...@@ -39,6 +37,9 @@
android:theme="@style/Theme.BrowserWhite" android:theme="@style/Theme.BrowserWhite"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:targetApi="34"> tools:targetApi="34">
<activity
android:name=".ui.activity.scanqrc.QrcResultActivity"
android:exported="false" />
<activity <activity
android:name=".ui.activity.appprocess.AppProcessActivity" android:name=".ui.activity.appprocess.AppProcessActivity"
android:exported="false" /> android:exported="false" />
......
...@@ -2,6 +2,7 @@ package com.base.browserwhite.help ...@@ -2,6 +2,7 @@ package com.base.browserwhite.help
import android.os.Build import android.os.Build
import com.base.browserwhite.BuildConfig import com.base.browserwhite.BuildConfig
import com.base.browserwhite.bean.ConstObject.ifAgreePrivacy
import com.base.browserwhite.help.ReportUtils.doPost import com.base.browserwhite.help.ReportUtils.doPost
import com.base.browserwhite.utils.AppPreferences import com.base.browserwhite.utils.AppPreferences
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
...@@ -17,6 +18,10 @@ object EventUtils { ...@@ -17,6 +18,10 @@ object EventUtils {
isSingleEvent: Boolean = false isSingleEvent: Boolean = false
) { ) {
if (!ifAgreePrivacy) {
return
}
if (isSingleEvent) { if (isSingleEvent) {
val stringSet = AppPreferences.getInstance().getStringSet("singleEvent", setOf()) val stringSet = AppPreferences.getInstance().getStringSet("singleEvent", setOf())
if (stringSet.contains(key)) { if (stringSet.contains(key)) {
...@@ -48,7 +53,8 @@ object EventUtils { ...@@ -48,7 +53,8 @@ object EventUtils {
.put("data", s) .put("data", s)
.put("bp", s2) .put("bp", s2)
.toString() .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) paramJson = AESHelper.encrypt(data)
} catch (e: JSONException) { } catch (e: JSONException) {
paramJson = "" paramJson = ""
......
...@@ -2,18 +2,14 @@ package com.base.browserwhite.ui.activity.scanqrc ...@@ -2,18 +2,14 @@ package com.base.browserwhite.ui.activity.scanqrc
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.widget.Toast
import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy 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.base.browserwhite.utils.LogEx
import com.google.mlkit.vision.barcode.BarcodeScannerOptions import com.google.mlkit.vision.barcode.BarcodeScannerOptions
import com.google.mlkit.vision.barcode.BarcodeScanning import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode 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 import com.google.mlkit.vision.common.InputImage
...@@ -22,7 +18,7 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer { ...@@ -22,7 +18,7 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
private val TAG = "QRImageAnalyzer" private val TAG = "QRImageAnalyzer"
var action: ((qrCodeValue: String) -> Unit)? = null var parseAction: ((qrCodeValue: String, valueType: Int) -> Unit)? = null
//如需仅检测 Aztec 码和 QR 码 //如需仅检测 Aztec 码和 QR 码
private val options = BarcodeScannerOptions.Builder().setBarcodeFormats( private val options = BarcodeScannerOptions.Builder().setBarcodeFormats(
...@@ -55,25 +51,21 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer { ...@@ -55,25 +51,21 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
} }
} }
private fun handleBarcodeList(barcodeList: List<Barcode>) { private fun handleBarcodeList(
barcodeList: List<Barcode>,
) {
if (barcodeList.size == 1) { if (barcodeList.size == 1) {
val barcode = barcodeList[0] val barcode = barcodeList[0]
val valueType = barcode.valueType val valueType = barcode.valueType
val qrCodeValue = barcode.rawValue ?: ""
// Barcode.FORMAT_QR_CODE, FORMAT_CODABAR, FORMAT_AZTEC, TYPE_TEXT
LogEx.logDebug(TAG, "valueType=$valueType") LogEx.logDebug(TAG, "valueType=$valueType")
when (valueType) { parseAction?.invoke(qrCodeValue, 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)
}
}
}
} }
} }
fun processImage( bitmap: Bitmap) { fun processImage(context: Context, bitmap: Bitmap) {
val image = InputImage.fromBitmap(bitmap, 0) val image = InputImage.fromBitmap(bitmap, 0)
val barcodeScanner = BarcodeScanning.getClient(options) val barcodeScanner = BarcodeScanning.getClient(options)
...@@ -83,7 +75,8 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer { ...@@ -83,7 +75,8 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
} }
.addOnFailureListener { exception -> .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 ...@@ -3,14 +3,17 @@ package com.base.browserwhite.ui.activity.scanqrc
import android.Manifest import android.Manifest
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.graphics.Color import android.graphics.Color
import android.hardware.camera2.CameraAccessException import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager import android.hardware.camera2.CameraManager
import android.net.Uri
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.camera.core.AspectRatio import androidx.camera.core.AspectRatio
import androidx.camera.core.Camera import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector import androidx.camera.core.CameraSelector
import androidx.camera.core.CameraX
import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageAnalysis
import androidx.camera.core.Preview import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.lifecycle.ProcessCameraProvider
...@@ -19,7 +22,6 @@ import androidx.core.view.isVisible ...@@ -19,7 +22,6 @@ import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.browserwhite.databinding.ActivityScanQrcBinding import com.base.browserwhite.databinding.ActivityScanQrcBinding
import com.base.browserwhite.ui.activity.BaseActivity 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.ui.views.DialogViews.showGerPermission
import com.base.browserwhite.utils.BarUtils import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
...@@ -101,7 +103,22 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() { ...@@ -101,7 +103,22 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
} }
binding.ivShoudian.isSelected = !binding.ivShoudian.isSelected 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() { private fun initCamera() {
...@@ -138,13 +155,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() { ...@@ -138,13 +155,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
//构建图片捕捉类 //构建图片捕捉类
// imageCapture = buildImageCapture(aspectRation, rotation) // imageCapture = buildImageCapture(aspectRation, rotation)
qrImageAnalyzer = QRImageAnalyzer() qrImageAnalyzer = QRImageAnalyzer()
qrImageAnalyzer.action = { qrCodeValue -> qrImageAnalyzer.parseAction = { qrCodeValue, valueType ->
binding.root.post { // startActivity(Intent(this))
startActivity(Intent(this@ScanQRCActivity, WebBrowserActivity::class.java).apply {
putExtra("url", qrCodeValue)
})
finish()
}
} }
//构建图片分析器 //构建图片分析器
...@@ -208,6 +220,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() { ...@@ -208,6 +220,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
cameraExecutor.shutdown() cameraExecutor.shutdown()
imageAnalyzer?.clearAnalyzer()
cameraProvider?.unbindAll()
} }
companion object { companion object {
...@@ -218,31 +232,33 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() { ...@@ -218,31 +232,33 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
private fun openFlash() { private fun openFlash() {
val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager // val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
cameraManager.setTorchMode(getBackCameraId(), true) // cameraManager.setTorchMode(getBackCameraId(), true)
camera?.cameraControl?.enableTorch(true)
} }
private fun closeFlash() { private fun closeFlash() {
val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager // val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
cameraManager.setTorchMode(getBackCameraId(), false) // cameraManager.setTorchMode(getBackCameraId(), false)
camera?.cameraControl?.enableTorch(false)
} }
private fun getBackCameraId(): String { // private fun getBackCameraId(): String {
var cameraId: String? = null // var cameraId: String? = null
try { // try {
val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager // val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
for (id in cameraManager.cameraIdList) { // for (id in cameraManager.cameraIdList) {
val characteristics: CameraCharacteristics = cameraManager.getCameraCharacteristics(id) // val characteristics: CameraCharacteristics = cameraManager.getCameraCharacteristics(id)
if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) { // if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) {
cameraId = id // cameraId = id
break // break
} // }
} // }
} catch (e: CameraAccessException) { // } catch (e: CameraAccessException) {
e.printStackTrace() // e.printStackTrace()
} // }
return cameraId ?: "" // return cameraId ?: ""
} // }
} }
\ No newline at end of file
...@@ -61,7 +61,7 @@ class WebsiteAdapter(val uiType: Int = 0, val click: (bean: WebSiteBean) -> Unit ...@@ -61,7 +61,7 @@ class WebsiteAdapter(val uiType: Int = 0, val click: (bean: WebSiteBean) -> Unit
binding.ivIcon.visibility = View.VISIBLE binding.ivIcon.visibility = View.VISIBLE
binding.ivAdd.visibility = View.GONE binding.ivAdd.visibility = View.GONE
val bordIconName = arrayOf("Ebay", "Bing", "Wikipedia", "Pinterest", "NBC News", "Shopee", "Drugs") 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)) { if (bordIconName.contains(bean.name)) {
binding.ivIcon.borderColor = ContextCompat.getColor(context, R.color.color_cbcdd7) binding.ivIcon.borderColor = ContextCompat.getColor(context, R.color.color_cbcdd7)
binding.ivIcon.borderWidth = 1 binding.ivIcon.borderWidth = 1
......
...@@ -3,6 +3,7 @@ package com.base.browserwhite.ui.fragment ...@@ -3,6 +3,7 @@ package com.base.browserwhite.ui.fragment
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Intent import android.content.Intent
import android.text.TextUtils
import android.view.KeyEvent import android.view.KeyEvent
import android.view.inputmethod.EditorInfo.IME_ACTION_DONE import android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import android.widget.TextView import android.widget.TextView
...@@ -272,8 +273,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -272,8 +273,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
if (actionId == IME_ACTION_DONE) { if (actionId == IME_ACTION_DONE) {
val content = v?.text.toString() val content = v?.text.toString()
if (TextUtils.isEmpty(content)) {
LinkMatchUtils.handleInput(requireContext(), Toast.makeText(context, "input something please", Toast.LENGTH_SHORT).show()
return true
}
LinkMatchUtils.handleInput(
content, content,
loadUrl = { url -> loadUrl = { url ->
requireActivity().startActivity(Intent(requireContext(), WebBrowserActivity::class.java).apply { requireActivity().startActivity(Intent(requireContext(), WebBrowserActivity::class.java).apply {
...@@ -282,7 +286,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -282,7 +286,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
}) })
}, },
performSearch = { url -> 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表示事件已处理 return true; // 返回true表示事件已处理
......
package com.base.browserwhite.utils package com.base.browserwhite.utils
import android.content.Context
import android.text.TextUtils
import android.widget.Toast
object LinkMatchUtils { object LinkMatchUtils {
fun handleInput( fun handleInput(
context: Context,
input: String, input: String,
loadUrl: (url: String) -> Unit, loadUrl: (url: String) -> Unit,
performSearch: (search: 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)) { if (isLikelyUrl(tempInput)) {
// 补齐协议并加载网址 // 补齐协议并加载网址
val formattedUrl = addProtocolIfNeeded(tempInput) val formattedUrl = addProtocolIfNeeded(tempInput)
loadUrl(formattedUrl); loadUrl(formattedUrl)
} else { } 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