android系统同样为其他的应用程序访问多媒体资源提供了ContentProvider
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在SD卡上的音频文件ContentProvider的URI
MediaStore.Audio.Media.INTERNAL_CONTENT_URI :存储在手机内部存储器卡上的音频文件ContentProvider的URI
MediaStore.Images.Media.EXTERNAL_CONTENT_URI:存储在SD卡上的图像文件文件ContentProvider的URI
MediaStore.Images.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上图像文件ContentProvider的URI
MediaStore.Video.Media.INTERNAL_CONTENT_URI:存储在手机内部存储器上的视频文件ContentProvider的URI
MediaStore.Video.Media.EXTERNAL_CONTENT_URI:存储在SD卡上的视频文件ContentProvider的URI
这是在系统中,android为我们提供的方法问多媒体库的URI ,在这个应用中,用到了MediaStore.Images.Media.EXTERNAL_CONTENT_URI来获取多媒体中存放在SD卡上的图像资源,在这个小应用中,单击查看按钮的时候将SD卡上的图像的名称放在一个listview中显示出来,单击添加按钮的时候,将一张图片添加到多媒体库中,当点击一个item的时候,将文件名对应的图像通过一个对话框显示出来。
考虑到用户在点击查看之后,再点击添加按钮,这个时候ContentProvider中的数据就发生了变化,所以在应用中还需要为ContentProvider添加一个监听器。监听ContentProvider数据变化的监听器需要继承ContentObserver类,并且重写其中的OnChange方法,当它监听的ContentProvider的数据发生变化的时候onChange方法就会自动的调用。
为了监听ContentProvider中数据的变化,还需要为ContentResolver注册一个监听器,需要调用其registerContentObserver方法,其中的是三个参数解释如下,uri:改监听器监听的ContentProvider的uri,notifyForDescendents:如果改参数为true,假如注册监听的URI为content://adc,那么URI为content://adc/xyz或者content://adc/xyx/fff 的数据发生变化时候也会触发该监听器,否则只有URI为content://adc的数据发生变化的时候才会触发监听器,observer为监听器实例。
下面为实现代码
MainActivity.xml
item.xml中只有一个TextView用来显示文件名,view.xml文件中只有一个ImageView用来显示图像,因此在这里不在给出。
MainActivity.java
package com.example.myosimgview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.database.ContentObserver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button lookButton ;
private Button addButton;
private ListView listview;
private ArrayList> maps = new ArrayList>();
private ArrayList filePath = new ArrayList();//用来存放文件路径的集合
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lookButton = (Button) this.findViewById(R.id.look);
addButton = (Button) this.findViewById(R.id.add);
//为contentresolver注册一个监听器,监听MediaStore.Images.Media.EXTERNAL_CONTENT_URI
this.getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, new MyContentObserver(new Handler()){});
lookButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Cursor cursor = MainActivity.this.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
HashMap map = new HashMap();
byte [] data = cursor.getBlob(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
String path = new String(data);
filePath.add(path);
map.put("name",name);
maps.add(map);
}
listview = (ListView) MainActivity.this.findViewById(R.id.listview);
SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,maps,R.layout.item,new String[]{"name"},new int []{R.id.name});
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView> arg0, View arg1,
int arg2, long arg3) {
View view = MainActivity.this.getLayoutInflater().inflate(R.layout.view, null);
ImageView image = (ImageView) view.findViewById(R.id.image);
image.setImageBitmap(BitmapFactory.decodeFile(filePath.get(arg2)));
new AlertDialog.Builder(MainActivity.this).setView(view).setPositiveButton("确定", null).show();
}
});
listview.setAdapter(adapter);
}
});
addButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.a);
String resultURI = MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(), bitmap, "美女","清纯美女");
if(resultURI != null){
Toast.makeText(MainActivity.this, "添加图片成功", 0).show();
//当ContentProvider中的数据发生变化的时候,通知所有的监听者(第二个参数为null表示通知所有的监听者)
MainActivity.this.getContentResolver().notifyChange(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null);
}
}});
}
private class MyContentObserver extends ContentObserver{
public MyContentObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
//当收到了数据改变通知的时候,用Toast的方式通知用户
Toast.makeText(MainActivity.this, "系统中添加了新图片,请按查看按钮查看", 0).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
本文参考用书:《Android疯狂讲义》
文章系原创,转载请注明出处