簡體   English   中英

Android 如何使用 MediaScannerConnection scanFile

[英]Android How to use MediaScannerConnection scanFile

我將圖像添加到 SDCARD 上的文件夾中。 由於圖像和我的文件夾在圖庫中不是立即可見的,因此我試圖讓 MediaScannerConnection 更新並顯示圖庫中的文件夾/圖像。 這對我來說不是很好,因為畫廊中沒有任何顯示。 我只在 Eclipse AVD 中測試。

我沒有看到太多談論這個可能是因為 scanFile 自 api8 以來是新的。 有人可以展示這是如何完成的嗎?

我在服務和活動中都嘗試過它,但在 onScanCompleted 時不斷獲取 uri=null。

我意識到,也許您正在尋找一種可以在 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);

我一直在尋找同樣的東西,我在 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);
      }
 });
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
            + Environment.getExternalStorageDirectory()))); 

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

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

我在這里寫了詳細的答案, 特定路徑(文件夾)上的Trigger mediascanner,怎么樣?

我希望它能完美地解決你的問題。

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

使用Intent而不是MediaScannerConnection MediaScannerConnection將使您的應用程序 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM