0

こんにちは、私は自分の問題をたくさん検索しました。同様の問題を持つ投稿がたくさん見つかりましたが、誰も私に正しい解決策を教えてくれませんでした。私が欲しいのは、sdcard フォルダーの画像を表示するグリッドビューです。また、写真を撮る可能性を提供する必要があり、グリッドビューに戻るときに新しい写真で更新します。

写真を撮るには、次のコードを使用します。

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

実際、私が望むのは、ES ファイル エクスプローラー (フォルダーを開くと、すべての写真にプレビュー イメージがあり、非同期で読み込まれる) と同じ動作であり、これらの* * サムネイルを使用しないと思います。 .

そのため、ビットマップ ファクトリを使用して画像をビットマップとして読み込もうとしましたが、いくつかの画像 (1-2) を使用しても、すぐに「java.lang.OutOfMemoryError: ビットマップ サイズが VM の予算を超えています」というメッセージが表示されます...それらのサイズを変更しますが、そうすると、20〜30枚の写真をロードするときに同じエラーが発生しませんか?? または、各写真が予算を超えているという問題があるため、サイズを変更すると、すべての写真でこのエラーを回避できますか?

大きな投稿で申し訳ありませんが、誰かが助けてくれれば...

4

1 に答える 1

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

それが役に立てば幸い..

于 2012-04-27T08:26:01.220 に答える