android Content Provider获取SD卡图片

android利用Content Provider获取SD卡中的图片及其信息,将其显示在ListView中,点击其中的图片,将图片传到另一个Activity中,并显示出来

先来看几张效果图:


具体的文件存放在SD卡中的Pictures中,如下图:


下面给出具体的实现方法:

1.MainActivity.java

<span style="font-size:18px;"><strong>
package com.android.image;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends ListActivity {

	//上下文
	private Context context;
	//用于显示图片列表
	private ListView show=null;
	//保存图片的名称
	private List<String> names=new ArrayList<String>();
	// 保存图片的大小
	private List<String> sizes=new ArrayList<String>();
	//保存原始图片
	private List<Bitmap> images=new ArrayList<Bitmap>();
	//保存图片的缩略图
	private List<Bitmap> image=new ArrayList<Bitmap>();
	//自定义适配器
	private MyListAdapter listAdapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		context=this;
		show=getListView();
		getAllImage();
		listAdapter=new MyListAdapter(this);
		show.setAdapter(listAdapter);
	}
	//获取图片的信息
	@SuppressLint("NewApi")
	private void getAllImage()
	{
        //使用content provider查询所有的图片信息
		ContentResolver resolver=MainActivity.this.getContentResolver();
		Cursor cursor=resolver.query(Media.EXTERNAL_CONTENT_URI, null, null, null, null);

		while(cursor.moveToNext())
		{
			//获取图片的名称
			String name=cursor.getString(cursor.getColumnIndex(Media.DISPLAY_NAME));
			//获取图片的大小
			String size=cursor.getString(cursor.getColumnIndex(Media.SIZE));
			//获取图片的路径
			String path=cursor.getString(cursor.getColumnIndex(Media.DATA));
			//获取原始图片
			Bitmap bitmap=BitmapFactory.decodeFile(path);
			//获取缩略图,Thumbnails.extractThumbnail(Bitmap bitmap,int width,int height);
			Bitmap bitmap2=ThumbnailUtils.extractThumbnail(bitmap, 50, 40);
			names.add(name);
			sizes.add(size);
			image.add(bitmap2);
			images.add(bitmap);
		}
	}
	//自定义适配器,用于显示图片及其基本信息
	class MyListAdapter extends BaseAdapter
	{
		public MyListAdapter(MainActivity mainActivity) {
			// TODO Auto-generated constructor stub
			context=mainActivity;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return image.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return position;
		}

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

		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			ImageView imageView=null;
			TextView nameText=null;
			TextView sizeText=null;
			if(convertView==null||position<image.size())
			{
				convertView=LayoutInflater.from(context).inflate(R.layout.activity_main, null);
				imageView=(ImageView) convertView.findViewById(R.id.image);
				nameText=(TextView) convertView.findViewById(R.id.name);
				sizeText=(TextView) convertView.findViewById(R.id.size);
			}
			nameText.setText("图片名称:"+names.get(position));
			sizeText.setText("图片大小:"+sizes.get(position));
			imageView.setImageBitmap(image.get(position));
			
		    
			imageView.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					Intent intent=new Intent(MainActivity.this,ShowActivity.class);
					//注意:用Intent传输的byte值不能超过40K 
					byte[] path=BitmapTobyte(images.get(position));
				    intent.putExtra("bitmap", images.get(position));
				    intent.putExtra("path", path);
				    startActivity(intent);
				}
			});
			return convertView;
		}
	}
	
	//Bitmap转byte[]
	private byte[] BitmapTobyte(Bitmap bm){

	    ByteArrayOutputStream baos = new ByteArrayOutputStream();

	    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);

	    return baos.toByteArray();   
	}
}</strong></span>
2.ShowActivity.java
</pre></p><p><span style="font-size:18px;"><strong></strong></span><pre name="code" class="java">
package com.android.image;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.widget.ImageView;

public class ShowActivity extends Activity {

	private ImageView imageView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_show);
		imageView=(ImageView) findViewById(R.id.show);
		Intent intent=getIntent();
		byte[] path=intent.getByteArrayExtra("path");
		Bitmap bitmap=bytesToBitmap(path);
		imageView.setImageBitmap(bitmap);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.show, menu);
		return true;
	}
	//byte[]转Bitmap
	private Bitmap bytesToBitmap(byte[] b){

        if(b.length!=0){
                return BitmapFactory.decodeByteArray(b, 0, b.length);
        }
        else {
                return null;

        }
    }
}

3.activity_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="horizontal"
    android:background="#000"
    tools:context=".MainActivity" >

    <ImageView 
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10sp"
        android:contentDescription="@string/hello_world"/>
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_marginTop="10sp">
        <TextView 
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#fff"
            />
        <TextView 
            android:id="@+id/size"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#fff"
            />
    </LinearLayout>

</LinearLayout>

4.activity_show.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=".ShowActivity" >

    <ImageView 
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/hello_world"/>

</LinearLayout>

5.加入相应的读取SD卡的权限

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />

以上就是具体的实现方法,但是还存在很多不足!希望广大博友给予建议。

不足:1.传到另一个Activity中的byte不能超过40K,如果图片过大就会出错。

           2.不知道为什么在我手机上运行不了,打开之后就直接停止。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值