Android如何使用MediaScannerConnection scanFile

Eri*_*rik 39 android

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

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

我在服务和Activity中尝试它但在onScanCompleted时继续获得uri = null.

Pet*_*rus 95

我意识到也许你正在寻找一个解决方案,它可以在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();
    }

}
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它来MediaScannerConnection扫描一个文件:

new SingleMediaScanner(this, file);
Run Code Online (Sandbox Code Playgroud)


Pet*_*rus 75

我正在寻找相同的东西,我在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);
      }
 });
Run Code Online (Sandbox Code Playgroud)

  • 仅在API级别8之后存在 (4认同)
  • Uri 不为空并显示路径,但图像不会出现在 Android 7.1 API 25 模拟器的图库中 (3认同)
  • 添加单个文件的最佳解决方案。 (2认同)
  • 像魅力一样工作,为多个文件手动添加文件路径到字符串数组 (2认同)

mei*_*ilp 25

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
            + Environment.getExternalStorageDirectory()))); 
Run Code Online (Sandbox Code Playgroud)

  • 这在API 19中不再有效.(4.4) (59认同)
  • 实际上使用Android 4.4你甚至会得到一个java.lang.SecurityException:Permission Denial:不允许发送广播android.intent.action.MEDIA_MOUNTED来尝试这个.使用MediaScannerConnection.scanFile是正确的方法.请参阅其他答案中的示例. (4认同)
  • 有谁知道为什么这停止在API 19 kitkat中工作? (3认同)
  • 我现在正在使用它,想要更新并显示一张图片而不是孔SD卡.如果有很多东西,可能需要很长时间才能重新安装SD.有没有办法只更新单个项目? (2认同)

Kap*_*uri 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);
                    }
                });
    }
Run Code Online (Sandbox Code Playgroud)

调用文件扫描为:

scanFile(yourFile.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

  • 不适用于SDK v25(模拟器上为Android 7.1)。 (2认同)
  • Uri 不为空并显示路径,但图像不会出现在 Android 7.1 模拟器上的图库中 (2认同)

小智 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();
Run Code Online (Sandbox Code Playgroud)

  • 什么是MEDIA_SCANNER_CONNECTION? (2认同)

TOM*_*MKA 5

让您的活动实现“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(); 
} 
Run Code Online (Sandbox Code Playgroud)