上传头像、上传图片是都会时候用到获取手机本地图片文件。下面几种方式实现这个功能。
第一种:Intent跳转
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 0x01);
展示选择到的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0x01) {
// 选择到图片的uri
Uri uri = data.getData();
// 第一种方式,使用文件路径创建图片
// 文件路径的列
String[] filePathColumn = {MediaStore.Images.Media.DATA};
// 获取图片的游标
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
// 获取列的指针
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
// 根据指针获取图片路径
String picturePath = cursor.getString(columnIndex);
cursor.close();
// 使用地址获取图片
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
mIvPath.setImageBitmap(bitmap);
// 第二种方式
Bitmap bitmapStream = null;
try {
// 使用流获取图片
bitmapStream = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mIvStream.setImageBitmap(bitmapStream);
}
}
第一种:getLoaderManager()获取图片资源
LoaderManager loaderManager = getLoaderManager();
loaderManager.initLoader(0x01, null, new LoaderManager.LoaderCallbacks<Cursor>() {
final String[] PROJECTION = new String[]{
MediaStore.Images.Media._ID, // Id
MediaStore.Images.Media.DATA, // 图片路径
MediaStore.Images.Media.DATE_ADDED // 图片的创建时间
};
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// 创建一个Loader
if (id == LOADER_ID) {
// 如果是我们的ID则可以进行初始化
return new CursorLoader(PickPictureActivity.this,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // 选择资源
PROJECTION, // 选择要查询的列
null,
null,
null); // 倒叙或升序
}
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// 当Loader加载完成时
List<Image> images = new ArrayList<>();
// 判断是否有数据
if (data != null) {
int count = data.getCount();
if (count > 0) {
// 移动游标到开始
data.moveToFirst();
// 得到对应的列的Index坐标
int indexId = data.getColumnIndexOrThrow(PROJECTION()[0]);
int indexPath = data.getColumnIndexOrThrow(PROJECTION()[1]);
int indexDate = data.getColumnIndexOrThrow(PROJECTION()[2]);
do {
// 循环读取,直到没有下一条数据
int id = data.getInt(indexId);
String path = data.getString(indexPath);
long dateTime = data.getLong(indexDate);
File file = new File(path);
if (!file.exists() || file.length() < 9) {
// 如果没有图片,或者图片大小太小,则跳过
continue;
}
// 添加一条新的数据
Image image = new Image();
image.id = id;
image.path = path;
image.date = dateTime;
images.add(image);
} while (data.moveToNext());
}
}
// images是获取到的图片列表,可用用于展示UI
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// 当Loader销毁或者重置了, 进行界面清空
}
});
完整代码:
网友评论