在片段中使用 MediaScannerConnection.scanFile() ?

Using MediaScannerConnection.scanFile() in a fragment?

我正在从 Fragment 中异步下载文件,并希望在下载完成时调用 MediaScannerConnection.scanFile()。如果我坐下来等待下载完成而不离开我的 Fragment(或其托管 activity),我就能得到想要的结果。我面临的问题是 MediaScannerConnection.scanFile() 需要一个上下文,我不想限制用户停留在 Fragment/Activity 中,这样上下文就不会为空。

如何在后台使用 MediaScannerConnection.scanFile() 以便扫描文件并在扫描完成时显示 Toast,同时仍在我的应用程序的其他部分导航(或甚至跳出我的应用)?

这是我目前正在扫描的方式(使用上下文):

public static void mediaScanFile(Context context, String path) {
    MediaScannerConnection.scanFile(context,
            new String[]{path}, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.d("Tag", "Scan finished. You can view the image in the gallery now.");
                }
            });
}

首先,从Fragment下载一个可能很快就会被破坏的文件不是一个好主意。您应该改用前台服务


如果您仍然想坚持使用片段,在您的情况下,您可以使用应用程序上下文。

开始下载之前,将应用程序上下文的引用存储为片段中的一个字段。

Context appContext;

// Inside onCreateView
appContext = getContext().getApplicationContext();

然后您可以使用应用程序上下文扫描媒体。

这不会导致内存泄漏,因为应用程序上下文是单个共享实例,并且在应用程序被终止之前不会被销毁。