在Android 10中,您可以使用MediaStore API来获取所有图片。以下是一个示例代码,演示如何获取所有图片的URI和文件路径:
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取所有图片的URI和文件路径
List imageUris = getAllImages();
for (Uri uri : imageUris) {
Log.d(TAG, "Image URI: " + uri.toString());
Log.d(TAG, "Image Path: " + uriToFilePath(uri));
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private List getAllImages() {
List imageUris = new ArrayList<>();
// 查询条件
String selection = MediaStore.Images.Media.MIME_TYPE + " = ?";
// 查询参数
String[] selectionArgs = new String[]{"image/jpeg"};
// 查询所有图片
try (Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null,
selection,
selectionArgs,
null
)) {
if (cursor != null) {
int uriColumn = cursor.getColumnIndex(MediaStore.Images.Media._ID);
while (cursor.moveToNext()) {
long imageId = cursor.getLong(uriColumn);
Uri contentUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + imageId);
imageUris.add(contentUri);
}
}
} catch (Exception e) {
Log.e(TAG, "Error retrieving images: " + e.getMessage(), e);
}
return imageUris;
}
private String uriToFilePath(Uri uri) {
String filePath = null;
if (uri != null) {
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
try (Cursor cursor = getContentResolver().query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
filePath = cursor.getString(columnIndex);
}
}
} else if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
filePath = uri.getPath();
}
}
return filePath;
}
}
注意,在Android 10中,由于存储权限的变更,您需要在Manifest文件中添加以下权限声明: