Android开发之多媒体——显示手机存储的图片

来源:互联网 发布:知乎海尔收购通用电器 编辑:程序博客网 时间:2024/06/05 19:54

        在Android中多媒体文件(音乐/视频/图片)是通过MediaStore来统一管理的,本文所演示的例子是通过MediaStore获取手机存储中的图片,然后在Gallery中显示出来。例子最后的效果:

下面先贴出本文需要添加和修改的文件:main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity" >    <Gallery android:id="@+id/gallery" android:layout_width="match_parent" android:layout_height="match_parent"/>  </LinearLayout>
上面的xml主要做的工作就是新建了一个Gallery,下面会用来存放图片。
MainActivity.java

public class MainActivity extends Activity {private Gallery mGallery;private ArrayList<Bitmap> mImageArr = new ArrayList<Bitmap>();public static final String LOG_TAG = "MainActivity";private static final int LOAD_END = 1;private static final String mUriImage = MediaStore.Images.Media.DATA;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mGallery = (Gallery)findViewById(R.id.gallery);loadPicHandle.post(new LocadImage());//使用Handler在后台线程获取图片,获取完成之后发通知,UI线程更新显示}private  Handler loadPicHandle = new Handler(){@Overridepublic void handleMessage(android.os.Message msg) {switch(msg.what){case LOAD_END:mGallery.setAdapter(new ImageAdapter(MainActivity.this,mImageArr));break;default :break;}};};public class LocadImage implements Runnable{@Overridepublic void run() {Context ctx = MainActivity.this;ContentResolver contentR = ctx.getContentResolver();Cursor cursor = null;String[] projection = { MediaStore.Images.Media._ID, MediaStore.Images.Media.MIME_TYPE,                  MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE };      String selection = MediaStore.Images.Media.MIME_TYPE + "=?";      String[] selectionArgs = { "image/jpeg" };      String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " desc";  try{cursor = contentR.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection,                  selectionArgs, sortOrder);if( null == cursor){Log.d(LOG_TAG,"cursor is null");}int iCount = cursor.getCount();cursor.moveToFirst();//如果图片过多内存不足会Crash,超过10张只加载10张if( iCount > 10 ){iCount = 10;}for( int i = 0; i < iCount; i++ ){int index = cursor.getColumnIndex(mUriImage);String src = cursor.getString(index);Log.d(LOG_TAG,"src:"+src);                                        //通过图片的路径加载图片Bitmap bitmap = BitmapFactory.decodeFile( src, null );mImageArr.add(bitmap);cursor.moveToNext();}if( !mImageArr.isEmpty() ){Message msg = Message.obtain();msg.what = LOAD_END;loadPicHandle.sendMessage(msg);}}catch(Exception e){Log.e(LOG_TAG, e.getMessage());}finally{cursor.close();}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}private class ImageAdapter extends BaseAdapter{private Context mContext;ArrayList<Bitmap> mImageArr;public ImageAdapter(Context mContext,ArrayList<Bitmap> mImageArr) {this.mContext = mContext;this.mImageArr = mImageArr;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mImageArr.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn mImageArr.get(arg0);}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}@Overridepublic View getView(int position, View arg1, ViewGroup arg2) {Tools.log("getView position:"+position);ImageView image = new ImageView(mContext);image.setImageBitmap(mImageArr.get(position));image.setLayoutParams(new Gallery.LayoutParams(640, 640));return image;}}}
0 0
原创粉丝点击