通过android中的内容提供商访问手机图像

时间:2010-05-22 20:00:01

标签: android image media android-contentprovider android-context

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

我知道以下内容,接下来会发生什么?

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

2 个答案:

答案 0 :(得分:3)

使用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
}

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

答案 1 :(得分:1)

我制作了一个帮助类,它将收集用户设备的所有图像路径。如果需要,您可以使用它。对于您的信息,加载图像可能会很慢,因此如果您通过后台线程或加载程序加载它们会很好。

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;
    }
}