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