我正在将图片添加到SD卡上的文件夹中。由于这些图片和我的文件夹在图库中不会立即显示,因此我尝试使用MediaScannerConnection更新并在图库中显示文件夹/图片。
对我来说,这样做效果不太好,因为在图库中没有任何显示。我只是在Eclipse AVD中进行测试。
我没看到有关此方面的讨论,也许是因为自API8以来scanFile是新功能。有人能展示如何完成吗?
我正在尝试在服务和活动中执行此操作,但在onScanCompleted时仍然得到uri=null。
我正在将图片添加到SD卡上的文件夹中。由于这些图片和我的文件夹在图库中不会立即显示,因此我尝试使用MediaScannerConnection更新并在图库中显示文件夹/图片。
对我来说,这样做效果不太好,因为在图库中没有任何显示。我只是在Eclipse AVD中进行测试。
我没看到有关此方面的讨论,也许是因为自API8以来scanFile是新功能。有人能展示如何完成吗?
我正在尝试在服务和活动中执行此操作,但在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();
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();
}
使用Intent
代替MediaScannerConnection
。 MediaScannerConnection
会导致您的应用程序出现IMediaScannerListener.Stub mListener
的gc错误。
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);
File file = new File(absolutePath);
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(intent);