最近做一个页面,反馈问题页面,有个用户上传问题图片的功能。本来很笨的想把系统的所有图片列出来,然后让用户选择,后来发现原来可以直接打开手机所有图片的api的。效果如图:
给出主要代码:
1、选择图片
private void pickImage() {
try {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE);
return;
} catch (Exception e) {
log.warn("pickImage: ", e);
}
try {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, REQUEST_CODE);
return;
} catch (Exception e) {
log.warn("pickImage: ", e);
}
}
2、获取图片
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (requestCode == 1 && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
if (cursor == null)//兼容小米手机
{
final String filePath = "file://" + selectedImage.getPath();
ImageSize mImageSize = new ImageSize(160, 160);
//显示图片的配置
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
ImageLoader.getInstance().loadImage(filePath, mImageSize, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
if (mPosition != 0)// 替换
{
fba.getmImgs().set(mPosition, loadedImage);
fba.getmImgPaths().set(mPosition - 1, filePath);
} else {
fba.getmImgs().add(loadedImage);
fba.getmImgPaths().add(filePath);
}
fba.notifyDataSetChanged();
}
});
return;
}
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(picturePath, opts);
opts.inSampleSize = computeSampleSize(opts, -1, 160 * 160);
// 这里一定要将其设置回false,因为之前我们将其设置成了true
opts.inJustDecodeBounds = false;
try {
Bitmap bmp = BitmapFactory.decodeFile(picturePath, opts);
if (mPosition != 0)// 替换
{
fba.getmImgs().set(mPosition, bmp);
fba.getmImgPaths().set(mPosition - 1, picturePath);
} else {
fba.getmImgs().add(bmp);
fba.getmImgPaths().add(picturePath);
}
} catch (OutOfMemoryError err) {
if (err != null) {
err.printStackTrace();
}
}
fba.notifyDataSetChanged();
}
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
} catch (OutOfMemoryError e) {
if (e != null) {
e.printStackTrace();
}
}
}
public int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}
private int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));
if (upperBound < lowerBound) {
return lowerBound;
}
if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}