I try to share clipboard content ower network using with zxing QRCode and camera. I readed that onWindowFocuseChanged event is capable to access clipboard content and it works most of time. The clipDataOnResume member sometimes is null in onCreate. (“clipDataOnResume is null at onActivityResult” toast message appear)
What can I do to avoid this?
class MainActivity : AppCompatActivity() {
var clipDataOnResume: ClipData? = null
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
binding.btnScan.setOnClickListener {
val scanner = IntentIntegrator(this)
scanner.setOrientationLocked(true)
scanner.setPrompt("Scan a barcode.")
scanner.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)
scanner.setBarcodeImageEnabled(true)
scanner.initiateScan()
}
}
fun sendContentTask(url: String, clipboardContent: String): Int {
// Send clipboard content over network
}
fun getContentTask(url: String): String {
// Get clipboard content over network
}
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
if (result != null) {
if (result.getContents() == null) {
Toast.makeText(this, "Cancelled from fragment", Toast.LENGTH_LONG).show()
} else {
if (result.getContents().endsWith("post")) {
val manager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
var clipContent = ""
if (manager.hasPrimaryClip()) {
val clipData = manager.primaryClip
val item = clipData!!.getItemAt(0)
clipContent = item.text.toString()
} else if (clipDataOnResume != null && clipDataOnResume!!.itemCount > 0) {
val item = clipDataOnResume!!.getItemAt(0)
clipContent = item.text.toString()
}
if (clipContent == ""){
Toast.makeText(this, "clipDataOnResume is null at onActivityResult", Toast.LENGTH_LONG).show()
} else {
val url = result.getContents();
Toast.makeText(this, "Location: " + url, Toast.LENGTH_LONG).show()
runBlocking {
var result: Deferred<Unit> = async() {
withContext(Dispatchers.IO) {
val msg = sendContentTask(url, clipContent)
}
}
result.await()
}
}
} else if (result.getContents().endsWith("get")) {
val url = result.getContents()
Toast.makeText(this, "Location: " + url, Toast.LENGTH_LONG).show()
runBlocking {
var msg = ""
var result: Deferred<Unit> = async() {
withContext(Dispatchers.IO) {
msg = getContentTask(url)
}
}
result.await()
setClipboardContent(msg)
}
}
}
}
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) {
val manager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
clipDataOnResume = manager.primaryClip
if (clipDataOnResume == null) {
Toast.makeText(this, "clipDataOnResume is null at focus", Toast.LENGTH_LONG).show()
}
}
}
}