我需要一个示例代码或教程,通过内容提供商访问手机图像/媒体?
我知道以下内容,接下来会发生什么?
ContentResolver cr = mContext.getContentResolver();
Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
答案 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;
}
}