[英]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.