2012-04-25 6 views
0

こんにちはすべて、私の問題をたくさん検索しましたが、同様の問題の投稿が多数見つかりましたが、誰も私に正しい解決策を教えてくれませんでした。 私が望むのは、sdcardフォルダの画像を表示するgridviewです。私も写真を撮る可能性を提供しなければならず、グリッドビューに戻るときに新しい画像で更新してください。sdcardのサブフォルダの画像をgridviewに表示し、変更時に更新します

写真を撮るために、私はこのコードを使用:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageFileUri()); 
startActivityForResult(intent, TAKE_PICTURE_ACTIVITY); 
getImageFileUriは()関数は、SDカードのパスを取得するにはEnvironment.getExternalStorageDirectory()を使用して、タイムスタンプを持つ私に絵の名前を与えることで

、およびフォルダが存在するかどうかをチェックします(存在しない場合は作成します)。瞬間のために

は、私は私の画像を取得するには、カーソルを使用します。

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()関数を再度呼び出す場合でも、新しい画像のサムネイルは作成されません。アプリをリロードしても更新されません> <。私は日食から再びそれを実行する必要があります。

実際には、ESファイルエクスプローラと同じ動作があります(フォルダを開くと、画像にはすべてプレビュー画像があり、非同期に読み込まれます)。それら* *サムネイル。

ビットマップファクトリを使用してビットマップとして写真を読み込もうとしましたが、数枚の写真(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; 
} 

私はもうカーソルを使用しないでください: 私は私自身のサムネイルこのようにして作成しました

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メソッドの機能は、このように聞こえる::、(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; 
} 

希望します..

関連する問題