Commit c41c9a24 authored by wanglei's avatar wanglei

...

parent 59d0e3ae
...@@ -4,9 +4,10 @@ ...@@ -4,9 +4,10 @@
<uses-feature <uses-feature
android:name="android.hardware.camera" android:name="android.hardware.camera"
android:required="false" /> <!-- 获取wifi列表 --> android:required="false" />
<!-- 获取wifi列表 --> <uses-feature
<!-- 获取wifi列表 --> android:name="android.hardware.telephony"
android:required="false" /> <!---->
<!-- 获取wifi列表 --> <!-- 获取wifi列表 -->
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...@@ -15,15 +16,13 @@ ...@@ -15,15 +16,13 @@
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <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_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_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" />
<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.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CALL_PHONE" />
<application <application
......
package com.base.scanqr.ui.contact package com.base.scanqr.ui.contact
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.base.BaseActivity
import com.base.scanqr.databinding.ActivityContractBinding import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.databinding.ActivityContractCodeBinding
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.intentShareImage
import com.base.scanqr.utils.IntentUtils.intentWriteContract
import com.base.scanqr.utils.LogEx
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 ContractCodeActivity : BaseActivity<ActivityContractBinding>(ActivityContractBinding::inflate) { class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityContractCodeBinding::inflate) {
private var contractUIBean = ContractUIBean()
private var tempImage: String = ""
private var contractQrString = ""
override fun onResumeOneShoot() {
super.onResumeOneShoot()
val flag = changeLanguage()
if (flag) return
AdsMgr.showBanner(binding.flBanner, false)
}
override fun initView() { override fun initView() {
super.initView() super.initView()
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_item)
val data = intent.extras?.getString("data")
data?.let {
contractUIBean = Gson().fromJson(data, ContractUIBean::class.java)
binding.tvName.text = contractUIBean.n
binding.tvTel.text = contractUIBean.tel
binding.tvEmail.text = contractUIBean.email
binding.tvAddress.text = contractUIBean.adr
}
Thread {
contractQrString = ContractUIBean.createContractQrString(contractUIBean)
LogEx.logDebug(TAG, "contractQrString=$contractQrString")
val bitmap = generateQRCode(contractQrString, 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 (contractUIBean.needCreate) {
contractUIBean.needCreate = false
SpJsonUtils.addJsonBean<ContractUIBean>(FunctionUIBean.KEY_CONTACT, contractUIBean)
}
}
}.start()
} }
override fun initListener() { override fun initListener() {
super.initListener() super.initListener()
onBackPressedDispatcher.addCallback {
AdsMgr.showInsert(this@ContractCodeActivity, 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.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage)
runCatching {
startActivity(intent)
}
}
binding.llPdf.setOnClickListener {
toast("没实现")
}
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, contractQrString)
toast("Copied to clipboard", true)
}
launcher.launch(arrayOf(Manifest.permission.WRITE_CONTACTS)) {
}
binding.flSearch.setOnClickListener {
try {
val intent = intentWriteContract(contractUIBean)
startActivity(intent)
} catch (e: Exception) {
toast("No application was found to handle the add contract", true)
}
}
} }
} }
\ No newline at end of file
...@@ -6,6 +6,7 @@ import android.view.ViewGroup ...@@ -6,6 +6,7 @@ import android.view.ViewGroup
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.bean.AdScanBean import com.base.scanqr.bean.AdScanBean
import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.EmailUIBean import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_CONTACT import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_CONTACT
...@@ -85,7 +86,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() { ...@@ -85,7 +86,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
} }
KEY_CONTACT -> { KEY_CONTACT -> {
if (item is ContractUIBean) {
binding.ivIcon.setImageResource(R.mipmap.h_contact)
}
} }
KEY_WEBSITE -> { KEY_WEBSITE -> {
......
...@@ -12,6 +12,7 @@ import com.base.scanqr.bean.AdScanBean ...@@ -12,6 +12,7 @@ import com.base.scanqr.bean.AdScanBean
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.ScanBean import com.base.scanqr.bean.ScanBean
import com.base.scanqr.databinding.FragmentHistoryBinding import com.base.scanqr.databinding.FragmentHistoryBinding
import com.base.scanqr.ui.contact.ContractCodeActivity
import com.base.scanqr.ui.email.EmailCodeActivity import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.event.EventCodeActivity import com.base.scanqr.ui.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity import com.base.scanqr.ui.product.ProductCodeActivity
...@@ -113,6 +114,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind ...@@ -113,6 +114,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
putExtra("data", Gson().toJson(item)) putExtra("data", Gson().toJson(item))
}) })
} }
FunctionUIBean.KEY_CONTACT -> {
activity?.startActivity(Intent(activity, ContractCodeActivity::class.java).apply {
putExtra("data", Gson().toJson(item))
})
}
} }
} }
......
...@@ -2,6 +2,7 @@ package com.base.scanqr.ui.main ...@@ -2,6 +2,7 @@ package com.base.scanqr.ui.main
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.EmailUIBean import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
...@@ -42,6 +43,8 @@ class HistoryViewModel() : ViewModel() { ...@@ -42,6 +43,8 @@ class HistoryViewModel() : ViewModel() {
eventList.forEach { it.listContent = it.summary } eventList.forEach { it.listContent = it.summary }
val telephoneList = SpJsonUtils.getSpJsonList<TelephoneUIBean>(FunctionUIBean.KEY_TELEPHONE) val telephoneList = SpJsonUtils.getSpJsonList<TelephoneUIBean>(FunctionUIBean.KEY_TELEPHONE)
telephoneList.forEach { it.listContent = it.tel } telephoneList.forEach { it.listContent = it.tel }
val contractList = SpJsonUtils.getSpJsonList<ContractUIBean>(FunctionUIBean.KEY_CONTACT)
contractList.forEach { it.listContent = it.n }
historyList.addAll(wifiList) historyList.addAll(wifiList)
historyList.addAll(textList) historyList.addAll(textList)
...@@ -50,6 +53,7 @@ class HistoryViewModel() : ViewModel() { ...@@ -50,6 +53,7 @@ class HistoryViewModel() : ViewModel() {
historyList.addAll(productList) historyList.addAll(productList)
historyList.addAll(eventList) historyList.addAll(eventList)
historyList.addAll(telephoneList) historyList.addAll(telephoneList)
historyList.addAll(contractList)
historyList.forEach { historyList.forEach {
LogEx.logDebug(TAG, "${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}") LogEx.logDebug(TAG, "${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}")
...@@ -85,7 +89,9 @@ class HistoryViewModel() : ViewModel() { ...@@ -85,7 +89,9 @@ class HistoryViewModel() : ViewModel() {
} }
FunctionUIBean.KEY_CONTACT -> { FunctionUIBean.KEY_CONTACT -> {
SpJsonUtils.removeJsonBean<ContractUIBean>(bean.scanType, bean as ContractUIBean, removeIf = { it1, it2 ->
it1.createTime == it2.createTime
})
} }
FunctionUIBean.KEY_WEBSITE -> { FunctionUIBean.KEY_WEBSITE -> {
......
...@@ -13,6 +13,8 @@ import com.base.scanqr.R ...@@ -13,6 +13,8 @@ import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
import com.base.scanqr.base.BaseFragment import com.base.scanqr.base.BaseFragment
import com.base.scanqr.bean.ContractUIBean.Companion.createContractBean
import com.base.scanqr.bean.ContractUIBean.Companion.isContractQR
import com.base.scanqr.bean.EmailUIBean.Companion.createEmailBean import com.base.scanqr.bean.EmailUIBean.Companion.createEmailBean
import com.base.scanqr.bean.EmailUIBean.Companion.isEmailQR import com.base.scanqr.bean.EmailUIBean.Companion.isEmailQR
import com.base.scanqr.bean.EventUIBean.Companion.createEventBean import com.base.scanqr.bean.EventUIBean.Companion.createEventBean
...@@ -28,6 +30,7 @@ import com.base.scanqr.bean.WifiUIBean.Companion.createWifiBean ...@@ -28,6 +30,7 @@ import com.base.scanqr.bean.WifiUIBean.Companion.createWifiBean
import com.base.scanqr.bean.WifiUIBean.Companion.isWifiQR import com.base.scanqr.bean.WifiUIBean.Companion.isWifiQR
import com.base.scanqr.databinding.FragmentScanBinding import com.base.scanqr.databinding.FragmentScanBinding
import com.base.scanqr.qr.QRImageAnalyzer import com.base.scanqr.qr.QRImageAnalyzer
import com.base.scanqr.ui.contact.ContractCodeActivity
import com.base.scanqr.ui.email.EmailCodeActivity import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.event.EventCodeActivity import com.base.scanqr.ui.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity import com.base.scanqr.ui.product.ProductCodeActivity
...@@ -146,6 +149,24 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -146,6 +149,24 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
}) })
return return
} }
if (isContractQR(qrCodeValue)) {
if (scanJump.get()) return
scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
override fun close(where: Int) {
jumpContractCodeActivity(activity, qrCodeValue)
}
override fun failed(where: Int) {
jumpContractCodeActivity(activity, qrCodeValue)
}
override fun googleFailed(where: Int) {
jumpContractCodeActivity(activity, qrCodeValue)
}
})
return
}
if (isTelephoneQR(qrCodeValue)) { if (isTelephoneQR(qrCodeValue)) {
if (scanJump.get()) return if (scanJump.get()) return
scanJump.set(true) scanJump.set(true)
...@@ -263,6 +284,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -263,6 +284,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
} }
} }
private fun jumpContractCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, ContractCodeActivity::class.java).apply {
val bean = createContractBean(qrCodeValue)
bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean))
})
}
private fun jumpTelephoneCodeActivity(activity: MainActivity, qrCodeValue: String) { private fun jumpTelephoneCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, TelephoneCodeActivity::class.java).apply { activity.startActivity(Intent(activity, TelephoneCodeActivity::class.java).apply {
val bean = createTelephoneBean(qrCodeValue) val bean = createTelephoneBean(qrCodeValue)
......
...@@ -45,10 +45,10 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i ...@@ -45,10 +45,10 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override fun initView() { override fun initView() {
super.initView() super.initView()
//
startActivity(Intent(this, ContractActivity::class.java)) // startActivity(Intent(this, ContractActivity::class.java))
finish() // finish()
return // return
NotificationHoverUtils.stopNotificationHandler() NotificationHoverUtils.stopNotificationHandler()
......
package com.base.scanqr.utils package com.base.scanqr.utils
import android.content.ContentValues
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
...@@ -8,6 +9,7 @@ import android.provider.CalendarContract ...@@ -8,6 +9,7 @@ import android.provider.CalendarContract
import android.provider.ContactsContract import android.provider.ContactsContract
import android.provider.Settings import android.provider.Settings
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.EmailUIBean import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean import com.base.scanqr.bean.EventUIBean
import java.io.File import java.io.File
...@@ -128,4 +130,27 @@ object IntentUtils { ...@@ -128,4 +130,27 @@ object IntentUtils {
val shareIntent = Intent.createChooser(callIntent, null) val shareIntent = Intent.createChooser(callIntent, null)
return shareIntent return shareIntent
} }
fun intentWriteContract(bean: ContractUIBean): Intent {
val intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI)
intent.putExtra(ContactsContract.Intents.Insert.NAME, bean.n)
intent.putExtra(ContactsContract.Intents.Insert.PHONE, bean.tel)
intent.putExtra(ContactsContract.Intents.Insert.EMAIL, bean.email)
//竞品拿个公司地址,受不了
intent.putExtra(ContactsContract.Intents.Insert.COMPANY, bean.adr)
// val values = ContentValues().apply {
// put(
// ContactsContract.CommonDataKinds.StructuredPostal.TYPE,
// ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER
// )
// put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, bean.adr)
// }
// val dataArrayList = ArrayList<ContentValues>()
// dataArrayList.add(values)
//
// intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA,dataArrayList)
val shareIntent = Intent.createChooser(intent, null)
return shareIntent
}
} }
\ No newline at end of file
...@@ -25,6 +25,10 @@ object PermissionUtils { ...@@ -25,6 +25,10 @@ object PermissionUtils {
fun Context.checkContactsReadPermission(): Boolean { fun Context.checkContactsReadPermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
} }
fun Context.checkContactsWritePermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS)
}
//endregion //endregion
//region 相机 //region 相机
......
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