2012-04-25 1 views
0

Привет всем, Я много искал для своей проблемы, я нашел много сообщений с похожими проблемами, но никто не дал мне правильного решения. Что я хочу - это gridview, отображающий изображения папки sdcard. Я также должен предложить возможность сделать снимок, и, возвращаясь к gridview, обновите его с новым изображением.Отображать изображения подпапки sdcard в 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; 
} 

Этот код работает, но очень медленно и не update (миниатюры новых изображений не создаются), даже если я снова вызову свою функцию displayGallery() в onActivityResult(). Ну, он не обновляется, даже если я перезагрузите приложение> <. Я должен запустить его снова из затмения.

Фактически, то, что я хотел бы, это то же поведение, что и ES File Explorer (при открытии папки изображения имеют все изображение предварительного просмотра, и они загружаются асинхронно), что, я думаю, не использует те * * thumbnails.

Поэтому я попытался загрузить изображения в виде растровых изображений с использованием растровой фабрики, но даже с несколькими изображениями (1-2) я сразу получаю «размер растрового изображения java.lang.OutOfMemoryError: превышает бюджет VM» ... Думаю, я должен изменить их размер, но если я это сделаю, разве у меня будет такая же ошибка, когда я загружу 20-30 фотографий? Или проблема в том, что каждая фотография превышает бюджет, и поэтому, если я изменю их размер, я избегу этой ошибки для всех из них?

Извините за большой пост, если кто-то может помочь ...

ответ

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)); 
     } 
    } 
} 

И поэтому функция GetView моего ImageAdapter звучит так:

@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; 
} 

Надеется, что это помогает ..

 Смежные вопросы

  • Нет связанных вопросов^_^