Önemli Not: Bu kodun çalışması için uygulamada dosya okuma izinlerinin alınmış olması gerekmektedir.
class YourActivity : AppCompatActivity() {
private val screenshotDetector by lazy {
ScreenshotDetector(this, onScreenshot = {
// TODO: write your progress
})
}
override fun onResume() {
super.onResume()
screenshotDetector.start()
}
override fun onPause() {
super.onPause()
screenshotDetector.stop()
}
}
class ScreenshotDetector(
private val context: Context,
private val onScreenshot: () -> Unit
) {
private var contentObserver: ContentObserver? = null
fun start() {
if (contentObserver == null) {
contentObserver = context.contentResolver.registerObserver()
}
}
fun stop() {
contentObserver?.let { context.contentResolver.unregisterContentObserver(it) }
contentObserver = null
}
private fun queryScreenshots(uri: Uri) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
queryRelativeDataColumn(uri)
} else {
queryDataColumn(uri)
}
}
private fun queryDataColumn(uri: Uri) {
val projection = arrayOf(
MediaStore.Images.Media.DATA
)
context.contentResolver.query(
uri, projection, null, null, null
)?.use { cursor ->
val dataColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATA)
while (cursor.moveToNext()) {
val path = cursor.getString(dataColumn)
if (path.contains("screenshot", true)) {
onScreenshot()
}
}
}
}
private fun queryRelativeDataColumn(uri: Uri) {
val projection = arrayOf(
MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.RELATIVE_PATH
)
context.contentResolver.query(
uri, projection, null, null, null
)?.use { cursor ->
val relativePathColumn = cursor.getColumnIndex(MediaStore.Images.Media.RELATIVE_PATH)
val displayNameColumn = cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)
while (cursor.moveToNext()) {
val name = cursor.getString(displayNameColumn)
val relativePath = cursor.getString(relativePathColumn)
if (name.contains("screenshot", true) or relativePath.contains(
"screenshot",
true
)
) {
onScreenshot()
}
}
}
}
private fun ContentResolver.registerObserver(): ContentObserver {
val contentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
override fun onChange(selfChange: Boolean, uri: Uri?) {
super.onChange(selfChange, uri)
uri?.let { queryScreenshots(it) }
}
}
registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, contentObserver)
return contentObserver
}
}
Bir yanıt yazın