使用ContentProvider管理多媒体内容
16lz
2021-01-26
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();}@Overrideprotected 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() {@Overridepublic 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;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic int getCount() {return pictureList.size();}};listView.setAdapter(adapter);listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic 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();}});}@Overridepublic 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>
更多相关文章
- 网页支付宝支付,通过form表单提交,在苹果手机上无法跳转
- Android从网络中获得一张图片并显示在屏幕上的实例详解
- Android(安卓)干货App开发总结
- Drozer – Android(安卓)APP安全评估工具(附测试案例)
- Android实现图片单点旋转缩放保存-仿百度魔图
- Android(安卓)4.4从图库选择图片,获取图片路径并裁剪
- android获取本地图片或拍照图片
- Android学习札记47:TextView显示Html类解析的网页和图片及自定义
- Android(安卓)图像系列: 图片的压缩