Android下如何扫描以.开头的隐藏音视频文件及获取媒体详情
Hey there! Let's tackle your two questions step by step—scanning hidden media files that start with a dot, and retrieving their metadata like album art, thumbnails, and duration.
Android’s default MediaStore doesn’t index hidden files (those starting with .), so you’ll need to either traverse the file system directly or adjust how you query storage.
Option 1: Direct File System Traversal
This is the most reliable method for finding hidden media files. Use the File API to recursively scan directories, check for dot-prefixed names, and verify media types:
private void scanHiddenMedia(File directory) { File[] files = directory.listFiles(); if (files == null) return; for (File file : files) { if (file.isDirectory()) { scanHiddenMedia(file); // Recurse into subdirectories } else { // Check if file is hidden and a media type if (file.getName().startsWith(".") && isAudioOrVideo(file)) { // Add this file to your hidden media list Log.d("HiddenMedia", "Found: " + file.getAbsolutePath()); } } } } private boolean isAudioOrVideo(File file) { String extension = MimeTypeMap.getFileExtensionFromUrl(file.getAbsolutePath()); String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); return mimeType != null && (mimeType.startsWith("audio/") || mimeType.startsWith("video/")); }
- Permissions Note: For Android 10 (API 29) and below, request
READ_EXTERNAL_STORAGE. For Android 11+, useMANAGE_EXTERNAL_STORAGE(to scan all external storage) or target specific directories (like Downloads) withREAD_EXTERNAL_STORAGE.
Option 2: Querying MediaStore (Limited Reliability)
By default, MediaStore excludes hidden files, but you can try filtering for hidden entries (results may vary by device):
ContentResolver resolver = getContentResolver(); Uri uri = MediaStore.Files.getContentUri("external"); String[] projection = {MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DATA}; String selection = MediaStore.Files.FileColumns.IS_HIDDEN + " = 1 AND (" + MediaStore.Files.FileColumns.MIME_TYPE + " LIKE 'audio/%' OR " + MediaStore.Files.FileColumns.MIME_TYPE + " LIKE 'video/%')"; Cursor cursor = resolver.query(uri, projection, selection, null, null); // Process cursor results to get file paths
Note: Some manufacturers still block hidden files from MediaStore queries, so this isn’t a universal solution.
Since hidden files aren’t indexed by MediaStore, you can’t use its built-in metadata methods. Instead, parse the file directly:
Using Android’s MediaMetadataRetriever
This built-in class extracts metadata and thumbnails directly from file paths, no MediaStore index required:
// For audio metadata (album, duration, artist) MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { retriever.setDataSource(hiddenAudioFile.getAbsolutePath()); String album = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); // Extract other fields like artist, title, etc. } catch (Exception e) { e.printStackTrace(); } finally { retriever.release(); // Always release to avoid memory leaks } // For video thumbnails try { retriever.setDataSource(hiddenVideoFile.getAbsolutePath()); Bitmap thumbnail = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); // Use the thumbnail bitmap in your UI } catch (Exception e) { e.printStackTrace(); } finally { retriever.release(); }
Third-Party Libraries (For Advanced Use Cases)
If MediaMetadataRetriever doesn’t support your media format, try lightweight libraries:
- FFmpegMediaMetadataRetriever: Handles more rare formats and detailed metadata.
- Apache Tika: Powerful but heavier, ideal for complex parsing needs.
Why the Hidden-File-Scanner Repository Didn’t Help
That repo likely focuses on scanning for hidden files but relies on MediaStore for metadata—since hidden files aren’t indexed, this method fails. Switching to direct file parsing with MediaMetadataRetriever should resolve your metadata issues.
内容的提问来源于stack exchange,提问作者Umer Khan

