首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

在GridView中显示sd卡中的图片

2012-09-23 
在GridView中展示sd卡中的图片package blog.android.sdcardimport android.app.Activityimport android.

在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[count];        for (int i = 0; i < count; i++) {            final ImageView v = (ImageView) grid.getChildAt(i);            list[i] = 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 楼 JACKDG2010 2011-09-03   请问楼主的布局文件是怎样写的?
     我的程序怎么老报找不到GridView? 2 楼 wgsddfe 2011-09-21   运行您的照片,怎么发现点了一张照片之后,显示的是另外一张啊 3 楼 xunhuan01 2012-06-29   columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();  这都是什么啊 4 楼 星星cnuie 2012-08-01   您好 运行您的程序 可是显示的SD卡的图片不全 而且进行添加或删除图片的调整后 能够显示的图片更少了 最后没有了……请问是为什么、?

热点排行