2012-03-25 81 views
0

我想用sdcard的照片创建图库。我有一个数据库表。表格中的一列有通往照片的路径。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

下面是如果SD卡被安装,我使用的步骤,

  1. 首先检查。
  2. 查询您的数据库。有关详情,请访问:
    SQLite tutorial
  3. 查询返回结果集的游标。
  4. 使用自定义光标适配器(参见:Custom Cursor Adapter
  5. 有些时候,如果图像是太大,图像加载到位可能会超过VM预算。因此,请参阅此文章Avoiding out of memory issue while loading image

  6. 因此,游标适配器将返回图像视图,如同在代码中完成的一样。

  7. 最后将此自定义适配器绑定到您的gallary。

希望能回答你的问题。

+0

谢谢。我会试一试。 – user826323 2012-03-25 13:59:24