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);