android 替换本地图片,Android选择手机本地图片

博客介绍了在Android中获取手机本地图片文件的功能实现方式。一是通过Intent跳转,设置相关动作和类型,在onActivityResult方法中处理选择的图片;二是使用getLoaderManager()获取图片资源,创建Loader并在加载完成时处理数据,得到图片列表用于展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传头像、上传图片是都会时候用到获取手机本地图片文件。下面几种方式实现这个功能。

第一种: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() {

final String[] PROJECTION = new String[]{

MediaStore.Images.Media._ID, // Id

MediaStore.Images.Media.DATA, // 图片路径

MediaStore.Images.Media.DATE_ADDED // 图片的创建时间

};

@Override

public Loader 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 loader, Cursor data) {

// 当Loader加载完成时

List 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 loader) {

// 当Loader销毁或者重置了, 进行界面清空

}

});

完整代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值