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>