得到sd卡图片的方法总结
图片 url android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
URI_MATCHER.addURI("media", "*/images/thumbnails/#", IMAGES_THUMBNAILS_ID);
【1】从Android2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取。
1. static Bitmap createVideoThumbnail(String filePath, int kind) //获取视频文件的缩略图,第一个参数为视频文件的位置,比如/sdcard/android123.3gp,而第二个参数可以为MINI_KIND或MICRO_KIND最终和分辨率有关
2. static Bitmap extractThumbnail(Bitmap source, int width, int height, int options) //直接对Bitmap进行缩略操作,最后一个参数定义为OPTIONS_RECYCLE_INPUT,来回收资源
3. static Bitmap extractThumbnail(Bitmap source, int width, int height) // 这个和上面的方法一样,无options选项
最后Android开发网再次提醒大家,ThumbnailUtils类是API Level从8或更高才开始支持的。
以下转自:http://blog.csdn.net/jing_huanhuan/article/details/6136075
获取视频文件:
Java代码
1.ContentResolver contentResolver = getContentResolver();
2. String[] projection = new String[] { MediaStore.Video.Media.TITLE };
3. Cursor cursor = contentResolver.query(
4. MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null,
5. null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);
6. cursor.moveToFirst();
7. int fileNum = cursor.getCount();
8.
9. for (int counter = 0; counter < fileNum; counter++) {
10. Log.w("tag", "---file is:" +
11. cursor.getString(cursor
12. .getColumnIndex(MediaStore.Video.Media.TITLE)));
13. cursor.moveToNext();
14. }
15. cursor.close();
如果获取路径,需要讲projection修改为String[] projection = new String[]{MediaStore.Video.Media.DATA};
获取的语句也需要修改为:cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
获取音频文件:
Java代码
1.Cursor cursor = getContentResolver().query(
2. MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
3. MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
4. cursor.moveToFirst();
5. int counter = cursor.getCount();
6. String title = cursor.getString(cursor
7. .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
8.
9. Log.w("tag", "before looping,title=" + title);
10. for (int j = 0; j < counter; j++) {
11. Log.w("tag", "title=" +
12. cursor.getString(cursor
13. .getColumnIndex(MediaStore.Audio.Media.TITLE)));
14. cursor.moveToNext();
15. }
16. cursor.close();
以下转自:http://blog.sina.com.cn/s/blog_5be1061c0100ctco.html
首先给大家讲android的多媒体数据库。MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频
,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了。今天我就介绍一些
这些接口的用法。
首先,要得到一个ContentResolver实例,ContentResolver可以这样获取,利用一个Activity或者Service的Context即可。如下所示:
ContentResolver mResolver = ctx.getContentResolver();
上面的那个ctx的就是一个context,Activity.this就是那个Context,这个Context就相当于一个上下文环境。得到这个Context后就可以调用getContentResolver接口获取ContentResolver实例了。
ContentResolver实例获得后,就可以进行各种查询,下面我就以音频数据库为例讲解增删改查的方法,视频和图像和音频非常类似。
在讲解各种查询之前,我给大家介绍下怎么看android都提供了哪些多媒体表。在adb shell中,找到/data/data/com.android.providers.media/databases/下,然后找到SD卡的数据库文件(一般是
一个.db文件),然后输入命令sqlite3加上这个数据库的名字就可以查询android的多媒体数据库了。.table命令可以列出所有多媒体数据库的表,.scheme加上表名可以查询表中的所有列名。这里可以利
用SQL语句来查看你想要的数据,记得最后一定要记住每条语句后面都加上分号。下面开始讲述怎么在这些表上进行增删改查。
查询,代码如下所示:
Cursor cursor = resolver.query(_uri, prjs, selections, selectArgs, order);
ContentResolver的query方法接受几个参数,参数意义如下:
Uri:这个Uri代表要查询的数据库名称加上表的名称。这个Uri一般都直接从MediaStore里取得,例如我要取所有歌的信息,就必须利用MediaStore.Audio.Media. EXTERNAL _CONTENT_URI这个Uri。
专辑信息要利用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI这个Uri来查询,其他查询也都类似。
Prjs:这个参数代表要从表中选择的列,用一个String数组来表示。
Selections:相当于SQL语句中的where子句,就是代表你的查询条件。
selectArgs:这个参数是说你的Selections里有?这个符号是,这里可以以实际值代替这个问号。如果Selections这个没有?的话,那么这个String数组可以为null。
Order:说明查询结果按什么来排序。
上面就是各个参数的意义,它返回的查询结果一个Cursor,这个Cursor就相当于数据库查询的中Result,用法和它差不多。
-------------------------------------------------------------------------------------------------------------------
增加,代码如下所以:
Java代码
1.ContentValues values = new ContentValues();
2.
3.values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER,0);
4.
5.resolver.insert(_uri, values);
这个insert传递的参数只有两个,一个是Uri(同查询那个Uri),另一个是ContentValues。这个ContentValuses对应于数据库的一行数据,只要用put方法把每个列的设置好之后,直接利用insert方
法去插入就好了。
更新,代码如下:
Java代码
1.ContentResolver resolver = ctx.getContentResolver();
2.
3.Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
4.
5.ContentValues values = new ContentValues();
6.
7.values.put(MediaStore.Audio.Media.DATE_MODIFIED, sid);
8.
9.resolver.update(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,values, where, selectionArgs);
上面update方法和查询还有增加里的参数都很类似,这里就不再重复叙述了,大家也可直接参考google的文档,那里也写的很清楚。
删除,代码如下:
Java代码
1.ContentResolver resolver = ctx.getContentResolver();
2.
3.resolver.delete(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,where, selectionArgs);
delete和更新的方法很类似,大家对照更新的方法看下马上就会明白,今天就写到这里了最近比较忙,打算一周发一篇心得体会吧,希望大家也把自己的开发心得写出来多多交流。
MyDevicePhotoActivity.java文件中代码如下:
package com.device.photo;
import android.app.Dialog;
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter.ViewBinder;
/**
* Android实现获取本机中所有图片
* @Description: Android实现获取本机中所有图片
* @FileName: MyDevicePhotoActivity.java
* @Package com.device.photo
* @Author Hanyonglu
* @Date 2012-5-10 下午04:43:55
* @Version V1.0
*/
public class MyDevicePhotoActivity extends FragmentActivity implements LoaderCallbacks<Cursor>{
private Bitmap bitmap = null;
private byte[] mContent = null;
private ListView listView = null;
private SimpleCursorAdapter simpleCursorAdapter = null;
private static final String[] STORE_IMAGES = {
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.LATITUDE,
MediaStore.Images.Media.LONGITUDE,
MediaStore.Images.Media._ID
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(android.R.id.list);
simpleCursorAdapter = new SimpleCursorAdapter(
this,
R.layout.simple_list_item,
null,
STORE_IMAGES,
new int[] { R.id.item_title, R.id.item_value},
0
);
simpleCursorAdapter.setViewBinder(new ImageLocationBinder());
listView.setAdapter(simpleCursorAdapter);
// 注意此处是getSupportLoaderManager(),而不是getLoaderManager()方法。
getSupportLoaderManager().initLoader(0, null, this);
// 单击显示图片
listView.setOnItemClickListener(new ShowItemImageOnClickListener());
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
// 为了查看信息,需要用到CursorLoader。
CursorLoader cursorLoader = new CursorLoader(
this,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
STORE_IMAGES,
null,
null,
null);
return cursorLoader;
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
// TODO Auto-generated method stub
simpleCursorAdapter.swapCursor(null);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
// TODO Auto-generated method stub
// 使用swapCursor()方法,以使旧的游标不被关闭.
simpleCursorAdapter.swapCursor(cursor);
}
// 将图片的位置绑定到视图
private class ImageLocationBinder implements ViewBinder{
@Override
public boolean setViewValue(View view, Cursor cursor, int arg2) {
// TODO Auto-generated method stub
if (arg2 == 1) {
// 图片经度和纬度
double latitude = cursor.getDouble(arg2);
double longitude = cursor.getDouble(arg2 + 1);
if (latitude == 0.0 && longitude == 0.0) {
((TextView)view).setText("位置:未知");
} else {
((TextView)view).setText("位置:" + latitude + ", " + longitude);
}
// 需要注意:在使用ViewBinder绑定数据时,必须返回真;否则,SimpleCursorAdapter将会用自己的方式绑定数据。
return true;
} else {
return false;
}
}
}
// 单击项显示图片事件监听器
private class ShowItemImageOnClickListener implements OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
final Dialog dialog = new Dialog(MyDevicePhotoActivity.this);
// 以对话框形式显示图片
dialog.setContentView(R.layout.image_show);
dialog.setTitle("图片显示");
ImageView ivImageShow = (ImageView) dialog.findViewById(R.id.ivImageShow);
Button btnClose = (Button) dialog.findViewById(R.id.btnClose);
btnClose.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().
appendPath(Long.toString(id)).build();
FileUtil file = new FileUtil();
ContentResolver resolver = getContentResolver();
// 从Uri中读取图片资源
try {
mContent = file.readInputStream(resolver.openInputStream(Uri.parse(uri.toString())));
bitmap = file.getBitmapFromBytes(mContent, null);
ivImageShow.setImageBitmap(bitmap);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
dialog.show();
}
}
}
FileUtil.java文件主要是对图片资源的处理。代码如下:
package com.device.photo;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
/**
* 文件操作类
* @Description: 文件操作类
* @FileName: FileUtil.java
* @Package com.device.photo
* @Author Hanyonglu
* @Date 2012-5-10 下午01:37:49
* @Version V1.0
*/
public class FileUtil {
public FileUtil() {
// TODO Auto-generated constructor stub
}
/**
* InputStream to byte
* @param inStream
* @return
* @throws Exception
*/
public byte[] readInputStream(InputStream inStream) throws Exception {
byte[] buffer = new byte[1024];
int len = -1;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return data;
}
/**
* Byte to bitmap
* @param bytes
* @param opts
* @return
*/
public Bitmap getBitmapFromBytes(byte[] bytes, BitmapFactory.Options opts) {
if (bytes != null){
if (opts != null){
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,opts);
}
else{
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
}
return null;
}
}
/**
* 通过uri获取文件的绝对路径
* @param uri
* @return
*/
protected String getAbsoluteImagePath(Uri uri)
{
// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( uri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
blic static final String[] THUMBNAIL_PROJECTION = new String[] { Images.ImageColumns._ID, Images.ImageColumns.DATE_ADDED,
Images.ImageColumns.DATA, Images.ImageColumns.ORIENTATION };
ublic static final ImageList getImageList(final Context context) {
if (sList != null)
return sList;
ImageList list = new ImageList();
final Uri uriImages = Images.Media.EXTERNAL_CONTENT_URI;
final ContentResolver cr = context.getContentResolver();
try {
final Cursor cursorImages = cr.query(uriImages, THUMBNAIL_PROJECTION, null, null, null);
if (cursorImages != null && cursorImages.moveToFirst()) {
final int size = cursorImages.getCount();
final long[] ids = new long[size];
final long[] thumbnailIds = new long[size];
final long[] timestamp = new long[size];
final int[] orientation = new int[size];
int ctr = 0;
do {
if (Thread.interrupted()) {
break;
}
ids[ctr] = cursorImages.getLong(THUMBNAIL_ID_INDEX);
timestamp[ctr] = cursorImages.getLong(THUMBNAIL_DATE_MODIFIED_INDEX);
thumbnailIds[ctr] = Utils.Crc64Long(cursorImages.getString(THUMBNAIL_DATA_INDEX));
orientation[ctr] = cursorImages.getInt(THUMBNAIL_ORIENTATION_INDEX);
++ctr;
} while (cursorImages.moveToNext());
cursorImages.close();
list.ids = ids;
list.thumbids = thumbnailIds;
list.timestamp = timestamp;
list.orientation = orientation;
}
} catch (Exception e) {
// If the database operation failed for any reason
;
}
if (sList == null) {
sList = list;
}
return list;
}