ContentProvider的初阶-读取SD卡中全部的图片

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

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jxust.day07_08_contentprovider"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

于是乎,在Logcat中正常的显示了SD卡中图片的相关提示信息。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值