Android为多媒体提供的ContentProvider的Uri如下:
1、MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在手机外部存储器(SD卡)上的音频文件内容的ContentProvider的Uri。
2、MediaStore.Audio.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的音频文件内容的ContentProvider的Uri。
3、MediaStore.Audio.Images.EXTERNAL_CONTENT_URI:存储在手机外部存储器(SD卡)上的图片文件内容的ContentProvider的Uri。
4、MediaStore.Audio.Images.INTERNAL_CONTENT_URI:存储在手机内部存储器上的图片文件内容的ContentProvider的Uri。
5、MediaStore.Audio.Video.EXTERNAL_CONTENT_URI:存储在手机外部存储器(SD卡)上的视频文件内容的ContentProvider的Uri。
6、MediaStore.Audio.Video.INTERNAL_CONTENT_URI:存储在手机内部存储器上的视频文件内容的ContentProvider的Uri。
下面用一个简单实例来演示,实现查询SD卡的所有图片和添加图片到SD卡的功能,代码如下:
Activity:
package com.lovo.activity;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.lovo.readpictures.R;
public class MainActivity extends Activity implements OnClickListener {
private ListView listView;
private BaseAdapter adapter;
// 存放SD卡图片的集合
private ArrayList<HashMap<String, Object>> pictureList = new ArrayList<HashMap<String, Object>>();
/**
* 从SD卡取出图片,初始化集合数据
*/
public void initData() {
pictureList.clear();
Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI,
null, null, null, null);
while (cursor.moveToNext()) {
// 图片的名称
String name = cursor.getString(cursor
.getColumnIndex(Media.DISPLAY_NAME));
// 图片的描述
String info = cursor.getString(cursor
.getColumnIndex(Media.DESCRIPTION));
// 图片位置的数据
byte[] data = cursor.getBlob(cursor.getColumnIndex(Media.DATA));
// 将data转换成String类型的图片路径
String path = new String(data, 0, data.length - 1);
HashMap map = new HashMap();
map.put("name", name == null ? "" : name);
map.put("info", info == null ? "" : info);
map.put("path", path);
pictureList.add(map);
}
cursor.close();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initData();
listView = (ListView) findViewById(R.id.main_lv);
Button addBtn = (Button) findViewById(R.id.main_btn_add);
addBtn.setOnClickListener(this);
adapter = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = MainActivity.this.getLayoutInflater()
.inflate(R.layout.picture_list_content, null);
}
ImageView picImageView = (ImageView) convertView
.findViewById(R.id.picture_list_content_iv_pic);
TextView nameText = (TextView) convertView
.findViewById(R.id.picture_list_content_tv_name);
TextView infoText = (TextView) convertView
.findViewById(R.id.picture_list_content_tv_info);
// 取出当前图片信息
String name = pictureList.get(position).get("name").toString();
String info = pictureList.get(position).get("info").toString();
String path = pictureList.get(position).get("path").toString();
nameText.setText(name);
infoText.setText(info);
// 根据图片路径创建Bitmap对象
Bitmap bitmap = BitmapFactory.decodeFile(path);
picImageView.setImageBitmap(bitmap);
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public int getCount() {
return pictureList.size();
}
};
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// 加载view.xml界面布局代表的视图
View viewDialog = getLayoutInflater().inflate(R.layout.view,
null);
// 获取viewDialog中的ImageView组件
ImageView image = (ImageView) viewDialog
.findViewById(R.id.view_iv);
// 设置image显示指定图片
image.setImageBitmap(BitmapFactory.decodeFile(pictureList
.get(position).get("path").toString()));
// 使用对话框显示用户单击的图片
new AlertDialog.Builder(MainActivity.this).setView(viewDialog)
.setPositiveButton("确定", null).show();
}
});
}
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
// 设置图片名称
values.put(Media.DISPLAY_NAME, "机器人");
// 设置图片描述
values.put(Media.DESCRIPTION, "android机器人");
// 设置图片MIME类型
values.put(Media.MIME_TYPE, "image/png");
// 先插入values已有的值,同时得到Uri对象
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
values);
// 加入图片需要单独打开输出流来进行操作
try {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
// 获取刚刚插入的数据的Uri对应的输出流
OutputStream os = getContentResolver().openOutputStream(uri);
// 将bitmap图片保存到Uri对应的数据节点中
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
os.close();
} catch (Exception e) {
e.printStackTrace();
}
initData();
adapter.notifyDataSetChanged();
}
}
布局XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/main_btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加图片" />
<ListView
android:id="@+id/main_lv"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
对话框的布局XML(view.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/view_iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>