使用ContentProvider管理多媒体内容

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>




 

你可能感兴趣的:(android,ContentProvider,读取添加SD的图片)