wang_peng1 发表于 2013-1-15 02:29:34

在GridView中展示sd卡中的图片

package blog.android.sdcard;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;import android.widget.AdapterView.OnItemClickListener;/** * Displays images from an SD card. */public class SDCardImagesActivity extends Activity {    /**   * Cursor used to access the results from querying for images on the SD card.   */    private Cursor cursor;    /*   * Column index for the Thumbnails Image IDs.   */    private int columnIndex;    @Override    public void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.sdcard);      // Set up an array of the Thumbnail Image ID column we want      String[] projection = {MediaStore.Images.Thumbnails._ID};      // Create the cursor pointing to the SDCard      cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,                projection, // Which columns to return                null,       // Return all rows                null,                MediaStore.Images.Thumbnails.IMAGE_ID);      // Get the column index of the Thumbnails Image ID      columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);      GridView sdcardImages = (GridView) findViewById(R.id.sdcard);      sdcardImages.setAdapter(new ImageAdapter(this));      // Set up a click listener      sdcardImages.setOnItemClickListener(new OnItemClickListener() {            public void onItemClick(AdapterView parent, View v, int position, long id) {                // Get the data location of the image                String[] projection = {MediaStore.Images.Media.DATA};                cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                        projection, // Which columns to return                        null,       // Return all rows                        null,                        null);                columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);                cursor.moveToPosition(position);                // Get image filename                String imagePath = cursor.getString(columnIndex);                // Use this path to do further processing, i.e. full screen display            }      });    }    /**   * Adapter for our image files.   */    private class ImageAdapter extends BaseAdapter {      private Context context;      public ImageAdapter(Context localContext) {            context = localContext;      }      public int getCount() {            return cursor.getCount();      }      public Object getItem(int position) {            return position;      }      public long getItemId(int position) {            return position;      }      public View getView(int position, View convertView, ViewGroup parent) {            ImageView picturesView;            if (convertView == null) {                picturesView = new ImageView(context);                // Move cursor to current position                cursor.moveToPosition(position);                // Get the current value for the requested column                int imageID = cursor.getInt(columnIndex);                // Set the content of the image based on the provided URI                picturesView.setImageURI(Uri.withAppendedPath(                        MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID));                picturesView.setScaleType(ImageView.ScaleType.FIT_CENTER);                picturesView.setPadding(8, 8, 8, 8);                picturesView.setLayoutParams(new GridView.LayoutParams(100, 100));            }            else {                picturesView = (ImageView)convertView;            }            return picturesView;      }    }}The layout of the main activity is shown below:<?xml version="1.0" encoding="utf-8"?><GridView xmlns:android="http://schemas.android.com/apk/res/android"   android:id="@+id/sdcard"    android:layout_width="fill_parent"   android:layout_height="fill_parent"    android:padding="10dp"    android:verticalSpacing="10dp"    android:horizontalSpacing="10dp"    android:numColumns="auto_fit"    android:columnWidth="90dp"    android:stretchMode="columnWidth"    android:gravity="center"/> 注意 通常最好是自己在sd卡中已经弄成了一些小图片
MediaStore.Images.Thumbnails._ID 换成MediaStore.Images.Thumbnails.IMAGE_ID 是因为有时候小图片不显示,而且有时候还会出现错误的路径所以使用
cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
projection, // Which columns to return
null,       // Return all rows
null,
MediaStore.Images.Thumbnails.IMAGE_ID);
而不是
cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
projection, // Which columns to return
null,       // Return all rows
null,
null);
main.xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sdcard"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:columnWidth="90dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
/>

 
改进一下
package blog.android.sdcard2;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.ArrayList;import android.app.Activity;import android.content.Context;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.drawable.BitmapDrawable;import android.net.Uri;import android.os.AsyncTask;import android.os.Bundle;import android.provider.MediaStore;import android.view.Display;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;import android.widget.AdapterView.OnItemClickListener;/** * Loads images from SD card.** @author Mihai Fonoage * */public class LoadImagesFromSDCardActivity extends Activity implementsOnItemClickListener {      /**   * Grid view holding the images.   */    private GridView sdcardImages;    /**   * Image adapter for the grid view.   */    private ImageAdapter imageAdapter;    /**   * Display used for getting the width of the screen.      */    private Display display;    /**   * Creates the content view, sets up the grid, the adapter, and the click listener.   *      * @see android.app.Activity#onCreate(android.os.Bundle)   */    @Override    public void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);                // Request progress bar      requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);      setContentView(R.layout.sdcard);      display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();      setupViews();      loadImages();    }    /**   * Free up bitmap related resources.   */    protected void onDestroy() {      super.onDestroy();      final GridView grid = sdcardImages;      final int count = grid.getChildCount();      ImageView v = null;      for (int i = 0; i < count; i++) {            v = (ImageView) grid.getChildAt(i);            ((BitmapDrawable) v.getDrawable()).setCallback(null);      }    }    /**   * Setup the grid view.   */    private void setupViews() {      sdcardImages = (GridView) findViewById(R.id.sdcard);      sdcardImages.setNumColumns(display.getWidth()/95);      sdcardImages.setClipToPadding(false);      sdcardImages.setOnItemClickListener(LoadImagesFromSDCardActivity.this);      imageAdapter = new ImageAdapter(getApplicationContext());         sdcardImages.setAdapter(imageAdapter);    }    /**   * Load images.   */    private void loadImages() {      final Object data = getLastNonConfigurationInstance();      if (data == null) {            new LoadImagesFromSDCard().execute();      } else {            final LoadedImage[] photos = (LoadedImage[]) data;            if (photos.length == 0) {                new LoadImagesFromSDCard().execute();            }            for (LoadedImage photo : photos) {                addImage(photo);            }      }    }    /**   * Add image(s) to the grid view adapter.   *      * @param value Array of LoadedImages references   */    private void addImage(LoadedImage... value) {      for (LoadedImage image : value) {            imageAdapter.addPhoto(image);            imageAdapter.notifyDataSetChanged();      }    }      /**   * Save bitmap images into a list and return that list.      *      * @see android.app.Activity#onRetainNonConfigurationInstance()   */    @Override    public Object onRetainNonConfigurationInstance() {      final GridView grid = sdcardImages;      final int count = grid.getChildCount();      final LoadedImage[] list = new LoadedImage;      for (int i = 0; i < count; i++) {            final ImageView v = (ImageView) grid.getChildAt(i);            list = new LoadedImage(((BitmapDrawable) v.getDrawable()).getBitmap());      }      return list;    }    /**   * Async task for loading the images from the SD card.      *      * @author Mihai Fonoage   *   */    class LoadImagesFromSDCard extends AsyncTask<Object, LoadedImage, Object> {                /**         * Load images from SD Card in the background, and display each image on the screen.          *         * @see android.os.AsyncTask#doInBackground(Params[])         */      @Override      protected Object doInBackground(Object... params) {            setProgressBarIndeterminateVisibility(true);             Bitmap bitmap = null;            Bitmap newBitmap = null;            Uri uri = null;                        // Set up an array of the Thumbnail Image ID column we want            String[] projection = {MediaStore.Images.Thumbnails._ID};            // Create the cursor pointing to the SDCard            Cursor cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,                  projection, // Which columns to return                  null,       // Return all rows                  null,                           null);             int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);            int size = cursor.getCount();            // If size is 0, there are no images on the SD Card.            if (size == 0) {                //No Images available, post some message to the user            }            int imageID = 0;            for (int i = 0; i < size; i++) {                cursor.moveToPosition(i);                imageID = cursor.getInt(columnIndex);                uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID);                try {                  bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));                  if (bitmap != null) {                        newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);                        bitmap.recycle();                        if (newBitmap != null) {                            publishProgress(new LoadedImage(newBitmap));                        }                  }                } catch (IOException e) {                  //Error fetching image, try to recover                }            }            cursor.close();            return null;      }      /**         * Add a new LoadedImage in the images grid.         *         * @param value The image.         */      @Override      public void onProgressUpdate(LoadedImage... value) {            addImage(value);      }      /**         * Set the visibility of the progress bar to false.         *          * @see android.os.AsyncTask#onPostExecute(java.lang.Object)         */      @Override      protected void onPostExecute(Object result) {            setProgressBarIndeterminateVisibility(false);      }    }    /**   * Adapter for our image files.      *      * @author Mihai Fonoage   *   */    class ImageAdapter extends BaseAdapter {      private Context mContext;         private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();      public ImageAdapter(Context context) {             mContext = context;         }         public void addPhoto(LoadedImage photo) {             photos.add(photo);         }         public int getCount() {             return photos.size();         }         public Object getItem(int position) {             return photos.get(position);         }         public long getItemId(int position) {             return position;         }         public View getView(int position, View convertView, ViewGroup parent) {             final ImageView imageView;             if (convertView == null) {               imageView = new ImageView(mContext);             } else {               imageView = (ImageView) convertView;             }             imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);            imageView.setPadding(8, 8, 8, 8);            imageView.setImageBitmap(photos.get(position).getBitmap());            return imageView;         }   }    /**   * A LoadedImage contains the Bitmap loaded for the image.   */    private static class LoadedImage {      Bitmap mBitmap;      LoadedImage(Bitmap bitmap) {            mBitmap = bitmap;      }      public Bitmap getBitmap() {            return mBitmap;      }    }    /**   * When an image is clicked, load that image as a puzzle.      */    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {                int columnIndex = 0;      String[] projection = {MediaStore.Images.Media.DATA};      Cursor cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,                projection,                null,               null,               null);      if (cursor != null) {            columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);            cursor.moveToPosition(position);            String imagePath = cursor.getString(columnIndex);             FileInputStream is = null;            BufferedInputStream bis = null;            try {                is = new FileInputStream(new File(imagePath));                bis = new BufferedInputStream(is);                Bitmap bitmap = BitmapFactory.decodeStream(bis);                Bitmap useThisBitmap = Bitmap.createScaledBitmap(bitmap, parent.getWidth(), parent.getHeight(), true);                bitmap.recycle();                //Display bitmap (useThisBitmap)            }             catch (Exception e) {                //Try to recover            }            finally {                try {                  if (bis != null) {                        bis.close();                  }                  if (is != null) {                        is.close();                  }                  cursor.close();                  projection = null;                } catch (Exception e) {                }            }      }    }} 
页: [1]
查看完整版本: 在GridView中展示sd卡中的图片