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

news/2024/8/26 16:40:49

        在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;
	
	@Override
	protected 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(){	
		@Override
		public 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{
		@Override
		public 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();
			}
		}
		
	}
	@Override
	public 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;
		}
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mImageArr.size();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return mImageArr.get(arg0);
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public 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;
		}
		
	}
}

http://www.niftyadmin.cn/n/3013087.html

相关文章

python在水文领域中的应用_python在水利工程或者水文方向上有什么案例可以学习一下么?或者还要学什么库。?...

Python在水文水利方面的用途我接触过的大概四类。 一是画图&#xff0c;这个主要是用matplotlib。matplotlib基本是照搬matlab的画图功能&#xff0c;很多命令都不带改的&#xff0c;如果你没有正版matlab&#xff08;又不愿意用盗版&#xff09;&#xff0c;完全可以用matplot…

Android开发之dp

关于Android的dp和sp单位&#xff0c;相信大家一定有很多疑问&#xff1f;下面的答案直接来自本人在知乎的回答。出处&#xff1a;http://www.zhihu.com/question/20697111/answer/227226711.在Xdpi下绘制Xpx长度&#xff0c;实际的物理距离都是1英寸&#xff0c;为什么一定要选…

python顺序结构的表示_Python学习笔记3——三大结构:顺序,分支,循环3

顺序 自上而下&#xff0c;依次执行 分支 分支的基本语法 if 条件表达式&#xff1a; 语句1 语句2 语句3 ...... 条件表达式就是计算结果必须为布尔值的表达式 表达式后面的冒号不能少 注意if后面的出现的语句&#xff0c;如果属于if语句块&#xff0c;则必须同一个锁紧等级 条…

计算机设置调整吃鸡,《绝地求生》最全设置调整知识,让你的低配电脑也能享受高配画质...

《绝地求生》大热&#xff0c;steam销量突破2000万大关&#xff0c;中国玩家占了绝大多数&#xff0c;国内近日也掀起了“吃鸡潮”&#xff0c;但与此同时&#xff0c;不少玩家反应“吃鸡”对配置要求太高了&#xff0c;自己家去年买的电脑今年就带不起了&#xff0c;其实喷饭君…

python打开txt文件找不到_电脑上打开方式找不到了怎么办?

驱动哥最近所在的城市下了暴雨&#xff0c;不知道你们的城市天气怎么样呢&#xff1f;日常问候完毕&#xff0c;下面是今日份的技术教程&#xff0c;请各位大佬们放心“食用”哦。大家在日常使用电脑时有没有注意到&#xff0c;无论是Win7 还是 Win10 系统&#xff0c;当你的每…

吴忠三中2020年初三计算机考试分数,2020年中考录取分

2020四川中考最高分是多少目前只有四川泸州公布了中考最高分&#xff0c;考生总分735。其他地区小编会为大家持续关注。请大家耐心等待。2020年辽宁丹东中考录取分数线丹东二中统招分数线806分&#xff0c;录取了75人(6选2)。丹东四中统招分数线731分&#xff0c;录取了96人&am…

【ExtjsV6.0初级】Extjs引入Echarts方法(Extjs整合Echarts)

背景&#xff1a;Extjs的框架很强大&#xff0c;Echarts的图标功能很强大&#xff0c;开发时候想在Extjs中引入Echarts&#xff0c;使用它的图表功能。 说明&#xff1a;Extjs版本为ext-6.0.1&#xff0c;使用的是GPL开源版本&#xff1b;Echarts是3.2.3版本&#xff0c;例子就…

优化外汇服务器,优化外汇业务管理 提升跨境贸易便利化水平

原标题&#xff1a;优化外汇业务管理 提升跨境贸易便利化水平毕节市中心支局认真贯彻落实总局支持涉外业务发展相关文件精神&#xff0c;提升外汇管理服务实体经济能力和水平&#xff0c;加强对银行执行便利化政策的指导和监督&#xff0c;深入推进“放管服”改革&#xff0c;为…