使用gridview从SD卡上的特定文件夹显示图像

我正在尝试创build一个从一个特定的文件夹驻留在SD卡上的图像加载的GridView。 该文件夹的path是已知的(“/ SD卡/图片”),但在网上看到的例子,我不确定如何或在哪里指定图片文件夹的path,我想加载图像。 我已经读了几十个教程,甚至在developer.android.com上的HelloGridView教程,但这些教程并没有教我什么我正在寻找。

到目前为止,我读过的每篇教程都有:

A)将图像从/ res文件夹命名为Drawable,并将它们放入要加载的数组中,而不是使用SDCard。

B)使用MediaStore访问SDCard上的所有图片,但未指定如何设置要显示图像的文件夹的path

要么

C)build议使用BitmapFactory,我没有丝毫的线索如何使用。

如果我以错误的方式讨论这个问题,请告诉我,指导我采取正确的方法来做我想做的事情。

好吧,经过多次尝试,我终于有了一个可行的例子,我想我会分享它。 我的示例查询图像MediaStore,然后获取每个图像的缩略图显示在视图中。 我正在将我的图像加载到Gallery对象中,但这不是此代码工作的要求:

确保您在类级别定义的列索引具有Cursor和int,以便Gallery的ImageAdapter可以访问它们:

private Cursor cursor; private int columnIndex; 

首先,获取位于该文件夹中的图像ID的光标:

 Gallery g = (Gallery) findViewById(R.id.gallery); // request only the image ID to be returned String[] projection = {MediaStore.Images.Media._ID}; // Create the cursor pointing to the SDCard cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, MediaStore.Images.Media.DATA + " like ? ", new String[] {"%myimagesfolder%"}, null); // Get the column index of the image ID columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); g.setAdapter(new ImageAdapter(this)); 

然后,在图库的ImageAdapter中,获取要显示的缩略图:

 public View getView(int position, View convertView, ViewGroup parent) { ImageView i = new ImageView(context); // Move cursor to current position cursor.moveToPosition(position); // Get the current value for the requested column int imageID = cursor.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(getContentResolver(), originalImageId, MediaStore.Images.Thumbnails.MINI_KIND, null); i.setImageBitmap(b); i.setLayoutParams(new Gallery.LayoutParams(150, 100)); i.setScaleType(ImageView.ScaleType.FIT_XY); i.setBackgroundResource(mGalleryItemBackground); return i; } 

我猜这个代码中最重要的部分是managedQuery,演示了如何使用MediaStore查询过滤特定文件夹中的图像文件列表。

您需要在developer.android.com上执行比GridView教程更多的步骤。 使用以下教程http://developer.android.com/resources/tutorials/views/hello-gridview.html

你需要添加一个方法来创buildSD卡中文件的ImageView:

创build/添加一个Vector到你的类variables(来保存一个ImageView的列表):

 private Vector<ImageView> mySDCardImages; 

初始化vector:

 mySDCardImages = new Vector<ImageView>(); 

创build一个方法来加载图像:

 List<Integer> drawablesId = new ArrayList<Integer>(); int picIndex=12345; File sdDir = new File("/sdcard/pictures"); File[] sdDirFiles = sdDir.listFiles(); for(File singleFile : sdDirFiles) { ImageView myImageView = new ImageView(context); myImageView.setImageDrawable(Drawable.createFromPath(singleFile.getAbsolutePath()); myImageView.setId(picIndex); picIndex++; drawablesId.add(myImageView.getId()); mySDCardImages.add(myImageView); } mThumbIds = (Integer[])drawablesId.toArray(new Integer[0]); 

然后在你的ImageAdapter方法中,改变

 imageView.setImageResource(mThumbIds[position]); 

 imageView.setImageDrawable(mySDCardImages.get(position).getDrawable()); 

从ImageAdapter中移除mThumbIds的初始化。 (它应该与mySDCardImages的定义一起使用,可以同时用于两个类的方法。)

(快速和肮脏的版本)确保testing你的path等,并捕捉任何exception。

在你的情况下,BitmaFactory可能是一个好的方法。 例:

 File dir = new File( "/sdcard/pictures" ); String[] fileNames = dir.list(new FilenameFilter() { boolean accept (File dir, String name) { if (new File(dir,name).isDirectory()) return false; return name.toLowerCase().endsWith(".png"); } }); for(string bitmapFileName : fileNames) { Bitmap bmp = BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName); // do something with bitmap } 

没有时间来testing这个,但应该工作;-)

阅读这个链接: http : //androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html
它显示了如何使用mediastore和bitmapfactory。

你应该select的方式取决于你需要什么。 如果你有一组静态的图像,把它们放在drawable中是更好的办法,我想这样做的速度会更快,而且你不需要依靠sd卡,它可以被删除,损坏或者文件可以被重命名/删除

如果图像是dynamic的,则使用mediastore或位图工厂。 但请记住,将图像放入数组或某些内存非常消耗,最终可能会导致内存exception

看起来你想要自定义画廊,这将需要很多时间,

我build议你为你的工作获得自定义相机画廊 。

您可以根据需要在网格视图中获取照片/video。