07-02 01:38:36.910: E/AndroidRuntime(2694): Process: com.jxust.day07_08_contentprovider, PID: 2694 07-02 01:38:36.910: E/AndroidRuntime(2694): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jxust.day07_08_contentprovider /com.jxust.day07_08_contentprovider.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2694, uid=10069 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
通过预定义uri来操作多媒体数据
(一)概述
Android为应用程序操作常见的数据提供了预定义的Uri,如视频、音频、图片、文件、数据库等。
Android中的以上数据可能存放在内存卡中,也可以存放在SD卡上。并且很可能存放在不同的文件夹中,通过Uri首先可以指定要访问的是哪种类型的数据,其次指定要访问的数据是在内存卡还是SD卡,最后可通过条件查找符合条件的数据。至于数据在哪个文件夹下则无需考虑。
以上访问数据的方式提供了对不同类型的数据的一致性操作,有效地简化了编程。
(二)操作图片数据
1、访问SD卡图片的Uri
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URL
2、访问内存卡图片的Uri
android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URL
3、MediaStore类
MediaStore类是Android多媒体开发的常用类,该类位于android.provider包下,该类中定义了Images、Audio、Video等内部类,用于表示图片、音频和视频。
4、Images类
Images类是MediaStore类的内部类,用于表示图片数据。该类中定义了一组常量用于表示图片的属性。
5、Images.Media的常量
1)Images.Media.ID:图片的id值,该值由系统创建。 2)Images.Media.DISPLAY_NAME:图片的显示名。 3)Images.Media.DESCRIPTION:图片的详细描述。 4)Images.Media.DATA:图片的保存位置 5)Images.Media.TITLE:图片的标题 6)Images.Media.MIME_TYPE:图片的类型,格式:类型/子类型 7)Images.Media.SIZE:图片占用的空间,单位:字节 8)Images.Media.WIDTH:图片宽度 9)Images.Media.HEIGHT:图片高度
6、Thumbnails类
Thumbnails类用于获取系统中的视频或图片的缩略图。该类提供了以下方法获取缩略图:
public static Bitmap getThumbnail(ContentResolver cr,long origId,int kind,BitmapFactory.Option options) 作用:获取指定id的缩略图 参数——cr:ContentResolver对象 参数——origid:图片的id值 参数——kind:缩略图的类型,有两个常量 Thumbnails.MICRO_KIND:最小类型 Thumbnails.MINI_KIND:迷你类型 参数——options:BitmapFactory.Options类型用于预防图片过大造成的内存溢出,若不考虑溢出问题,可设置该参数为null
提示:
从sdk4.4开始,读取SD卡信息需要在项目清单文件中申请权限:
android.permission.READ_EXTERNAL_STORAGE
一个小案例:读取SD卡中的图片
package com.jxust.day07_08_contentprovider;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.media.Image;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getImagesInfo();
}
private void getImagesInfo() {
ContentResolver resolver = getContentResolver();
// MediaStore.Images.Media.EXTERNAL_CONTENT_URI可以让用户访问SD卡
String[] projection = {
Images.Media._ID,
Images.Media.DATA,
Images.Media.WIDTH,
Images.Media.HEIGHT,
Images.Media.SIZE
};
Cursor c = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
while(c.moveToNext()){
int id = c.getInt(c.getColumnIndex(Images.Media._ID)); // 通过列的索引拿到ID的值
String path = c.getString(c.getColumnIndex(Images.Media.DATA));
double width = c.getDouble(c.getColumnIndex(Images.Media.WIDTH));
double height = c.getDouble(c.getColumnIndex(Images.Media.HEIGHT));
double size = c.getDouble(c.getColumnIndex(Images.Media.SIZE));
StringBuilder sb = new StringBuilder();
sb.append("id=").append(id)
.append(",path=").append(path)
.append(",width=").append(width)
.append(",height=").append(height)
.append(",size=").append(size);
Log.i("main", sb.toString());
}
}
}
运行发现,在Logcat中有如下的提示错误:
07-02 01:38:36.910: E/AndroidRuntime(2694): Process: com.jxust.day07_08_contentprovider, PID: 2694 07-02 01:38:36.910: E/AndroidRuntime(2694): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jxust.day07_08_contentprovider/com.jxust.day07_08_contentprovider.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2694, uid=10069 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
结果发现,是在项目清单中没有添加用户权限READ_EXTERNAL_STORAGE
于是乎,在Logcat中正常的显示了SD卡中图片的相关提示信息。