Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
B
Browser White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Browser White
Commits
d6f17852
Commit
d6f17852
authored
Aug 28, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
454a2467
f382978c
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
110 additions
and
66 deletions
+110
-66
MainActivity.kt
...in/java/com/base/browserwhite/ui/activity/MainActivity.kt
+11
-1
QRImageAnalyzer.kt
.../base/browserwhite/ui/activity/scanqrc/QRImageAnalyzer.kt
+88
-0
ScanQRCActivity.kt
.../base/browserwhite/ui/activity/scanqrc/ScanQRCActivity.kt
+11
-65
No files found.
app/src/main/java/com/base/browserwhite/ui/activity/MainActivity.kt
View file @
d6f17852
...
...
@@ -2,16 +2,20 @@ package com.base.browserwhite.ui.activity
import
android.app.usage.StorageStatsManager
import
android.graphics.Color
import
android.net.Uri
import
android.os.Build
import
android.os.Environment
import
android.os.StatFs
import
android.os.storage.StorageManager
import
android.provider.MediaStore
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.updatePadding
import
androidx.fragment.app.Fragment
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
import
com.base.browserwhite.databinding.ActivityMainBinding
import
com.base.browserwhite.ui.activity.scanqrc.QRImageAnalyzer
import
com.base.browserwhite.ui.activity.scanqrc.ScanQRCActivity
import
com.base.browserwhite.ui.fragment.FileFragment
import
com.base.browserwhite.ui.fragment.HomeFragment
import
com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog
...
...
@@ -39,7 +43,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
mutableListOf
(
homeFragment
,
fileFragment
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
...
...
@@ -63,6 +66,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
override
fun
onPageSelected
(
position
:
Int
)
{
}
})
val
qq
=
QRImageAnalyzer
()
qq
.
action
=
{
qrCodeValue
->
}
val
bitmap
=
MediaStore
.
Images
.
Media
.
getBitmap
(
contentResolver
,
Uri
.
EMPTY
)
qq
.
processImage
(
this
,
bitmap
)
}
...
...
app/src/main/java/com/base/browserwhite/ui/activity/scanqrc/QRImageAnalyzer.kt
0 → 100644
View file @
d6f17852
package
com.base.browserwhite.ui.activity.scanqrc
import
android.annotation.SuppressLint
import
android.content.Context
import
android.content.Intent
import
android.graphics.Bitmap
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
//图形分析器
class
QRImageAnalyzer
()
:
ImageAnalysis
.
Analyzer
{
private
val
TAG
=
"QRImageAnalyzer"
var
action
:
((
qrCodeValue
:
String
)
->
Unit
)?
=
null
//如需仅检测 Aztec 码和 QR 码
private
val
options
=
BarcodeScannerOptions
.
Builder
().
setBarcodeFormats
(
Barcode
.
FORMAT_QR_CODE
,
Barcode
.
FORMAT_AZTEC
).
build
()
//获取解析器
private
val
detector
=
BarcodeScanning
.
getClient
(
options
)
@SuppressLint
(
"UnsafeOptInUsageError"
)
override
fun
analyze
(
imageProxy
:
ImageProxy
)
{
val
mediaImage
=
imageProxy
.
image
if
(
mediaImage
!=
null
)
{
val
image
=
InputImage
.
fromMediaImage
(
mediaImage
,
imageProxy
.
imageInfo
.
rotationDegrees
)
detector
.
process
(
image
).
addOnSuccessListener
{
barcodeList
->
// barcodeList.forEach {
// LogEx.logDebug(TAG, "rawValue=${it.rawValue}")
// }
handleBarcodeList
(
barcodeList
)
}.
addOnFailureListener
{
LogEx
.
logDebug
(
TAG
,
"OnFailure"
)
}.
addOnCompleteListener
{
LogEx
.
logDebug
(
TAG
,
"OnComplete"
)
imageProxy
.
close
()
}
}
else
{
imageProxy
.
close
()
}
}
private
fun
handleBarcodeList
(
barcodeList
:
List
<
Barcode
>)
{
if
(
barcodeList
.
size
==
1
)
{
val
barcode
=
barcodeList
[
0
]
val
valueType
=
barcode
.
valueType
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
)
}
}
}
}
}
fun
processImage
(
context
:
Context
,
bitmap
:
Bitmap
)
{
val
image
=
InputImage
.
fromBitmap
(
bitmap
,
0
)
val
barcodeScanner
=
BarcodeScanning
.
getClient
(
options
)
barcodeScanner
.
process
(
image
)
.
addOnSuccessListener
{
barcodes
->
handleBarcodeList
(
barcodes
)
}
.
addOnFailureListener
{
exception
->
// 处理失败情况
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ui/activity/scanqrc/ScanQRCActivity.kt
View file @
d6f17852
package
com.base.browserwhite.ui.activity.scanqrc
import
android.Manifest
import
android.annotation.SuppressLint
import
android.content.Intent
import
android.content.pm.PackageManager
import
android.graphics.Color
import
android.hardware.camera2.CameraAccessException
import
android.hardware.camera2.CameraCharacteristics
import
android.hardware.camera2.CameraManager
import
android.util.Log
import
androidx.activity.addCallback
import
androidx.camera.core.AspectRatio
import
androidx.camera.core.Camera
import
androidx.camera.core.CameraSelector
import
androidx.camera.core.ImageAnalysis
import
androidx.camera.core.ImageProxy
import
androidx.camera.core.Preview
import
androidx.camera.lifecycle.ProcessCameraProvider
import
androidx.core.content.ContextCompat
...
...
@@ -23,17 +20,10 @@ 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.fragment.HomeFragment.Companion.isMatchesUrl
import
com.base.browserwhite.ui.views.DialogViews.showGerPermission
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.utils.LogEx
import
com.base.browserwhite.utils.PermissionHelp.checkCameraPermission
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
import
java.util.concurrent.ExecutorService
import
java.util.concurrent.Executors
import
kotlin.math.abs
...
...
@@ -57,6 +47,7 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
private
var
cameraProvider
:
ProcessCameraProvider
?
=
null
private
lateinit
var
cameraExecutor
:
ExecutorService
private
var
imageAnalyzer
:
ImageAnalysis
?
=
null
private
lateinit
var
qrImageAnalyzer
:
QRImageAnalyzer
override
fun
initView
()
{
...
...
@@ -146,10 +137,19 @@ 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
()
}
}
//构建图片分析器
imageAnalyzer
=
buildImageAnalysis
(
aspectRation
,
rotation
)
{
it
.
setAnalyzer
(
cameraExecutor
,
QRImageAnalyzer
()
)
it
.
setAnalyzer
(
cameraExecutor
,
qrImageAnalyzer
)
}
//每次绑定需先解绑
...
...
@@ -244,59 +244,5 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
return
cameraId
?:
""
}
//图形分析器
inner
class
QRImageAnalyzer
:
ImageAnalysis
.
Analyzer
{
//如需仅检测 Aztec 码和 QR 码
private
val
options
=
BarcodeScannerOptions
.
Builder
().
setBarcodeFormats
(
Barcode
.
FORMAT_QR_CODE
,
Barcode
.
FORMAT_AZTEC
).
build
()
//获取解析器
private
val
detector
=
BarcodeScanning
.
getClient
(
options
)
@SuppressLint
(
"UnsafeOptInUsageError"
)
override
fun
analyze
(
imageProxy
:
ImageProxy
)
{
val
mediaImage
=
imageProxy
.
image
if
(
mediaImage
!=
null
)
{
val
image
=
InputImage
.
fromMediaImage
(
mediaImage
,
imageProxy
.
imageInfo
.
rotationDegrees
)
detector
.
process
(
image
).
addOnSuccessListener
{
barcodeList
->
// barcodeList.forEach {
// LogEx.logDebug(TAG, "rawValue=${it.rawValue}")
// }
if
(
barcodeList
.
size
==
1
)
{
val
barcode
=
barcodeList
[
0
]
val
valueType
=
barcode
.
valueType
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"
))
{
binding
.
root
.
post
{
startActivity
(
Intent
(
this
@ScanQRCActivity
,
WebBrowserActivity
::
class
.
java
).
apply
{
putExtra
(
"url"
,
qrCodeValue
)
})
finish
()
}
}
}
}
// imageAnalysis.clearAnalyzer()
}
}.
addOnFailureListener
{
LogEx
.
logDebug
(
TAG
,
"OnFailure"
)
}.
addOnCompleteListener
{
LogEx
.
logDebug
(
TAG
,
"OnComplete"
)
imageProxy
.
close
()
}
}
else
{
imageProxy
.
close
()
}
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment