大家好, 我已经搜索了很多我的问题,我发现很多帖子有类似的问题,但没有人给我一个正确的解决方案。 我想要的是一个显示sdcard文件夹图像的gridview。我还必须提供拍照的可能性,当回到gridview时,用新图片更新它。
要拍照,我使用此代码:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageFileUri());
startActivityForResult(intent, TAKE_PICTURE_ACTIVITY);
其中getImageFileUri()是一个函数,它给我一个带时间戳的图片名称,使用Environment.getExternalStorageDirectory()来获取sdcard路径,并检查文件夹是否存在(如果不存在则创建它)。
目前,我使用光标来获取我的图像:
private void displayGallery() {
// Query params :
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.Media._ID};
String selection = MediaStore.Images.Media.DATA + " like ? ";
String[] selectionArgs = {"%Otiama%"};
// Submit the query :
mCursor = managedQuery(uri, projection, selection, selectionArgs, null);
if (mCursor != null) {
mGridView.setOnItemClickListener(this);
mGridView.setAdapter(new ImageAdapter(this, mCursor));
}
else showToast("Gallery is empty : " + uri.toString());
}
这是我的适配器的getView:
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
// Move cursor to current position
mCursor.moveToPosition(position);
// Get the current value for the requested column
int columnIndex = mCursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
int imageID = mCursor.getInt(columnIndex);
// obtain the image URI
Uri uri = Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Integer.toString(imageID) );
String url = uri.toString();
// Set the content of the image based on the image URI
int originalImageId = Integer.parseInt(url.substring(url.lastIndexOf("/") + 1, url.length()));
Bitmap b = MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(), originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null);
imageView.setImageBitmap(b);
return imageView;
}
此代码有效,但速度非常慢且无法更新(未创建新图片的缩略图),即使我再次调用onActivityResult()中的displayGallery()函数也是如此。好吧,即使我重新加载应用><也不会更新。我必须从eclipse再次运行它。
事实上,我想要的是与ES文件资源管理器相同的行为(当你打开一个文件夹时,图片都有一个预览图像,并且它们是异步加载的),我认为这些不会使用那些 * *缩略图。
所以我尝试使用位图工厂将图片作为位图加载,但即使只有几张图片(1-2),我立即得到一个“java.lang.OutOfMemoryError:位图大小超过VM预算”......我我想我必须调整它们的大小,但如果我这样做,当我加载20-30张图片时,我不会有同样的错误吗?或者问题是每张图片都超出了预算,所以如果我调整它们的大小,我会为所有这些图片避免这个错误吗?
对不起这篇重要帖子,如果有人可以提供帮助......
答案 0 :(得分:0)
好吧,我回答自己: 我用这种方式创建了自己的缩略图:
public static Bitmap resizedBitmap(Bitmap bitmap, int newWidth) {
// Get the bitmap size :
int width = bitmap.getWidth();
int height = bitmap.getHeight();
double ratio = (double)width / (double)height;
// Compute the thumbnail size :
int thumbnailHeight = newWidth;
int thumbnailWidth = (int) ( (double)thumbnailHeight * ratio);
// Create a scaled bitmap :
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, thumbnailWidth, thumbnailHeight, false);
return scaledBitmap;
}
我不再使用游标,加载缩略图我这样做(在ImageAdapter中):
public void loadThumbnails() {
// Init the ArrayList :
_thumbnails = new ArrayList<ImageView>();
_imagesNames = new ArrayList<String>();
// Run through the thumbnails dir :
File imagesThumbnailsDir = new File(_imagesThumbnailsDirUri.getPath());
File[] imagesThumbnails = imagesThumbnailsDir.listFiles();
Arrays.sort(imagesThumbnails);
// For each thumbnail :
for(File imageThumbnail : imagesThumbnails)
{
// Check if the image exists :
File image = new File(_imagesDirUri.getPath() + File.separator + imageThumbnail.getName());
if(image.exists()) {
ImageView imageView = new ImageView(_context);
imageView.setImageDrawable(Drawable.createFromPath(imageThumbnail.getAbsolutePath()));
_thumbnails.add(imageView);
_imagesNames.add(imageThumbnail.getName());
}
// If not, delete the thumbnail :
else {
ImageUtils.deleteFile(Uri.fromFile(imageThumbnail));
}
}
}
所以我的ImageAdapter的getView函数听起来像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(_context);
imageView.setLayoutParams(new GridView.LayoutParams(80, 80));
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setPadding(5, 5, 5, 5);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageDrawable(_thumbnails.get(position).getDrawable());
return imageView;
}
希望有所帮助......