Android如何使用MediaScannerConnection scanFile

即时添加图像到SDCARD上的文件夹。 由于图像和我的文件夹不能立即显示在图库im试图让MediaScannerConnection更新并显示图库中的文件夹/图像。 这对我来说并不是那么好,因为没有任何东西出现在画廊中。 我只在Eclipse的AVD测试。

我没有看到有关这可能是因为scanFile是自api8以来新的。 有人可以证明这是怎么做的?

我在一个服务和活动,但在onScanCompleted时不断得到uri = null。

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

我意识到,也许你正在寻找一个解决方案,以前的api级别8,我无法理解米奇的答案。 我通过建立一个扫描单个文件的类来解决它:

 import java.io.File; import android.content.Context; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; public class SingleMediaScanner implements MediaScannerConnectionClient { private MediaScannerConnection mMs; private File mFile; public SingleMediaScanner(Context context, File f) { mFile = f; mMs = new MediaScannerConnection(context, this); mMs.connect(); } @Override public void onMediaScannerConnected() { mMs.scanFile(mFile.getAbsolutePath(), null); } @Override public void onScanCompleted(String path, Uri uri) { mMs.disconnect(); } } 

您可以像这样使用它来使MediaScannerConnection扫描单个文件:

 new SingleMediaScanner(this, file); 

我希望这有帮助。

我正在寻找相同的东西,我发现这在ApiDemos,ExternalStorage。 解决了我扫描单个文件时遇到的所有问题。

  MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } }); 

或者你可以使用下面的方法:

 private void scanFile(String path) { MediaScannerConnection.scanFile(MainActivity.this, new String[] { path }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("TAG", "Finished scanning " + path); } }); } 

调用文件扫描为:

 scanFile(yourFile.getAbsolutePath()); 

如果您只希望一个图像出现在图库中,请不要执行sendBroadcast。 那将是一个巨大的资源浪费。 您需要制作一个MediaScannerConnectionClient,然后调用MediaScannerConnection上的connect()来扫描文件。 这是一个例子:

 private MediaScannerConnectionClient mediaScannerConnectionClient = new MediaScannerConnectionClient() { @Override public void onMediaScannerConnected() { mediaScannerConnection.scanFile("pathToImage/someImage.jpg", null); } @Override public void onScanCompleted(String path, Uri uri) { if(path.equals("pathToImage/someImage.jpg")) mediaScannerConnection.disconnect(); } }; new MediaScannerConnection(context, mediaScannerConnectionClient).connect(); 

让您的活动实施“MediaScannerConnectionClient”并将其添加到您的活动中:

 private void startScan() { if(conn!=null) conn.disconnect(); conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); conn.connect(); } @Override public void onMediaScannerConnected() { try{ conn.scanFile(yourImagePath, "image/*"); } catch (java.lang.IllegalStateException e){ } } @Override public void onScanCompleted(String path, Uri uri) { conn.disconnect(); } 

我在这里写了一个详细的答案, 在特定路径(文件夹)上触发mediascanner,如何?

我希望它能完美地解决你的问题。

 File file = new File(absolutePath); Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri); sendBroadcast(intent);