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
6bf7fa23
Commit
6bf7fa23
authored
Jan 03, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
dec60fd7
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
419 additions
and
65 deletions
+419
-65
build.gradle.kts
app/build.gradle.kts
+7
-4
proguard-rules.pro
app/proguard-rules.pro
+4
-1
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+20
-11
MyApplication.kt
app/src/main/java/com/base/scanqr/MyApplication.kt
+41
-33
TelephoneUIBean.kt
app/src/main/java/com/base/scanqr/bean/TelephoneUIBean.kt
+22
-0
EventUtils.kt
app/src/main/java/com/base/scanqr/helper/EventUtils.kt
+6
-3
NewComUtils.kt
app/src/main/java/com/base/scanqr/helper/NewComUtils.kt
+11
-5
EventCodeActivity.kt
...c/main/java/com/base/scanqr/ui/event/EventCodeActivity.kt
+0
-3
CreateFragment.kt
app/src/main/java/com/base/scanqr/ui/main/CreateFragment.kt
+7
-1
StartActivity.kt
app/src/main/java/com/base/scanqr/ui/start/StartActivity.kt
+2
-1
TelephoneActivity.kt
...in/java/com/base/scanqr/ui/telephone/TelephoneActivity.kt
+70
-0
ContactUtils.kt
app/src/main/java/com/base/scanqr/utils/ContactUtils.kt
+40
-0
IntentUtils.kt
app/src/main/java/com/base/scanqr/utils/IntentUtils.kt
+9
-0
WriteLogEx.kt
app/src/main/java/com/base/scanqr/utils/WriteLogEx.kt
+25
-0
activity_telephone.xml
app/src/main/res/layout/activity_telephone.xml
+141
-0
themes.xml
app/src/main/res/values-v23/themes.xml
+10
-3
dimens.xml
app/src/main/res/values/dimens.xml
+1
-0
strings.xml
app/src/main/res/values/strings.xml
+3
-0
smartcl.jks
smartcl.jks
+0
-0
No files found.
app/build.gradle.kts
View file @
6bf7fa23
...
...
@@ -42,10 +42,6 @@ android {
release
{
isMinifyEnabled
=
true
proguardFiles
(
getDefaultProguardFile
(
"proguard-android-optimize.txt"
),
"proguard-rules.pro"
)
// 设置是否要自动上传
firebaseCrashlytics
{
mappingFileUploadEnabled
=
true
}
signingConfig
=
signingConfigs
.
getByName
(
"release"
)
}
}
...
...
@@ -63,6 +59,13 @@ android {
}
}
gradle
.
taskGraph
.
whenReady
{
tasks
.
forEach
{
task
->
if
(
task
.
name
.
contains
(
"uploadCrashlyticsMappingFile"
))
{
task
.
enabled
=
false
}
}
}
dependencies
{
...
...
app/proguard-rules.pro
View file @
6bf7fa23
...
...
@@ -21,9 +21,12 @@
#-renamesourcefileattribute SourceFile
-
keep
class
com
.
base
.
scanqr
.
bean
.
**
{
*
;
}
-
keep
class
com
.
google
.
gson
.
reflect
.
**
{
*
;
}
-
keep
class
*
extends
com
.
google
.
gson
.
reflect
.
TypeToken
-
keep
class
com
.
google
.
gson
.
stream
.
**
{
*
;
}
-
keep
class
com
.
squareup
.
okhttp
.
**
{
*
;
}
-
keepattributes
*
Annotation
*
-
keep
class
*
extends
com
.
google
.
gson
.
TypeAdapter
-
keep
class
*
extends
com
.
google
.
gson
.
JsonSerializer
-
keep
class
*
extends
com
.
google
.
gson
.
Deserializer
-
keep
class
com
.
google
.
gson
.
TypeAdapters
{
*
;}
\ No newline at end of file
-
keep
class
com
.
google
.
gson
.
TypeAdapters
{
*
;}
-
keep
class
com
.
bytedance
.
sdk
.
**
{
*
;
}
app/src/main/AndroidManifest.xml
View file @
6bf7fa23
...
...
@@ -5,8 +5,7 @@
<uses-feature
android:name=
"android.hardware.camera"
android:required=
"false"
/>
<!-- 获取wifi列表 -->
<!-- 获取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"
/>
...
...
@@ -15,13 +14,12 @@
<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.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.
WRITE_CALENDAR
"
/>
<uses-permission
android:name=
"android.permission.
READ_CONTACTS
"
/>
<application
android:name=
".MyApplication"
...
...
@@ -34,12 +32,7 @@
android:supportsRtl=
"true"
android:theme=
"@style/Theme.ScanQR"
tools:targetApi=
"31"
>
<activity
android:name=
".ui.event.EventCodeActivity"
android:exported=
"false"
/>
<activity
android:name=
".ui.event.EventActivity"
android:exported=
"false"
/>
<activity
android:name=
".ui.start.StartActivity"
android:exported=
"true"
...
...
@@ -59,6 +52,22 @@
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.telephone.TelephoneActivity"
android:exported=
"false"
android:screenOrientation=
"portrait"
android:theme=
"@style/Theme.ScanQR"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.event.EventCodeActivity"
android:exported=
"false"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.event.EventActivity"
android:exported=
"false"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".ui.email.EmailCodeActivity"
android:exported=
"false"
...
...
app/src/main/java/com/base/scanqr/MyApplication.kt
View file @
6bf7fa23
...
...
@@ -32,6 +32,7 @@ import com.base.scanqr.utils.LogEx
import
com.base.scanqr.utils.SolarEngineUtils
import
com.base.scanqr.utils.SolarEngineUtils.initSolarEngine
import
com.base.scanqr.utils.SolarEngineUtils.solarkey
import
com.base.scanqr.utils.WriteLogEx.writeLogFile
import
com.facebook.FacebookSdk
import
com.google.android.gms.ads.identifier.AdvertisingIdClient
import
com.google.gson.Gson
...
...
@@ -126,15 +127,7 @@ class MyApplication : Application() {
FCMManager
.
initFirebase
(
this
)
FCMManager
.
subscribeToTopic
(
topic
)
initConfig
()
Thread
{
InstallHelps
.
init
{
initRemoteConfig
()
}
// val json = Gson().toJson(ConfigBean())
// LogEx.logDebug(TAG, "json=$json")
}.
start
()
initAppConfig
()
SolarEngineManager
.
getInstance
().
preInit
(
this
,
solarkey
)
...
...
@@ -162,6 +155,20 @@ class MyApplication : Application() {
appContext
.
initSolarEngine
(
true
)
}
private
fun
initAppConfig
()
{
Thread
{
val
config
=
AppPreferences
.
getInstance
().
getString
(
"config"
,
""
)
if
(
config
.
isNotEmpty
())
{
initConfig
(
config
)
}
InstallHelps
.
init
{
initRemoteConfig
()
}
}.
start
()
}
private
var
lastTimePause
=
0L
private
var
lastTimeResume
=
0L
...
...
@@ -232,43 +239,44 @@ class MyApplication : Application() {
private
fun
initRemoteConfig
()
{
LogEx
.
logDebug
(
TAG
,
"initRemoteConfig"
)
NewComUtils
.
requestCfg
{
config
->
if
(
config
!=
null
)
{
AppPreferences
.
getInstance
().
put
(
"config"
,
config
)
initConfig
(
config
)
LogEx
.
logDebug
(
"requestCfg"
,
"config=$config"
)
}
else
{
EventUtils
.
event
(
"configNull"
)
writeLogFile
(
"config"
,
"configNull"
)
}
LogEx
.
logDebug
(
"requestCfg"
,
"config=$config"
)
initConfig
(
config
)
}
}
private
fun
initConfig
(
config
:
String
?
=
AppPreferences
.
getInstance
().
getString
(
"config"
,
""
)
)
{
private
fun
initConfig
(
config
:
String
)
{
kotlin
.
runCatching
{
val
configBean
=
Gson
().
fromJson
(
config
,
ConfigBean
::
class
.
java
)
//
kotlin.runCatching {
val
configBean
=
Gson
().
fromJson
(
config
,
ConfigBean
::
class
.
java
)
val
jsonObject
=
JSONObject
()
jsonObject
.
put
(
"ut"
,
configBean
.
ut
)
EventUtils
.
event
(
"user_type"
,
ext
=
jsonObject
)
LogEx
.
logDebug
(
"initConfig"
,
"ut=${configBean.ut}"
)
writeLogFile
(
"config"
,
config
)
//配置
ConfigBean
.
configBean
=
configBean
val
jsonObject
=
JSONObject
()
jsonObject
.
put
(
"ut"
,
configBean
.
ut
)
EventUtils
.
event
(
"user_type"
,
ext
=
jsonObject
)
LogEx
.
logDebug
(
"initConfig"
,
"ut=${configBean.ut}"
)
//广告
AdConfigBean
.
adsConfigBean
=
configBean
.
adConfigBean
LogEx
.
logDebug
(
"initConfig"
,
"adsConfigBean=${AdConfigBean.adsConfigBean.timeInterval}"
)
//配置
ConfigBean
.
configBean
=
configBean
//通知
PopupConfigBean
.
popupConfigBean
=
configBean
.
popup
ConfigBean
LogEx
.
logDebug
(
"initConfig"
,
"popupConfigBean=${PopupConfigBean.popupConfigBean.popupCount
}"
)
//广告
AdConfigBean
.
adsConfigBean
=
configBean
.
ad
ConfigBean
LogEx
.
logDebug
(
"initConfig"
,
"adsConfigBean=${AdConfigBean.adsConfigBean.timeInterval
}"
)
//启动定时器
changeTimer
()
}
//通知
PopupConfigBean
.
popupConfigBean
=
configBean
.
popupConfigBean
LogEx
.
logDebug
(
"initConfig"
,
"popupConfigBean=${PopupConfigBean.popupConfigBean.popupCount}"
)
//启动定时器
changeTimer
()
// }
}
...
...
app/src/main/java/com/base/scanqr/bean/TelephoneUIBean.kt
0 → 100644
View file @
6bf7fa23
package
com.base.scanqr.bean
data class
TelephoneUIBean
(
var
tel
:
String
=
""
)
:
ScanBean
(
FunctionUIBean
.
KEY_TELEPHONE
)
{
companion
object
{
fun
isWifiQR
(
qrCodeValue
:
String
):
Boolean
{
if
(
qrCodeValue
.
startsWith
(
"tel:"
))
{
return
true
}
return
false
}
fun
createTelephoneBean
(
qrCodeValue
:
String
):
TelephoneUIBean
{
val
bean
=
TelephoneUIBean
()
val
kv
=
qrCodeValue
.
split
(
":"
)
bean
.
tel
=
kv
[
1
]
return
bean
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/helper/EventUtils.kt
View file @
6bf7fa23
...
...
@@ -31,6 +31,7 @@ object EventUtils {
if
(!
ifAgreePrivacy
)
{
return
}
LogEx
.
logDebug
(
TAG
,
"key=$key ext=$ext"
)
Thread
{
var
paramJson
:
String
?
=
""
...
...
@@ -57,13 +58,15 @@ object EventUtils {
.
put
(
"data"
,
s
)
.
put
(
"bp"
,
s2
)
.
toString
()
LogEx
.
logDebug
(
TAG
,
"uuid=${AppPreferences.getInstance().getString("
uuid
", "")}"
)
LogEx
.
logDebug
(
TAG
,
"gid=${AppPreferences.getInstance().getString("
gid
", "")}"
)
// LogEx.logDebug(TAG, "key=$key data=$data")
// LogEx.logDebug(TAG, "uuid=${AppPreferences.getInstance().getString("uuid", "")}")
// LogEx.logDebug(TAG, "gid=${AppPreferences.getInstance().getString("gid", "")}")
paramJson
=
AESHelper
.
encrypt
(
data
)
}
catch
(
e
:
JSONException
)
{
paramJson
=
""
}
LogEx
.
logDebug
(
TAG
,
"url=$url"
)
LogEx
.
logDebug
(
TAG
,
"key=$key url=$url"
)
doPost
(
url
,
HashMap
(),
...
...
app/src/main/java/com/base/scanqr/helper/NewComUtils.kt
View file @
6bf7fa23
...
...
@@ -5,6 +5,7 @@ import com.base.scanqr.BuildConfig
import
com.base.scanqr.GlobalConfig
import
com.base.scanqr.utils.AppPreferences
import
com.base.scanqr.utils.LogEx
import
com.base.scanqr.utils.WriteLogEx.writeLogFile
import
kotlinx.coroutines.CoroutineScope
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
...
...
@@ -37,7 +38,9 @@ object NewComUtils {
"&device=${AppPreferences.getInstance().getString("
gid
", "")}"
+
"&aid=${AppPreferences.getInstance().getString("
uuid
", "")}"
s
=
if
(
BuildConfig
.
DEBUG
)
"$s&mode=4"
else
""
if
(
BuildConfig
.
DEBUG
)
{
s
=
"$s&mode=2"
}
s
// mode =3 google mode=2 facebook mode=1 自然,mode=4 测试
// &mode=3
...
...
@@ -47,6 +50,7 @@ object NewComUtils {
fun
requestCfg
(
callback
:
(
json
:
String
?)
->
Unit
)
{
CoroutineScope
(
Dispatchers
.
IO
).
launch
{
val
response
=
doGet
()
writeLogFile
(
"response"
,
response
.
toString
())
if
(
response
==
null
)
{
withContext
(
Dispatchers
.
Main
)
{
callback
(
null
)
...
...
@@ -55,6 +59,7 @@ object NewComUtils {
}
val
data
=
extractData
(
response
)
writeLogFile
(
"extractData"
,
data
.
toString
())
if
(
data
==
null
)
{
withContext
(
Dispatchers
.
Main
)
{
callback
(
null
)
...
...
@@ -76,14 +81,15 @@ object NewComUtils {
val
conn
:
HttpURLConnection
=
URL
(
urlPath
).
openConnection
()
as
HttpURLConnection
conn
.
setRequestMethod
(
"GET"
)
conn
.
connectTimeout
=
150000
if
(
200
==
conn
.
getResponseCode
())
{
val
code
=
conn
.
getResponseCode
()
writeLogFile
(
"code"
,
code
.
toString
())
if
(
200
==
code
)
{
val
json
=
BufferedReader
(
InputStreamReader
(
conn
.
inputStream
)).
readLine
()
LogEx
.
logDebug
(
TAG
,
"json=$json"
)
writeLogFile
(
"json"
,
json
)
return
json
}
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
Log
.
d
(
"okhttp"
,
e
.
toString
())
writeLogFile
(
"Exception"
,
e
.
message
.
toString
())
}
return
null
}
...
...
app/src/main/java/com/base/scanqr/ui/event/EventCodeActivity.kt
View file @
6bf7fa23
...
...
@@ -45,9 +45,6 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo
super
.
initView
()
binding
.
clTop
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
launcher
.
launch
(
arrayOf
(
Manifest
.
permission
.
WRITE_CALENDAR
))
{}
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_item
)
val
data
=
intent
.
extras
?.
getString
(
"data"
)
...
...
app/src/main/java/com/base/scanqr/ui/main/CreateFragment.kt
View file @
6bf7fa23
...
...
@@ -10,12 +10,14 @@ import com.base.scanqr.base.BaseFragment
import
com.base.scanqr.bean.FunctionUIBean
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EVENT
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_TELEPHONE
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_TEXT
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WEBSITE
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
import
com.base.scanqr.databinding.FragmentCreateBinding
import
com.base.scanqr.ui.email.EmailActivity
import
com.base.scanqr.ui.event.EventActivity
import
com.base.scanqr.ui.telephone.TelephoneActivity
import
com.base.scanqr.ui.text.TextActivity
import
com.base.scanqr.ui.website.WebsiteActivity
import
com.base.scanqr.ui.wifi.WifiActivity
...
...
@@ -42,7 +44,7 @@ class CreateFragment : BaseFragment<FragmentCreateBinding>(FragmentCreateBinding
FunctionUIBean
(
KEY_EVENT
,
R
.
mipmap
.
h_event
,
resources
.
getString
(
R
.
string
.
event
)),
// FunctionUIBean(KEY_CONTACT, R.mipmap.h_contact, resources.getString(R.string.contact)),
// FunctionUIBean(KEY_LOCATION, R.mipmap.h_loction, resources.getString(R.string.location)),
//
FunctionUIBean(KEY_TELEPHONE, R.mipmap.h_telephone, resources.getString(R.string.telephone)),
FunctionUIBean
(
KEY_TELEPHONE
,
R
.
mipmap
.
h_telephone
,
resources
.
getString
(
R
.
string
.
telephone
)),
// FunctionUIBean(KEY_MESSAGE, R.mipmap.h_message, resources.getString(R.string.message)),
)
)
...
...
@@ -88,6 +90,10 @@ class CreateFragment : BaseFragment<FragmentCreateBinding>(FragmentCreateBinding
KEY_EVENT
->
{
startActivity
(
Intent
(
requireContext
(),
EventActivity
::
class
.
java
))
}
KEY_TELEPHONE
->
{
startActivity
(
Intent
(
requireContext
(),
TelephoneActivity
::
class
.
java
))
}
}
}
...
...
app/src/main/java/com/base/scanqr/ui/start/StartActivity.kt
View file @
6bf7fa23
...
...
@@ -23,6 +23,7 @@ import com.base.scanqr.ui.email.EmailActivity
import
com.base.scanqr.ui.event.EventActivity
import
com.base.scanqr.ui.language.LanguageActivity
import
com.base.scanqr.ui.main.MainActivity
import
com.base.scanqr.ui.telephone.TelephoneActivity
import
com.base.scanqr.ui.text.TextActivity
import
com.base.scanqr.ui.website.WebsiteActivity
import
com.base.scanqr.ui.wifi.WifiActivity
...
...
@@ -44,7 +45,7 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override
fun
initView
()
{
super
.
initView
()
startActivity
(
Intent
(
this
,
Event
Activity
::
class
.
java
))
startActivity
(
Intent
(
this
,
Telephone
Activity
::
class
.
java
))
finish
()
return
...
...
app/src/main/java/com/base/scanqr/ui/telephone/TelephoneActivity.kt
0 → 100644
View file @
6bf7fa23
package
com.base.scanqr.ui.telephone
import
android.net.Uri
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.core.widget.addTextChangedListener
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.TelephoneUIBean
import
com.base.scanqr.databinding.ActivityTelephoneBinding
import
com.base.scanqr.utils.BarUtils
import
com.base.scanqr.utils.IntentUtils.intentPickContacts
import
com.base.scanqr.utils.ToastUtils.toast
class
TelephoneActivity
:
BaseActivity
<
ActivityTelephoneBinding
>(
ActivityTelephoneBinding
::
inflate
)
{
private
var
telephoneBean
=
TelephoneUIBean
()
override
fun
onResumeOneShoot
()
{
super
.
onResumeOneShoot
()
val
flag
=
changeLanguage
()
if
(
flag
)
return
}
override
fun
initView
()
{
super
.
initView
()
binding
.
clTop
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_app_exit
)
}
override
fun
initListener
()
{
super
.
initListener
()
onBackPressedDispatcher
.
addCallback
{
AdsMgr
.
showInsert
(
this
@TelephoneActivity
,
false
,
object
:
AdsShowCallBack
()
{
override
fun
close
(
where
:
Int
)
{
finishToMainTop
()
}
override
fun
failed
(
where
:
Int
)
{
finishToMainTop
()
}
override
fun
googleFailed
(
where
:
Int
)
{
finishToMainTop
()
}
})
}
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
binding
.
edit
.
addTextChangedListener
{
s
->
telephoneBean
.
tel
=
s
.
toString
()
}
binding
.
tvSelect
.
setOnClickListener
{
val
intent
=
intentPickContacts
()
try
{
launcher
.
launch
(
intent
)
{
result
->
val
contactUri
:
Uri
?
=
result
.
data
?.
data
}
}
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/utils/ContactUtils.kt
0 → 100644
View file @
6bf7fa23
package
com.base.scanqr.utils
import
android.annotation.SuppressLint
import
android.content.ContentUris
import
android.content.Context
import
android.net.Uri
import
android.provider.ContactsContract
object
ContactUtils
{
@SuppressLint
(
"Range"
)
fun
Context
.
queryTel
(
contactUri
:
Uri
)
{
val
cursor
=
contentResolver
.
query
(
contactUri
,
null
,
null
,
null
,
null
)
cursor
?.
use
{
if
(
it
.
moveToFirst
())
{
val
phoneId
=
it
.
getLong
(
it
.
getColumnIndex
(
ContactsContract
.
CommonDataKinds
.
Phone
.
_ID
))
val
phoneCursor
=
contentResolver
.
query
(
ContentUris
.
withAppendedId
(
ContactsContract
.
CommonDataKinds
.
Phone
.
CONTENT_URI
,
phoneId
),
null
,
null
,
null
,
null
)
phoneCursor
?.
use
{
if
(
it
.
moveToFirst
())
{
val
phoneNumber
=
phoneCursor
.
getString
(
phoneCursor
.
getColumnIndex
(
ContactsContract
.
CommonDataKinds
.
Phone
.
NUMBER
))
// 使用phoneNumber
}
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/utils/IntentUtils.kt
View file @
6bf7fa23
...
...
@@ -5,6 +5,7 @@ import android.content.Intent
import
android.net.Uri
import
android.os.Build
import
android.provider.CalendarContract
import
android.provider.ContactsContract
import
android.provider.Settings
import
androidx.core.content.FileProvider
import
com.base.scanqr.bean.EmailUIBean
...
...
@@ -113,4 +114,12 @@ object IntentUtils {
intent
.
putExtra
(
CalendarContract
.
Events
.
EVENT_LOCATION
,
eventUIBean
.
location
)
return
intent
}
fun
intentPickContacts
():
Intent
{
val
intent
=
Intent
(
Intent
.
ACTION_PICK
)
intent
.
setType
(
ContactsContract
.
Contacts
.
CONTENT_TYPE
)
val
chooser
=
Intent
.
createChooser
(
intent
,
null
)
return
chooser
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/utils/WriteLogEx.kt
0 → 100644
View file @
6bf7fa23
package
com.base.scanqr.utils
import
android.os.Environment
import
com.base.scanqr.BuildConfig
import
com.base.scanqr.MyApplication
import
com.base.scanqr.R
import
com.base.scanqr.utils.KotlinExt.toFormatTime2
import
java.io.File
object
WriteLogEx
{
private
val
logoDir
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
val
appName
=
MyApplication
.
appContext
.
resources
.
getString
(
R
.
string
.
app_name
)
val
log
=
File
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DOCUMENTS
),
"${appName}_logo"
)
if
(!
log
.
exists
())
log
.
mkdirs
()
log
}
fun
writeLogFile
(
key
:
String
,
log
:
String
)
{
if
(!
BuildConfig
.
DEBUG
)
return
val
logName
=
key
+
"_"
+
System
.
currentTimeMillis
().
toFormatTime2
()
+
".txt"
val
logFile
=
File
(
logoDir
,
logName
)
logFile
.
createNewFile
()
logFile
.
writeText
(
log
,
Charsets
.
UTF_8
)
}
}
\ No newline at end of file
app/src/main/res/layout/activity_telephone.xml
0 → 100644
View file @
6bf7fa23
<?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.website.WebsiteActivity"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:id=
"@+id/cl_top"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:layout_constraintTop_toTopOf=
"parent"
>
<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"
/>
<FrameLayout
android:id=
"@+id/fl_queren"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:padding=
"20dp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/queren"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintTop_toBottomOf=
"@id/cl_top"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"16dp"
android:layout_marginTop=
"18dp"
android:text=
"@string/phone"
android:textColor=
"#6473F8"
android:textSize=
"16sp"
/>
<EditText
android:id=
"@+id/edit"
android:layout_width=
"match_parent"
android:layout_height=
"52dp"
android:layout_marginHorizontal=
"16dp"
android:layout_marginTop=
"8dp"
android:layout_marginBottom=
"8dp"
android:background=
"@drawable/bg_f4f4f4_15"
android:hint=
"@string/enter_phone_number"
android:inputType=
"textUri"
android:paddingHorizontal=
"14dp"
android:textColor=
"@color/black"
android:textColorHint=
"#999999"
tools:ignore=
"Autofill"
/>
<TextView
android:id=
"@+id/tvSelect"
android:layout_width=
"match_parent"
android:layout_height=
"52dp"
android:layout_marginHorizontal=
"16dp"
android:layout_marginTop=
"18dp"
android:background=
"@drawable/bg_stroke_6473f8_90"
android:gravity=
"center"
android:text=
"@string/select_in_contacts"
android:textColor=
"#6473F8"
android:textSize=
"17sp"
/>
<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=
"16dp"
android:background=
"@drawable/bg_ecf6ff_10"
android:minHeight=
"258dp"
android:paddingTop=
"20dp"
android:paddingBottom=
"20dp"
app:layout_constraintBottom_toBottomOf=
"parent"
>
<io.supercharge.shimmerlayout.ShimmerLayout
android:id=
"@+id/shimmerLayout"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
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=
"wrap_content"
android:background=
"@mipmap/zhanweitu"
tools:ignore=
"ContentDescription,ImageContrastCheck"
/>
</io.supercharge.shimmerlayout.ShimmerLayout>
</com.base.scanqr.ads.NativeParentView>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/values-v23/themes.xml
View file @
6bf7fa23
...
...
@@ -2,8 +2,15 @@
<style
name=
"Theme.DataRecovery"
parent=
"Theme.ScanQR"
>
<!-- Transparent system bars for edge-to-edge. -->
<!-- <item name="android:navigationBarColor">@android:color/transparent</item>-->
<!-- <item name="android:statusBarColor">@android:color/transparent</item>-->
<!-- <item name="android:windowLightStatusBar">?attr/isLightTheme</item>-->
<!-- <item name="android:navigationBarColor">@android:color/transparent</item>-->
<!-- <item name="android:statusBarColor">@android:color/transparent</item>-->
<!-- <item name="android:windowLightStatusBar">?attr/isLightTheme</item>-->
</style>
<style
name=
"Theme.ScanQR"
parent=
"Base.Theme.ScanQR"
>
<!-- Transparent system bars for edge-to-edge. -->
<item
name=
"android:navigationBarColor"
>
@android:color/transparent
</item>
<item
name=
"android:statusBarColor"
>
@android:color/transparent
</item>
<item
name=
"android:windowLightStatusBar"
>
?attr/isLightTheme
</item>
</style>
</resources>
\ No newline at end of file
app/src/main/res/values/dimens.xml
View file @
6bf7fa23
...
...
@@ -28,4 +28,5 @@
<dimen
name=
"dp_110"
>
110dp
</dimen>
<dimen
name=
"dp_112"
>
112dp
</dimen>
<dimen
name=
"dp_114"
>
114dp
</dimen>
<dimen
name=
"fab_margin"
>
16dp
</dimen>
</resources>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
6bf7fa23
...
...
@@ -91,5 +91,8 @@
<string
name=
"datetime"
>
DateTime
</string>
<string
name=
"clean"
>
Clean
</string>
<string
name=
"ok"
>
OK
</string>
<string
name=
"phone"
>
Phone
</string>
<string
name=
"enter_phone_number"
>
Enter phone number
</string>
<string
name=
"select_in_contacts"
>
Select in contacts
</string>
</resources>
\ No newline at end of file
smartcl.jks
0 → 100644
View file @
6bf7fa23
File added
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