Tôi đã thử nhiều phương pháp khác nhau để kích hoạt MediaScanner và đây là những kết quả của tôi.
SendBroadcast
Giải pháp đơn giản nhất và ngây thơ. Nó bao gồm trong việc thực hiện các hướng dẫn sau đây từ mã của bạn:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Tuy nhiên, này không còn hoạt động trong các thiết bị KitKat, do thiếu các điều khoản cần thiết.
MediaScannerWrapper
Như posted here (mỗi @ Brian của câu trả lời), nó bao gồm trong gói một trường hợp MediaScannerConnection
để kích hoạt các phương pháp scan()
trên một thư mục cụ thể. Phương pháp này đã được chứng minh là làm việc tốt cho 4.3 và dưới đây, nhưng vẫn không có may mắn với KitKat (4.4+).
FileWalker
Một trong nhiều ứng dụng Play Store mà cố gắng để vượt qua sự thiếu cam kết của MediaStore để cập nhật cơ sở dữ liệu của nó là ReScan SD. Nó sẽ gửi rất nhiều chương trình phát sóng khác nhau:
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file://" + Environment.getExternalStorageDirectory())));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable/SD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable/MicroSD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///mnt/Removable/MicroSD")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///mnt")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///storage")));
sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri.parse("file:///Removable")));
và cố gắng hỗ trợ KitKat bằng cách thủ công kích hoạt các phương pháp scan()
qua mỗi tập tin của thư mục gốc. Thật không may, đây là cả hai rất nhiều CPU và tốn thời gian, vì vậy nó không phải là rất khuyến khích.
"Cách vỏ"
Điều duy nhất mà dường như làm việc với KitKat trong một số trường hợp được gửi broadcast qua adb shell
. Vì vậy, đoạn này cho phép bạn làm việc đó cách lập trình:
Runtime.getRuntime().exec("am broadcast -a android.intent.action.MEDIA_MOUNTED -d file://" + Environment.getExternalStorageDirectory());
Nó là nhiều hơn một cách hack-ish để làm việc đó, nhưng tại thời điểm này là tốt nhất tôi có thể nghĩ ra.
Tóm lại
Mỗi phòng trong số các giải pháp trên thực sự làm việc cho tất cả mọi thứ đó không phải là KitKat. Đó là bởi vì, nhờ vào số Justin, một lỗi đã được tìm thấy và phát hành cho số official Tracker. Điều này có nghĩa là, cho đến khi lỗi được khắc phục, chúng tôi sẽ không hỗ trợ KitKat thực sự.
Loại nào để sử dụng? Trong số đó, tôi sẽ sử dụng giải pháp MediaScannerWrapper
, cùng với phương pháp shell-ish
(giải pháp cuối cùng).
Ứng dụng "sdrescan" thực hiện những gì bạn muốn. Nó miễn phí; có thể bạn có thể yêu cầu tác giả cho một đoạn mã. Hoặc chỉ cần khởi chạy ứng dụng từ ứng dụng của bạn. –
Có cách nào để quét lại mà không dừng trình phát nhạc không? Nó nói Xin lỗi, trình phát đa phương tiện không hỗ trợ tệp này, cho đến khi tôi nhấn lại một bản nhạc, chuyển tiếp bản nhạc, sau đó phát lại. – NoBugs