Android 12 媒体扫描 API:MediaScannerReceiver 的替代方案
在 Android 12 中,'MediaScannerReceiver' 被弃用了,取而代之的是新的媒体扫描 API。这个 API 使用了新的 'MediaStore' 类来处理媒体文件的扫描和访问。
要使用新的媒体扫描 API,你可以使用以下步骤:
- 导入 'androidx.appcompat.app.AppCompatActivity' 和 'androidx.core.content.ContextCompat' 包。
- 在 'AndroidManifest.xml' 文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 在你的 Activity 类中,实现以下方法来处理媒体扫描:
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_PERMISSION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 检查读写外部存储的权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, REQUEST_PERMISSION);
} else {
scanMediaFiles();
}
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
scanMediaFiles();
}
}
}
// 扫描媒体文件
private void scanMediaFiles() {
Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(mediaUri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
String filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
// 处理媒体文件路径
// ...
} while (cursor.moveToNext());
cursor.close();
}
}
}
在 'scanMediaFiles' 方法中,你可以使用 'MediaStore' 类提供的方法来查询和处理媒体文件。在这个例子中,我们使用 'MediaStore.Images.Media.EXTERNAL_CONTENT_URI' 查询图片文件,并以 'MediaStore.Images.Media.DATA' 作为列投影来获取文件路径。
请注意,此示例中仅处理了读写外部存储的权限请求和媒体文件的扫描。根据你的需求,你可能需要处理其他权限请求并使用其他 'MediaStore' 类中的方法来处理不同类型的媒体文件。
原文地址: https://www.cveoy.top/t/topic/pQQt 著作权归作者所有。请勿转载和采集!