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.不知道为什么在我手机上运行不了,打开之后就直接停止。