3

我需要通过内容提供商访问手机图像/媒体的示例代码或教程吗?

我知道以下内容,接下来呢?

ContentResolver cr = mContext.getContentResolver();
Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
4

2 回答 2

4

使用 CursorLoader:

(通过LoaderManager.LoaderCallbacks<Cursor>在你的实施AppCompatActivity

private void loadPhotosFromPhone() {
    getSupportLoaderManager().initLoader(0, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection = {MediaStore.Images.Media.DATA};
    return new CursorLoader(this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

    ArrayList<String> alstPhotos = new ArrayList<>();

    for (data.moveToLast(); !data.isBeforeFirst(); data.moveToPrevious()){
        String photoPath = data.getString(0);
        alstPhotos.add(photoPath);
    }

    // Use alstPhotos
}

这将异步加载设备上的所有图像。

于 2016-10-26T12:04:35.687 回答
2

我创建了一个帮助类,它将收集来自用户设备的所有图像路径。如果你愿意,你可以使用它。为了您的信息,加载图像可能会很慢,所以如果您通过后台线程或加载器加载它们会很好。

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;

import java.util.ArrayList;

/**
 * @author hendrawd on 10/26/16
 */

public class ImagePathProvider {

    /**
     * Getting All Images Path.
     *
     * @param context the activity
     * @return ArrayList with images Path
     */
    public static ArrayList<String> getAllImagesPath(Context context) {
        ArrayList<String> listOfAllImages = new ArrayList<>();
        listOfAllImages.addAll(getExternalImagesPath(context));
        listOfAllImages.addAll(getInternalImagesPath(context));
        return listOfAllImages;
    }

    /**
     * Getting All External Images Path.
     *
     * @param context the context
     * @return ArrayList with external images Path
     */
    private static ArrayList<String> getExternalImagesPath(Context context) {
        return getImagesPathFromUri(context, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    }

    /**
     * Getting All Internal Images Path.
     *
     * @param context the context
     * @return ArrayList with internal images Path
     */
    private static ArrayList<String> getInternalImagesPath(Context context) {
        return getImagesPathFromUri(context, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    }

    private static ArrayList<String> getImagesPathFromUri(Context context, Uri uri) {
        Cursor cursor;
        int column_index_data;
        ArrayList<String> listOfAllImages = new ArrayList<>();
        String absolutePathOfImage;
        String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
        cursor = context.getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null) {
            column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
            while (cursor.moveToNext()) {
                absolutePathOfImage = cursor.getString(column_index_data);
                listOfAllImages.add(absolutePathOfImage);
            }
            cursor.close();
        }
        return listOfAllImages;
    }
}
于 2016-10-26T11:07:32.310 回答