繁体   English   中英

无法将图像从SD卡加载到gridview

[英]Not Able to load images from sd card to gridview

嗨,我想将从相机捕获的所有图像加载到网格视图中。 但是我得到了这个奇怪的例外。 如果我只是尝试加载2个或三个图像,一切都很好,但是当我尝试加载所有图像时,就会出现错误。 我的sdcard中大约有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;
    }

}

layout.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>

logCat

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)

我建议您直接添加图像之前,先缩放每个图像。 来自相机的图像实际上将具有相当大的尺寸,当您尝试添加20个此类图像时,它必然会在移动设备上溢出。 因此,在上载图像之前,请先缩放每个图像,并确保它可以工作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM