问题描述: 在 Android API 28-29 上,媒体扫描器(MediaScanner)可能无法正常工作。
解决方法: 一种解决方法是手动触发媒体扫描器来扫描指定的文件或目录。以下是使用 MediaScannerConnection 的示例代码:
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
public class MainActivity extends AppCompatActivity implements MediaScannerConnection.MediaScannerConnectionClient {
private static final String TAG = "MainActivity";
private MediaScannerConnection mMediaScannerConnection;
private String mFilePath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 设置要扫描的文件路径
mFilePath = Environment.getExternalStorageDirectory() + "/test.jpg";
// 创建 MediaScannerConnection
mMediaScannerConnection = new MediaScannerConnection(this, this);
// 连接 MediaScannerConnection
mMediaScannerConnection.connect();
}
@Override
public void onMediaScannerConnected() {
Log.d(TAG, "onMediaScannerConnected");
// 扫描指定的文件
File file = new File(mFilePath);
if (file.exists()) {
Uri uri = Uri.fromFile(file);
mMediaScannerConnection.scanFile(mFilePath, null);
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
Log.d(TAG, "onScanCompleted: path = " + path + ", uri = " + uri);
// 扫描完成后,断开 MediaScannerConnection 的连接
mMediaScannerConnection.disconnect();
}
}
在上述代码中,首先设置要扫描的文件路径(mFilePath),然后在 onCreate 方法中创建 MediaScannerConnection,并在 onMediaScannerConnected 方法中触发扫描指定的文件。当扫描完成后,会调用 onScanCompleted 方法,可以在该方法中处理扫描完成后的逻辑。最后,在 onScanCompleted 方法中断开 MediaScannerConnection 的连接。
请注意,需要确保已经添加了相应的权限,如 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限。
希望以上解决方法能帮助到您解决问题!