Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
S
Scan QR Code Barcode Reader
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
Scan QR Code Barcode Reader
Commits
17d4a4fa
Commit
17d4a4fa
authored
Jan 03, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
8469a0d8
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
634 additions
and
72 deletions
+634
-72
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+14
-6
TelephoneUIBean.kt
app/src/main/java/com/base/scanqr/bean/TelephoneUIBean.kt
+2
-1
HistoryAdapter.kt
app/src/main/java/com/base/scanqr/ui/main/HistoryAdapter.kt
+4
-1
HistoryFragment.kt
app/src/main/java/com/base/scanqr/ui/main/HistoryFragment.kt
+7
-0
HistoryViewModel.kt
...src/main/java/com/base/scanqr/ui/main/HistoryViewModel.kt
+12
-2
ScanFragment.kt
app/src/main/java/com/base/scanqr/ui/main/ScanFragment.kt
+30
-1
StartActivity.kt
app/src/main/java/com/base/scanqr/ui/start/StartActivity.kt
+0
-4
TelephoneActivity.kt
...in/java/com/base/scanqr/ui/telephone/TelephoneActivity.kt
+48
-6
TelephoneCodeActivity.kt
...ava/com/base/scanqr/ui/telephone/TelephoneCodeActivity.kt
+135
-26
ContactUtils.kt
app/src/main/java/com/base/scanqr/utils/ContactUtils.kt
+6
-4
IntentUtils.kt
app/src/main/java/com/base/scanqr/utils/IntentUtils.kt
+6
-0
PermissionUtils.kt
app/src/main/java/com/base/scanqr/utils/PermissionUtils.kt
+12
-0
activity_telephone_code.xml
app/src/main/res/layout/activity_telephone_code.xml
+321
-19
activity_website_code.xml
app/src/main/res/layout/activity_website_code.xml
+1
-1
item_history.xml
app/src/main/res/layout/item_history.xml
+1
-1
phoneicon.png
app/src/main/res/mipmap-xxhdpi/phoneicon.png
+0
-0
strings.xml
app/src/main/res/values/strings.xml
+35
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
17d4a4fa
...
...
@@ -4,8 +4,10 @@
<uses-feature
android:name=
"android.hardware.camera"
android:required=
"false"
/>
<!-- 获取wifi列表 --><!-- 获取wifi列表 --><!-- 获取wifi列表 --><!-- 获取wifi列表 -->
android:required=
"false"
/>
<!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission
android:name=
"android.permission.CHANGE_NETWORK_STATE"
/>
...
...
@@ -13,13 +15,16 @@
<uses-permission
android:name=
"android.permission.CHANGE_WIFI_STATE"
/>
<uses-permission
android:name=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<!-- 前台服务 --><!-- 前台服务 --><!-- 前台服务 --><!-- 前台服务 --><!-- 前台服务 -->
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<!-- 前台服务 -->
<!-- 前台服务 -->
<!-- 前台服务 -->
<!-- 前台服务 -->
<!-- 前台服务 -->
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE"
/>
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE_DATA_SYNC"
/>
<uses-permission
android:name=
"android.permission.POST_NOTIFICATIONS"
/>
<uses-permission
android:name=
"android.permission.READ_CONTACTS"
/>
<uses-permission
android:name=
"android.permission.CALL_PHONE"
/>
<application
android:name=
".MyApplication"
...
...
@@ -32,7 +37,10 @@
android:supportsRtl=
"true"
android:theme=
"@style/Theme.ScanQR"
tools:targetApi=
"31"
>
<activity
android:name=
".ui.telephone.TelephoneCodeActivity"
android:exported=
"false"
android:theme=
"@style/Theme.ScanQR"
/>
<activity
android:name=
".ui.start.StartActivity"
android:exported=
"true"
...
...
app/src/main/java/com/base/scanqr/bean/TelephoneUIBean.kt
View file @
17d4a4fa
...
...
@@ -5,7 +5,8 @@ data class TelephoneUIBean(
)
:
ScanBean
(
FunctionUIBean
.
KEY_TELEPHONE
)
{
companion
object
{
fun
isWifiQR
(
qrCodeValue
:
String
):
Boolean
{
fun
isTelephoneQR
(
qrCodeValue
:
String
):
Boolean
{
if
(
qrCodeValue
.
startsWith
(
"tel:"
))
{
return
true
}
...
...
app/src/main/java/com/base/scanqr/ui/main/HistoryAdapter.kt
View file @
17d4a4fa
...
...
@@ -20,6 +20,7 @@ import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WEBSITE
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
import
com.base.scanqr.bean.ProductUIBean
import
com.base.scanqr.bean.ScanBean
import
com.base.scanqr.bean.TelephoneUIBean
import
com.base.scanqr.bean.TextUIBean
import
com.base.scanqr.bean.WebsiteUIBean
import
com.base.scanqr.bean.WifiUIBean
...
...
@@ -98,7 +99,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
}
KEY_TELEPHONE
->
{
if
(
item
is
TelephoneUIBean
)
{
binding
.
ivIcon
.
setImageResource
(
R
.
mipmap
.
h_telephone
)
}
}
KEY_MESSAGE
->
{}
...
...
app/src/main/java/com/base/scanqr/ui/main/HistoryFragment.kt
View file @
17d4a4fa
...
...
@@ -15,6 +15,7 @@ import com.base.scanqr.databinding.FragmentHistoryBinding
import
com.base.scanqr.ui.email.EmailCodeActivity
import
com.base.scanqr.ui.event.EventCodeActivity
import
com.base.scanqr.ui.product.ProductCodeActivity
import
com.base.scanqr.ui.telephone.TelephoneCodeActivity
import
com.base.scanqr.ui.text.TextCodeActivity
import
com.base.scanqr.ui.website.WebsiteCodeActivity
import
com.base.scanqr.ui.widget.DeleteQRDialog.showDeleteQRDialog
...
...
@@ -106,6 +107,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
putExtra
(
"data"
,
Gson
().
toJson
(
item
))
})
}
FunctionUIBean
.
KEY_TELEPHONE
->
{
activity
?.
startActivity
(
Intent
(
activity
,
TelephoneCodeActivity
::
class
.
java
).
apply
{
putExtra
(
"data"
,
Gson
().
toJson
(
item
))
})
}
}
}
...
...
app/src/main/java/com/base/scanqr/ui/main/HistoryViewModel.kt
View file @
17d4a4fa
...
...
@@ -2,12 +2,12 @@ package com.base.scanqr.ui.main
import
androidx.lifecycle.ViewModel
import
androidx.lifecycle.viewModelScope
import
com.base.scanqr.bean.AdScanBean
import
com.base.scanqr.bean.EmailUIBean
import
com.base.scanqr.bean.EventUIBean
import
com.base.scanqr.bean.FunctionUIBean
import
com.base.scanqr.bean.ProductUIBean
import
com.base.scanqr.bean.ScanBean
import
com.base.scanqr.bean.TelephoneUIBean
import
com.base.scanqr.bean.TextUIBean
import
com.base.scanqr.bean.WebsiteUIBean
import
com.base.scanqr.bean.WifiUIBean
...
...
@@ -40,6 +40,8 @@ class HistoryViewModel() : ViewModel() {
productList
.
forEach
{
it
.
listContent
=
it
.
content
}
val
eventList
=
SpJsonUtils
.
getSpJsonList
<
EventUIBean
>(
FunctionUIBean
.
KEY_EVENT
)
eventList
.
forEach
{
it
.
listContent
=
it
.
summary
}
val
telephoneList
=
SpJsonUtils
.
getSpJsonList
<
TelephoneUIBean
>(
FunctionUIBean
.
KEY_TELEPHONE
)
telephoneList
.
forEach
{
it
.
listContent
=
it
.
tel
}
historyList
.
addAll
(
wifiList
)
historyList
.
addAll
(
textList
)
...
...
@@ -47,6 +49,7 @@ class HistoryViewModel() : ViewModel() {
historyList
.
addAll
(
websiteList
)
historyList
.
addAll
(
productList
)
historyList
.
addAll
(
eventList
)
historyList
.
addAll
(
telephoneList
)
historyList
.
forEach
{
LogEx
.
logDebug
(
TAG
,
"${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}"
)
...
...
@@ -96,11 +99,18 @@ class HistoryViewModel() : ViewModel() {
it1
.
createTime
==
it2
.
createTime
})
}
FunctionUIBean
.
KEY_EVENT
->{
FunctionUIBean
.
KEY_EVENT
->
{
SpJsonUtils
.
removeJsonBean
<
EventUIBean
>(
bean
.
scanType
,
bean
as
EventUIBean
,
removeIf
=
{
it1
,
it2
->
it1
.
createTime
==
it2
.
createTime
})
}
FunctionUIBean
.
KEY_TELEPHONE
->
{
SpJsonUtils
.
removeJsonBean
<
TelephoneUIBean
>(
bean
.
scanType
,
bean
as
TelephoneUIBean
,
removeIf
=
{
it1
,
it2
->
it1
.
createTime
==
it2
.
createTime
})
}
}
historyList
.
remove
(
bean
)
...
...
app/src/main/java/com/base/scanqr/ui/main/ScanFragment.kt
View file @
17d4a4fa
...
...
@@ -19,6 +19,8 @@ import com.base.scanqr.bean.EventUIBean.Companion.createEventBean
import
com.base.scanqr.bean.EventUIBean.Companion.isEventQR
import
com.base.scanqr.bean.ProductUIBean
import
com.base.scanqr.bean.ScanBean.Companion.CREATE_TYPE_SCAN
import
com.base.scanqr.bean.TelephoneUIBean.Companion.createTelephoneBean
import
com.base.scanqr.bean.TelephoneUIBean.Companion.isTelephoneQR
import
com.base.scanqr.bean.TextUIBean
import
com.base.scanqr.bean.WebsiteUIBean.Companion.createWebsiteBean
import
com.base.scanqr.bean.WebsiteUIBean.Companion.isWebsiteQR
...
...
@@ -29,6 +31,7 @@ import com.base.scanqr.qr.QRImageAnalyzer
import
com.base.scanqr.ui.email.EmailCodeActivity
import
com.base.scanqr.ui.event.EventCodeActivity
import
com.base.scanqr.ui.product.ProductCodeActivity
import
com.base.scanqr.ui.telephone.TelephoneCodeActivity
import
com.base.scanqr.ui.text.TextCodeActivity
import
com.base.scanqr.ui.website.WebsiteCodeActivity
import
com.base.scanqr.ui.wifi.WifiCodeActivity
...
...
@@ -36,7 +39,6 @@ import com.base.scanqr.utils.BitmapUtils.uriToBitmap
import
com.base.scanqr.utils.IntentUtils.intentSafPickImage
import
com.base.scanqr.utils.LogEx
import
com.base.scanqr.utils.PermissionUtils.checkCameraPermission
import
com.base.scanqr.utils.QRCodeUtils
import
com.google.gson.Gson
import
com.google.mlkit.vision.barcode.common.Barcode
import
com.gyf.immersionbar.ktx.immersionBar
...
...
@@ -144,6 +146,24 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
})
return
}
if
(
isTelephoneQR
(
qrCodeValue
))
{
if
(
scanJump
.
get
())
return
scanJump
.
set
(
true
)
AdsMgr
.
showInsert
(
activity
,
false
,
object
:
AdsShowCallBack
()
{
override
fun
close
(
where
:
Int
)
{
jumpTelephoneCodeActivity
(
activity
,
qrCodeValue
)
}
override
fun
failed
(
where
:
Int
)
{
jumpTelephoneCodeActivity
(
activity
,
qrCodeValue
)
}
override
fun
googleFailed
(
where
:
Int
)
{
jumpTelephoneCodeActivity
(
activity
,
qrCodeValue
)
}
})
return
}
if
(
isEventQR
(
qrCodeValue
))
{
if
(
scanJump
.
get
())
return
scanJump
.
set
(
true
)
...
...
@@ -243,6 +263,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
}
}
private
fun
jumpTelephoneCodeActivity
(
activity
:
MainActivity
,
qrCodeValue
:
String
)
{
activity
.
startActivity
(
Intent
(
activity
,
TelephoneCodeActivity
::
class
.
java
).
apply
{
val
bean
=
createTelephoneBean
(
qrCodeValue
)
bean
.
needCreate
=
true
bean
.
createType
=
CREATE_TYPE_SCAN
putExtra
(
"data"
,
Gson
().
toJson
(
bean
))
})
}
private
fun
jumpEventCodeActivity
(
activity
:
MainActivity
,
qrCodeValue
:
String
)
{
activity
.
startActivity
(
Intent
(
activity
,
EventCodeActivity
::
class
.
java
).
apply
{
val
bean
=
createEventBean
(
qrCodeValue
)
...
...
app/src/main/java/com/base/scanqr/ui/start/StartActivity.kt
View file @
17d4a4fa
...
...
@@ -45,10 +45,6 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override
fun
initView
()
{
super
.
initView
()
startActivity
(
Intent
(
this
,
TelephoneActivity
::
class
.
java
))
finish
()
return
NotificationHoverUtils
.
stopNotificationHandler
()
if
(
ConstObject
.
ifAgreePrivacy
)
{
...
...
app/src/main/java/com/base/scanqr/ui/telephone/TelephoneActivity.kt
View file @
17d4a4fa
package
com.base.scanqr.ui.telephone
import
android.content.Intent
import
android.net.Uri
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.core.widget.addTextChangedListener
import
androidx.lifecycle.lifecycleScope
import
com.base.scanqr.R
import
com.base.scanqr.ads.AdsMgr
import
com.base.scanqr.ads.AdsShowCallBack
...
...
@@ -11,8 +13,14 @@ import com.base.scanqr.base.BaseActivity
import
com.base.scanqr.bean.TelephoneUIBean
import
com.base.scanqr.databinding.ActivityTelephoneBinding
import
com.base.scanqr.utils.BarUtils
import
com.base.scanqr.utils.ContactUtils.queryTel
import
com.base.scanqr.utils.IntentUtils.intentPickContacts
import
com.base.scanqr.utils.LogEx
import
com.base.scanqr.utils.PermissionUtils.checkContactsReadPermission
import
com.base.scanqr.utils.ToastUtils.toast
import
com.google.gson.Gson
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
class
TelephoneActivity
:
BaseActivity
<
ActivityTelephoneBinding
>(
ActivityTelephoneBinding
::
inflate
)
{
...
...
@@ -55,16 +63,50 @@ class TelephoneActivity : BaseActivity<ActivityTelephoneBinding>(ActivityTelepho
telephoneBean
.
tel
=
s
.
toString
()
}
binding
.
tvSelect
.
setOnClickListener
{
if
(!
checkContactsReadPermission
())
{
launcher
.
launch
(
arrayOf
(
android
.
Manifest
.
permission
.
READ_CONTACTS
))
{
if
(
checkContactsReadPermission
())
{
pickTel
()
}
}
}
else
{
pickTel
()
}
}
binding
.
flQueren
.
setOnClickListener
{
if
(
telephoneBean
.
tel
.
isEmpty
())
{
toast
(
"Enter phone number"
,
true
)
return
@setOnClickListener
}
startActivity
(
Intent
(
this
@TelephoneActivity
,
TelephoneCodeActivity
::
class
.
java
).
apply
{
putExtra
(
"data"
,
Gson
().
toJson
(
telephoneBean
))
})
finish
()
}
}
private
fun
pickTel
()
{
val
intent
=
intentPickContacts
()
try
{
launcher
.
launch
(
intent
)
{
result
->
val
contactUri
:
Uri
?
=
result
.
data
?.
data
LogEx
.
logDebug
(
TAG
,
""
)
if
(
contactUri
!=
null
)
{
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
val
tel
=
queryTel
(
contactUri
)
?:
""
telephoneBean
.
tel
=
tel
launch
(
Dispatchers
.
Main
)
{
binding
.
edit
.
setText
(
tel
)
}
}
}
}
}
catch
(
e
:
Exception
)
{
toast
(
"No application was found to handle the contacts pick"
,
true
)
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/ui/telephone/TelephoneCodeActivity.kt
View file @
17d4a4fa
package
com.base.scanqr.ui.telephone
import
android.os.Bundle
import
com.google.android.material.snackbar.Snackbar
import
androidx.appcompat.app.AppCompatActivity
import
androidx.navigation.findNavController
import
androidx.navigation.ui.AppBarConfiguration
import
androidx.navigation.ui.navigateUp
import
androidx.navigation.ui.setupActionBarWithNavController
import
android.Manifest
import
android.os.Environment
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
com.base.scanqr.R
import
com.base.scanqr.ads.AdsMgr
import
com.base.scanqr.ads.AdsShowCallBack
import
com.base.scanqr.base.BaseActivity
import
com.base.scanqr.bean.FunctionUIBean
import
com.base.scanqr.bean.TelephoneUIBean
import
com.base.scanqr.databinding.ActivityTelephoneCodeBinding
import
com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import
com.base.scanqr.utils.BarUtils
import
com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
import
com.base.scanqr.utils.ClipboardUtils.copyText
import
com.base.scanqr.utils.IntentUtils.intentCallPhone
import
com.base.scanqr.utils.IntentUtils.intentShareImage
import
com.base.scanqr.utils.LogEx
import
com.base.scanqr.utils.PermissionUtils.checkCallPhonePermission
import
com.base.scanqr.utils.QRCodeUtils.generateQRCode
import
com.base.scanqr.utils.SpJsonUtils
import
com.base.scanqr.utils.ToastUtils.toast
import
com.google.gson.Gson
import
java.io.File
class
TelephoneCodeActivity
:
AppCompatActivity
(
)
{
class
TelephoneCodeActivity
:
BaseActivity
<
ActivityTelephoneCodeBinding
>(
ActivityTelephoneCodeBinding
::
inflate
)
{
private
lateinit
var
appBarConfiguration
:
AppBarConfiguration
private
lateinit
var
binding
:
ActivityTelephoneCodeBinding
private
var
telephoneUIBean
=
TelephoneUIBean
()
private
var
telQrString
=
""
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
private
var
tempImage
:
String
=
""
override
fun
onResumeOneShoot
()
{
super
.
onResumeOneShoot
()
val
flag
=
changeLanguage
()
if
(
flag
)
return
binding
=
ActivityTelephoneCodeBinding
.
inflate
(
layoutInflater
)
setContentView
(
binding
.
root
)
AdsMgr
.
showBanner
(
binding
.
flBanner
,
false
)
}
override
fun
initView
()
{
super
.
initView
()
binding
.
clTop
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_item
)
setSupportActionBar
(
binding
.
toolbar
)
val
data
=
intent
.
extras
?.
getString
(
"data"
)
val
navController
=
findNavController
(
R
.
id
.
nav_host_fragment_content_telephone_code
)
appBarConfiguration
=
AppBarConfiguration
(
navController
.
graph
)
setupActionBarWithNavController
(
navController
,
appBarConfiguration
)
data
?.
let
{
telephoneUIBean
=
Gson
().
fromJson
(
data
,
TelephoneUIBean
::
class
.
java
)
binding
.
tvTel
.
text
=
telephoneUIBean
.
tel
}
Thread
{
telQrString
=
"tel:"
+
telephoneUIBean
.
tel
val
bitmap
=
generateQRCode
(
telQrString
,
735
,
735
,
5
)
runOnUiThread
{
binding
.
ivQr
.
setImageBitmap
(
bitmap
)
val
file
=
File
(
cacheDir
,
System
.
currentTimeMillis
().
toString
()
+
".jpg"
)
bitmap
?.
let
{
val
flag
=
saveBitmapToFile
(
it
,
file
.
absolutePath
)
LogEx
.
logDebug
(
TAG
,
"flag=$flag tempImage=${file.absolutePath}"
)
if
(
flag
)
{
tempImage
=
file
.
absolutePath
}
}
if
(
telephoneUIBean
.
needCreate
)
{
telephoneUIBean
.
needCreate
=
false
SpJsonUtils
.
addJsonBean
<
TelephoneUIBean
>(
FunctionUIBean
.
KEY_TELEPHONE
,
telephoneUIBean
)
}
}
}.
start
()
}
binding
.
fab
.
setOnClickListener
{
view
->
Snackbar
.
make
(
view
,
"Replace with your own action"
,
Snackbar
.
LENGTH_LONG
)
.
setAction
(
"Action"
,
null
)
.
setAnchorView
(
R
.
id
.
fab
).
show
()
override
fun
initListener
()
{
super
.
initListener
()
onBackPressedDispatcher
.
addCallback
{
AdsMgr
.
showInsert
(
this
@TelephoneCodeActivity
,
false
,
object
:
AdsShowCallBack
()
{
override
fun
close
(
where
:
Int
)
{
finishToMainTop
()
}
override
fun
failed
(
where
:
Int
)
{
finishToMainTop
()
}
override
fun
onSupportNavigateUp
():
Boolean
{
val
navController
=
findNavController
(
R
.
id
.
nav_host_fragment_content_telephone_code
)
return
navController
.
navigateUp
(
appBarConfiguration
)
||
super
.
onSupportNavigateUp
()
override
fun
googleFailed
(
where
:
Int
)
{
finishToMainTop
()
}
})
}
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
binding
.
llShare
.
setOnClickListener
{
val
intent
=
intentShareImage
(
this
,
tempImage
)
runCatching
{
startActivity
(
intent
)
}
}
binding
.
llDownload
.
setOnClickListener
{
kotlin
.
runCatching
{
val
appFile
=
File
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DOWNLOADS
),
this
.
resources
.
getString
(
R
.
string
.
app_name
)
)
if
(!
appFile
.
exists
())
appFile
.
mkdirs
()
var
newName
=
File
(
tempImage
).
name
showInputNameDialog
(
newName
)
{
name
->
if
(
name
.
endsWith
(
".jpg"
))
{
name
.
also
{
newName
=
it
}
}
else
{
newName
=
"$name.jpg"
}
val
downFile
=
File
(
appFile
,
newName
)
downFile
.
createNewFile
()
File
(
tempImage
).
copyTo
(
downFile
,
true
)
toast
(
"Save to:${appFile.absolutePath}"
,
true
)
}
}
}
binding
.
llCopy
.
setOnClickListener
{
copyText
(
TAG
,
telQrString
)
toast
(
"Copied to clipboard"
,
true
)
}
binding
.
flSearch
.
setOnClickListener
{
if
(!
checkCallPhonePermission
())
{
launcher
.
launch
(
arrayOf
(
Manifest
.
permission
.
CALL_PHONE
))
{
if
(
checkCallPhonePermission
())
{
callPhone
()
}
}
}
else
{
callPhone
()
}
}
}
private
fun
callPhone
()
{
try
{
val
intent
=
intentCallPhone
(
telephoneUIBean
.
tel
)
startActivity
(
intent
)
}
catch
(
e
:
Exception
)
{
toast
(
"No application was found to handle the phone call"
,
true
)
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/utils/ContactUtils.kt
View file @
17d4a4fa
...
...
@@ -9,7 +9,7 @@ import android.provider.ContactsContract
object
ContactUtils
{
@SuppressLint
(
"Range"
)
fun
Context
.
queryTel
(
contactUri
:
Uri
)
{
fun
Context
.
queryTel
(
contactUri
:
Uri
)
:
String
?
{
val
cursor
=
contentResolver
.
query
(
contactUri
,
null
,
...
...
@@ -18,8 +18,8 @@ object ContactUtils {
null
)
cursor
?.
use
{
if
(
it
.
moveToFirst
())
{
val
phoneId
=
it
.
getLong
(
it
.
getColumnIndex
(
ContactsContract
.
CommonDataKinds
.
Phone
.
_ID
))
if
(
cursor
.
moveToFirst
())
{
val
phoneId
=
cursor
.
getLong
(
cursor
.
getColumnIndex
(
ContactsContract
.
CommonDataKinds
.
Phone
.
_ID
))
val
phoneCursor
=
contentResolver
.
query
(
ContentUris
.
withAppendedId
(
ContactsContract
.
CommonDataKinds
.
Phone
.
CONTENT_URI
,
phoneId
),
null
,
...
...
@@ -28,13 +28,15 @@ object ContactUtils {
null
)
phoneCursor
?.
use
{
if
(
it
.
moveToFirst
())
{
if
(
phoneCursor
.
moveToFirst
())
{
val
phoneNumber
=
phoneCursor
.
getString
(
phoneCursor
.
getColumnIndex
(
ContactsContract
.
CommonDataKinds
.
Phone
.
NUMBER
))
// 使用phoneNumber
return
phoneNumber
}
}
}
}
return
null
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/utils/IntentUtils.kt
View file @
17d4a4fa
...
...
@@ -122,4 +122,10 @@ object IntentUtils {
val
chooser
=
Intent
.
createChooser
(
intent
,
null
)
return
chooser
}
fun
intentCallPhone
(
tel
:
String
):
Intent
{
val
callIntent
=
Intent
(
Intent
.
ACTION_CALL
,
Uri
.
parse
(
"tel:$tel"
))
val
shareIntent
=
Intent
.
createChooser
(
callIntent
,
null
)
return
shareIntent
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/utils/PermissionUtils.kt
View file @
17d4a4fa
...
...
@@ -15,6 +15,18 @@ import com.base.scanqr.utils.IntentUtils.intentAppDetailsSettings
object
PermissionUtils
{
//region 打电话
fun
Context
.
checkCallPhonePermission
():
Boolean
{
return
PackageManager
.
PERMISSION_GRANTED
==
ActivityCompat
.
checkSelfPermission
(
this
,
Manifest
.
permission
.
CALL_PHONE
)
}
//endregion
//region联系人
fun
Context
.
checkContactsReadPermission
():
Boolean
{
return
PackageManager
.
PERMISSION_GRANTED
==
ActivityCompat
.
checkSelfPermission
(
this
,
Manifest
.
permission
.
READ_CONTACTS
)
}
//endregion
//region 相机
fun
Context
.
checkCameraPermission
():
Boolean
{
return
PackageManager
.
PERMISSION_GRANTED
==
ActivityCompat
.
checkSelfPermission
(
this
,
Manifest
.
permission
.
CAMERA
)
...
...
app/src/main/res/layout/activity_telephone_code.xml
View file @
17d4a4fa
<?xml version="1.0" encoding="utf-8"?>
<androidx.co
ordinatorlayout.widget.Coordinator
Layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
<androidx.co
nstraintlayout.widget.Constraint
Layout
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"
android:
fitsSystemWindows=
"tru
e"
tools:context=
".ui.
telephone.Telephon
eCodeActivity"
>
android:
background=
"@color/whit
e"
tools:context=
".ui.
website.Websit
eCodeActivity"
>
<com.google.android.material.appbar.AppBarLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:id=
"@+id/cl_top"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
a
ndroid:fitsSystemWindows=
"true
"
>
a
pp:layout_constraintTop_toTopOf=
"parent
"
>
<com.google.android.material.appbar.MaterialToolbar
android:id=
"@+id/toolbar"
<FrameLayout
android:id=
"@+id/fl_back"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:paddingHorizontal=
"16dp"
android:paddingVertical=
"12dp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/fanhui"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"4dp"
android:text=
"@string/telephone"
android:textColor=
"@color/black"
android:textSize=
"19sp"
android:textStyle=
"bold"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toEndOf=
"@id/fl_back"
app:layout_constraintTop_toTopOf=
"parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.core.widget.NestedScrollView
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
app:layout_constraintBottom_toTopOf=
"@id/fl_banner"
app:layout_constraintTop_toBottomOf=
"@id/cl_top"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
>
<androidx.cardview.widget.CardView
android:layout_width=
"195dp"
android:layout_height=
"195dp"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"30dp"
app:cardCornerRadius=
"20dp"
app:cardElevation=
"5dp"
>
<ImageView
android:id=
"@+id/iv_qr"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_gravity=
"center"
android:scaleType=
"fitXY"
tools:ignore=
"ContentDescription"
/>
</androidx.cardview.widget.CardView>
<com.base.scanqr.ads.NativeParentView
android:id=
"@+id/fl_ad"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginTop=
"24dp"
android:background=
"@drawable/bg_ecf6ff_20"
android:minHeight=
"133dp"
>
<io.supercharge.shimmerlayout.ShimmerLayout
android:id=
"@+id/shimmerLayout"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:layout_marginHorizontal=
"16dp"
app:shimmer_angle=
"25"
app:shimmer_animation_duration=
"2000"
app:shimmer_auto_start=
"true"
app:shimmer_color=
"#33ffffff"
app:shimmer_mask_width=
"0.2"
>
<ImageView
android:layout_width=
"match_parent"
android:layout_height=
"?attr/actionBarSize"
/>
android:layout_height=
"wrap_content"
android:background=
"@mipmap/czhanweitu"
tools:ignore=
"ContentDescription,ImageContrastCheck"
/>
</io.supercharge.shimmerlayout.ShimmerLayout>
</com.base.scanqr.ads.NativeParentView>
<androidx.cardview.widget.CardView
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginTop=
"15dp"
android:layout_marginBottom=
"8dp"
app:cardBackgroundColor=
"@color/white"
app:cardCornerRadius=
"15dp"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
>
<LinearLayout
android:id=
"@+id/ll_content"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintTop_toTopOf=
"parent"
>
</com.google.android.material.appbar.AppBarLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"14dp"
android:layout_marginTop=
"12dp"
android:text=
"@string/phone_number"
android:textColor=
"#666666"
android:textSize=
"16sp"
android:textStyle=
"bold"
/>
<include
layout=
"@layout/content_telephone_code"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
tools:ignore=
"UseCompoundDrawables"
>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id=
"@+id/fab"
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"bottom|end"
android:layout_marginEnd=
"@dimen/fab_margin"
android:layout_marginBottom=
"16dp"
app:srcCompat=
"@android:drawable/ic_dialog_email"
/>
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"17dp"
android:src=
"@mipmap/phoneicon"
tools:ignore=
"ContentDescription"
/>
<TextView
android:id=
"@+id/tvTel"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:paddingHorizontal=
"5dp"
android:textColor=
"#6473F8"
android:textSize=
"14sp"
/>
</LinearLayout>
<View
android:layout_width=
"match_parent"
android:layout_height=
"1dp"
android:layout_marginHorizontal=
"14dp"
android:layout_marginTop=
"8dp"
android:background=
"#E2E2E2"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"98dp"
android:layout_marginVertical=
"8dp"
app:layout_constraintBottom_toTopOf=
"@id/fl_search"
app:layout_constraintTop_toBottomOf=
"@id/ll_content"
tools:ignore=
"DisableBaselineAlignment"
>
<LinearLayout
android:id=
"@+id/ll_share"
android:layout_width=
"0dp"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:gravity=
"center"
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:src=
"@mipmap/w_share"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"8dp"
android:text=
"@string/share"
android:textSize=
"12sp"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/ll_pdf"
android:layout_width=
"0dp"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:gravity=
"center"
android:orientation=
"vertical"
android:visibility=
"gone"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:src=
"@mipmap/w_export"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"8dp"
android:text=
"@string/export_to_pdf"
android:textSize=
"12sp"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/ll_download"
android:layout_width=
"0dp"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:gravity=
"center"
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:src=
"@mipmap/w_download"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"8dp"
android:text=
"@string/download"
android:textSize=
"12sp"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/ll_copy"
android:layout_width=
"0dp"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:gravity=
"center"
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:src=
"@mipmap/w_copy"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"8dp"
android:text=
"@string/copy"
android:textSize=
"12sp"
/>
</LinearLayout>
</LinearLayout>
<FrameLayout
android:id=
"@+id/fl_search"
android:layout_width=
"171dp"
android:layout_height=
"30dp"
android:layout_marginBottom=
"12dp"
android:background=
"@drawable/bg_stroke_6473f8_90"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
tools:ignore=
"UseCompoundDrawables,UselessParent"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:src=
"@mipmap/h_lianjie"
tools:ignore=
"ContentDescription"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"4dp"
android:includeFontPadding=
"false"
android:text=
"@string/search_on_the_web"
android:textColor=
"#6473F8"
android:textSize=
"11sp"
/>
</LinearLayout>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<FrameLayout
android:id=
"@id/fl_banner"
android:layout_width=
"match_parent"
android:layout_height=
"60dp"
app:layout_constraintBottom_toBottomOf=
"parent"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/activity_website_code.xml
View file @
17d4a4fa
...
...
@@ -132,7 +132,7 @@
android:layout_height=
"wrap_content"
android:layout_marginStart=
"14dp"
android:layout_marginTop=
"12dp"
android:text=
"
Link W
ebsite"
android:text=
"
@string/link_w
ebsite"
android:textColor=
"#666666"
android:textSize=
"16sp"
android:textStyle=
"bold"
/>
...
...
app/src/main/res/layout/item_history.xml
View file @
17d4a4fa
...
...
@@ -20,7 +20,7 @@
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"15dp"
android
:src=
"@mipmap/h_wifi"
tools
:src=
"@mipmap/h_wifi"
tools:ignore=
"ContentDescription"
/>
<LinearLayout
...
...
app/src/main/res/mipmap-xxhdpi/phoneicon.png
0 → 100644
View file @
17d4a4fa
1.66 KB
app/src/main/res/values/strings.xml
View file @
17d4a4fa
...
...
@@ -94,5 +94,40 @@
<string
name=
"phone"
>
Phone
</string>
<string
name=
"enter_phone_number"
>
Enter phone number
</string>
<string
name=
"select_in_contacts"
>
Select in contacts
</string>
<!-- Strings used for fragments for navigation -->
<string
name=
"first_fragment_label"
>
First Fragment
</string>
<string
name=
"second_fragment_label"
>
Second Fragment
</string>
<string
name=
"next"
>
Next
</string>
<string
name=
"previous"
>
Previous
</string>
<string
name=
"lorem_ipsum"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris volutpat, dolor id interdum
ullamcorper, risus dolor egestas lectus, sit amet mattis purus dui nec risus. Maecenas non sodales nisi, vel dictum dolor.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend diam,
vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a, ornare ex. Sed rhoncus est ut libero porta
lobortis. Fusce in dictum tellus.\n\n
Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus egestas, est a condimentum egestas,
turpis nisl iaculis ipsum, in dictum tellus dolor sed neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui.
Interdum et malesuada fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae, molestie nibh.
Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor bibendum, vel congue leo egestas.\n\n
Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit amet auctor at, mollis non turpis.
Nullam pretium libero vestibulum, finibus orci vel, molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero
facilisis et. Integer interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at lacinia sit
amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula, in lobortis sem porta sed. Integer id ultrices
magna, in luctus elit. Sed a pellentesque est.\n\n
Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh. Morbi laoreet, tortor sed facilisis
varius, nibh orci rhoncus nulla, id elementum leo dui non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu
libero sed commodo. In eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc, quis imperdiet
eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra ipsum. Nunc quis augue egestas, cursus lorem at,
molestie sem. Morbi a consectetur ipsum, a placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet
finibus convallis.\n\n
Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In
volutpat arcu ut felis sagittis, in finibus massa gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur
ullamcorper, libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper sodales. Praesent bibendum
rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus libero vel nunc consequat, quis tincidunt nisl eleifend. Cras
bibendum enim a justo luctus vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
</string>
<string
name=
"phone_number"
>
Phone number
</string>
<string
name=
"link_website"
>
Link Website
</string>
</resources>
\ 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