Android如何使用MediaScannerConnection scanFile

时间:2011-01-10 12:40:02

标签: android

我将图像添加到SDCARD上的文件夹中。 由于图像和我的文件夹不能立即在Gallery im中看到 试图让MediaScannerConnection更新并显示 库中的文件夹/图像。 这对我来说不是很好,因为Gallery中没有任何内容。 我只在Eclipse AVD中测试。

我没有看到太多关于这个的讨论,因为scanFile是自api8以来的新功能。 有人可以说明这是怎么做的吗?

我在服务和活动中尝试它,但一直在努力 onScanCompleted时uri = null。

9 个答案:

答案 0 :(得分:91)

我意识到也许你正在寻找一个能够在api 8级之前工作的解决方案,而我无法理解Mitch的答案。我通过构建一个用于扫描单个文件的类来解决它:

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

答案 1 :(得分:73)

我正在寻找同样的东西,我在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);
      }
 });

答案 2 :(得分:27)

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

答案 3 :(得分:19)

或者您可以使用以下方法:

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

答案 4 :(得分:10)

如果您只想在图库中显示一个图像,请不要执行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();

答案 5 :(得分:4)

让您的活动实施'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(); 
} 

答案 6 :(得分:1)

我在这里写了一个详细的答案,Trigger mediascanner on specific path (folder), how to?

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

使用Intent代替MediaScannerConnectionMediaScannerConnection将使您的应用gc错误IMediaScannerListener.Stub mListener

Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri fileContentUri = Uri.parseFile(permFile); // With 'permFile' being the File object
mediaScannerIntent.setData(fileContentUri);
sendBroadcast(mediaScannerIntent);