Android 是目前全球使用最广泛的移动操作系统之一,它提供了丰富的功能和API,使得开发者可以轻松地进行各种应用程序的开发。其中,读取手机中的照片是一个非常常见的需求,本文将介绍如何在 Android 上读取所有的照片,并提供相应的代码示例。
1. Android 中读取照片的方式
在 Android 中,读取照片的方式有多种,常用的有使用内容提供器(Content Provider)和使用存储访问框架(Storage Access Framework)。下面将分别介绍这两种方式的原理和使用方法。
1.1 使用内容提供器
在 Android 中,内容提供器是一种可以让应用程序共享数据的组件。系统提供了一些常用的内容提供器,如联系人、短信、通话记录等,同时也可以自定义内容提供器。对于照片,系统提供了一个默认的内容提供器MediaStore.Images.Media
,我们可以使用它来读取手机中的照片。
首先,在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然后,在代码中使用以下代码读取照片:
public List<String> getAllPhotos() {
List<String> photosList = new ArrayList<>();
String[] projection = { MediaStore.Images.Media.DATA };
String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC";
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
sortOrder);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
do {
String photoPath = cursor.getString(columnIndex);
photosList.add(photoPath);
} while (cursor.moveToNext());
cursor.close();
}
return photosList;
}
以上代码中,我们使用getContentResolver().query()
方法查询照片的内容提供器,并指定了要查询的字段和排序方式。然后通过遍历Cursor
对象,获取照片的路径,并将其添加到一个List
中,最后返回该List
。
1.2 使用存储访问框架
存储访问框架是 Android 4.4 (API level 19) 引入的,它提供了一种简单的方式来读写手机存储。使用存储访问框架,我们可以让用户选择照片,而不用去关心具体的存储路径。
首先,在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然后,在代码中使用以下代码读取照片:
private static final int REQUEST_CODE_PICK_IMAGE = 1;
public void pickImage() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == Activity.RESULT_OK) {
if (data != null) {
Uri uri = data.getData();
String photoPath = getPathFromUri(uri);
// 处理照片路径
}
}
}
private String getPathFromUri(Uri uri) {
String path = null;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
path = getRealPathFromUri(uri);
} else {
path = getPathFromUriAboveKitkat(uri);
}
return path;
}
private String getRealPathFromUri(Uri contentUri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
String path = cursor.getString(columnIndex);
cursor.close();
return path;
}
return null;
}
@SuppressLint("NewApi")
private String getPathFromUriAboveKitkat(Uri uri) {
String path = null;
if (DocumentsContract.isDocumentUri(this, uri)) {
String documentId = DocumentsContract.getDocumentId(uri);
if (isExternalStorageDocument(uri)) {
String[] split = documentId.split(":");
String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
path = Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (is