You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户保存新照片至相册的通知实现及拍照监听上传App技术咨询

How to Detect When a User Takes a Photo on Android

Hey there! Great question—building a Google Photos-like app is a fun project, and detecting when a user captures a photo is a critical piece of the puzzle. Let’s break down your options clearly:

Is there an onUserTookPhotoListener?

Short answer: No, Android doesn’t provide a built-in listener specifically for when a user takes a photo. You’ll need to use alternative system APIs to detect new photos added to the device’s media library.

1. Use a ContentObserver to Monitor MediaStore Changes

This is the most efficient and reliable method. The Android MediaStore keeps track of all media files on the device, and you can register a ContentObserver to listen for new entries in the images collection.

Here’s a quick example of how to set this up:

class PhotoObserver(private val contentResolver: ContentResolver, private val handler: Handler) : ContentObserver(handler) {
    override fun onChange(selfChange: Boolean, uri: Uri?) {
        super.onChange(selfChange, uri)
        uri?.let {
            // A new image was added—query MediaStore to get details
            val projection = arrayOf(
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.DATE_ADDED
            )
            val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"
            contentResolver.query(it, projection, null, null, sortOrder)?.use { cursor ->
                if (cursor.moveToFirst()) {
                    val imageId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID))
                    val imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageId)
                    // Now you can process/upload this image
                    handleNewPhoto(imageUri)
                }
            }
        }
    }
}

// Register the observer in your Activity/Service
val observer = PhotoObserver(contentResolver, Handler(Looper.getMainLooper()))
contentResolver.registerContentObserver(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    true, // Notify for descendants (subdirectories)
    observer
)

Note: Don’t forget to unregister the observer when it’s no longer needed (e.g., in onDestroy() of your component) to avoid memory leaks.

2. Avoid Background Polling (Loop to Check Album)

While technically possible, polling the media library in a loop is not recommended. It drains battery, uses unnecessary system resources, and provides a less responsive experience compared to using system callbacks like ContentObserver. If you must periodically check for new photos (e.g., as a fallback), use WorkManager to schedule periodic tasks at reasonable intervals (like every 15 minutes) instead of a continuous loop.

3. BroadcastReceiver (Limited Use Case)

Older Android versions supported listening for the ACTION_NEW_PICTURE broadcast, which some camera apps send when a photo is taken. However:

  • Android 7.0 (API 24+) restricted implicit broadcasts, so you can only register this receiver dynamically (not in the manifest).
  • Not all camera apps send this broadcast, so it’s unreliable as the sole detection method.

Key Considerations

  • Permissions: You’ll need the appropriate media permissions. For Android 13+, request READ_MEDIA_IMAGES; for older versions, use READ_EXTERNAL_STORAGE.
  • Scoped Storage (Android 10+): Avoid accessing file paths directly. Use MediaStore URIs to retrieve image content, as direct file access is restricted.
  • Duplicate Handling: Keep track of processed image IDs/URIs to avoid re-uploading the same photo multiple times (e.g., store them in a local database or SharedPreferences).

ContentObserver is the way to go for real-time, efficient detection—it’s how apps like Google Photos handle this under the hood!

内容的提问来源于stack exchange,提问作者Egor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:24:55