android - 使用sdcard中的照片创建图库

时间:2012-03-25 07:58:49

标签: android

我正在尝试使用sdcard中的照片创建图库。我有一个数据库表。表格中的一列有一条照片的路径。

我将此链接作为指南,但此示例代码从res / drawable目录中检索图像ID。我不知道如何修改它以使我的代码工作。

http://saigeethamn.blogspot.com/2010/05/gallery-view-android-developer-tutorial.html

但如上所述,我想用数据库表中存在的任何图像显示照片。以下代码是ImageAdapter。

    public class ImageAdapter extends BaseAdapter {

    private Context ctx;

    int imageBackground;

    public ImageAdapter(Context c) {
        ctx = c;
        TypedArray ta = obtainStyledAttributes(R.styleable.milestone_style);
        imageBackground = ta.getResourceId(R.styleable.milestone_style_android_galleryItemBackground, 1);
        ta.recycle();
    }

    @Override
    public int getCount() {
        return imagePhotosLocations.length;
    }

    @Override
    public Object getItem(int arg0) {

        return arg0;
    }

    @Override
    public long getItemId(int arg0) {

        return arg0;
    }

    @Override
    public View getView(int position, View arg1, ViewGroup arg2) {
        if (milestones != null && !milestones.isEmpty()) {
            Milestone milestone = milestones.get(0);
            String imageFileLocation = milestone.getFileLocation();
            System.out.println("imageFileLocation="+imageFileLocation);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 26;
            Bitmap b;
            ImageView iv = new ImageView(ctx);
            try {
                if (imageFileLocation.startsWith("content://")) {
                    b = BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse(imageFileLocation)), null, options);
                } else {
                    b = BitmapFactory.decodeFile(imageFileLocation, options);
                }
                iv.setImageBitmap(b);
                iv.setScaleType(ImageView.ScaleType.FIT_XY);
                iv.setLayoutParams(new Gallery.LayoutParams(150, 120));
                // milestoneImageView.setBackgroundResource(imageBackground);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            return iv;
        }
        return null;
    }
}

这是活动中的方法之一。

private String[] imagePhotosLocations;

private void init() {
    milestones = getMilestones();
    imagePhotosLocations = new String[milestones.size()];
    int index = 0;
    for (Milestone milestone : milestones) {
        imagePhotosLocations[index++] = milestone.getFileLocation();
    }
}

private void initializeGallery() {
    milestoneImageView = (ImageView) this.findViewById(R.id.imagePhoto);
    Gallery milestoneGallery = (Gallery) this.findViewById(R.id.milestoneGallery);
    if (milestoneGallery == null) {
        throw new IllegalArgumentException("milestoneGallery can not be null.");
    }
    milestoneGallery.setAdapter(new ImageAdapter(this));
    milestoneGallery.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int which, long arg3) {
            String imageFileLocation = imagePhotosLocations[which];
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 26;
            Bitmap b;
            try {
                if (imageFileLocation.startsWith("content://")) {
                    b = BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse(imageFileLocation)), null, options);
                } else {
                    b = BitmapFactory.decodeFile(imageFileLocation, options);
                }
                milestoneImageView.setImageBitmap(b);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    });
}

1 个答案:

答案 0 :(得分:1)

以下是我使用的步骤,

  1. 首先检查SD卡是否已安装。
  2. 查询您的数据库。详细信息可以在这里找到:
    SQLite tutorial
  3. Query返回结果集的游标。
  4. 使用自定义光标适配器(请参阅:Custom Cursor Adapter
  5. 有时,如果图像太大,将图像加载到位图可能会超出VM预算。请参阅此文章Avoiding out of memory issue while loading image

  6. 因此,游标适配器会在代码中返回图像视图。

  7. 最后将此自定义适配器绑定到您的gallary。
  8. 希望这能回答你的问题。