0

嗨,我想将从相机捕获的所有图像加载到网格视图中。但我得到了这个奇怪的例外。如果我只是尝试加载 2 或 3 张图像,一切都很顺利,但是当我尝试加载所有图像时,就会出现错误。sdcard我的.here 中有大约 20 张图片是我的代码。

package com.example.imagegridview;

import java.io.File;
import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.widget.GridView;
import android.widget.Toast;

@SuppressLint("NewApi")
public class MainActivity extends Activity {

    ArrayList<Bitmap> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String sdCardRootPath = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM).toString()+"/Camera";
        File rootFolder = new File(sdCardRootPath);
        File[] picFiles = rootFolder.listFiles();
        data = new ArrayList<Bitmap>();
        for (File pic:picFiles) {
            Bitmap b= BitmapFactory.decodeFile(pic.getAbsolutePath());
            data.add(b);
        }
        GridView gv = (GridView) findViewById(R.id.gridview);
        gv.setAdapter(new MAdapter(this,data));

    }

}

适配器

package com.example.imagegridview;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class MAdapter extends BaseAdapter {

    Context c;
    ArrayList<Bitmap> b;
    public MAdapter(Context c,ArrayList<Bitmap> data){
        this.c = c;
        this.b = data;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return b.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return b.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2) {
        ImageView iv = new  ImageView(c);
        iv.setImageBitmap(b.get(arg0));
        return iv;
    }

}

布局.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="vertical">
<GridView
    android:id="@+id/gridview"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"/>

</LinearLayout>

日志猫

03-13 23:39:22.632: E/AndroidRuntime(13228): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:562)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:371)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:399)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at com.example.imagegridview.MainActivity.onCreate(MainActivity.java:32)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.app.ActivityThread.access$2300(ActivityThread.java:126)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.os.Looper.loop(Looper.java:123)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at android.app.ActivityThread.main(ActivityThread.java:4633)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at java.lang.reflect.Method.invokeNative(Native Method)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at java.lang.reflect.Method.invoke(Method.java:521)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-13 23:39:22.632: E/AndroidRuntime(13228):    at dalvik.system.NativeStart.main(Native Method)
4

3 回答 3

0

我建议在直接添加图像之前,先缩放每个图像。来自相机的图像实际上会相当大,当你尝试添加 20 个这样的图像时,它必然会在移动设备上溢出。因此,在您上传之前缩放每张图片,并确保它会起作用。

于 2013-03-14T07:22:23.760 回答
0

你可能想通过这个文档

https://developer.android.com/training/displaying-bitmaps/index.html

于 2013-03-14T06:58:25.417 回答
0

在加载之前调整位图大小,即使用下面的代码解码位图,然后使用该位图。`

     public Bitmap decodeFile(File f, int size) {

            try {
        // decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);

        // Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE = size;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
                    || height_tmp / 2 < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        o2.outWidth = width_tmp;
        o2.outHeight = height_tmp;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {
    }
    return null;
}`
于 2013-05-09T12:53:06.423 回答