ContentProvider学习笔记(下)--查看内存卡上的图片

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   	android:orientation="vertical"
    >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/look"
            android:id="@+id/look"
            ></Button>
        
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/add"
            android:id="@+id/add"
            
            ></Button>
    </LinearLayout>

    <ListView 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    	android:id="@+id/listview"
        >
    </ListView>

</LinearLayout>


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<Map<String,Object>> maps = new ArrayList<Map<String,Object>>();
	private ArrayList<String> filePath = new ArrayList<String>();//用来存放文件路径的集合
	
	
	@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<String,Object> map = new HashMap<String,Object>();
				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疯狂讲义》

文章系原创,转载请注明出处



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值