`

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卡中图片的相关提示信息。

 

分享到:
评论

相关推荐

    contentprovider--读取写入联系人数据

    在Android系统中,ContentProvider是四大组件之一,它主要负责数据的存储和共享。这篇博客“contentprovider--读取写入联系人数据”显然聚焦于如何利用ContentProvider操作设备上的联系人信息。ContentProvider作为...

    079集-ContentProvider(3)-读取并播放SD卡中的视频

    本集视频“079集-ContentProvider(3)-读取并播放SD卡中的视频”深入探讨了如何利用ContentProvider来读取并播放存储在SD卡上的视频文件。下面我们将详细讲解这一主题。 首先,ContentProvider是Android系统提供的一...

    ContentProvider--Demo

    在本Demo中,我们假设有一个简单的任务列表应用,数据存储在SQLite数据库中,我们将创建一个名为`TaskProvider`的ContentProvider,用于处理任务数据。 1. **创建TaskProvider类**:继承自ContentProvider,并实现...

    使用contentprovider异步加载sd卡图片

    在Android开发中,高效地加载图片对于提升用户体验至关重要,尤其是当图片存储在SD卡上时。ContentProvider是一种标准的机制,用于在不同应用程序之间共享数据。在这个场景中,我们将探讨如何利用ContentProvider来...

    Android开发WebView获取SD卡图片并显示

    ContentProvider是Android系统中用于数据共享的机制,我们可以创建一个自定义的ContentProvider来处理SD卡上的图片,并返回一个Uri给WebView。以下是一些关键步骤: 1. 创建ContentProvider: - 定义一个继承自`...

    Android获取SD卡中选中图片的路径(URL)

    在Android开发中,获取SD卡上用户选择的图片路径是一个常见的需求,这通常涉及到与系统的媒体库交互,以便用户能够从相册中选取图片。以下将详细介绍如何实现这个功能。 首先,我们需要添加必要的权限到...

    关于android的数据存储-SQLite-ContentProvider-preferences

    对于需要共享的数据,可以考虑使用外部存储,如SD卡,但需注意权限问题。 ### 总结 在Android开发中,选择合适的数据存储方案取决于应用的具体需求。SQLite适合存储复杂关系型数据,ContentProvider用于跨应用数据...

    Android开发实战经典-030804-ContentProvider-A-ContentProvider简介视频教程.zip

    Android开发实战经典_030804_ContentProvider_A_ContentProvider简介视频教程.zip

    ContentProvider读取系统联系人

    在Android系统中,ContentProvider是实现数据共享和交换的关键组件,它允许应用程序之间安全地访问和操作私有数据。本文将深入探讨如何使用ContentProvider来读取系统的联系人信息。 一、ContentProvider基础 ...

    ContentProvider读取手机通讯录

    本篇将详细解析如何利用ContentProvider来读取手机通讯录中的联系人名称和手机号码。 首先,了解ContentProvider的基本概念。ContentProvider是Android四大组件之一,它为应用程序提供了一种标准接口,使得不同应用...

    ContentProvider 实战源码以及apk

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。本实战源码深入解析了ContentProvider的工作原理及其在实际项目中的应用,通过阅读源码,开发者可以更好地理解如何创建...

    Android开发实战经典-ContentProvider-E-使用SimpleCursorAdapter视频教程.zip

    Android开发实战经典_030804_ContentProvider_E_使用SimpleCursorAdapter视频教程.zip

    ContentProvider获取系统的图片视频和音频

    总结,ContentProvider和ContentResolver是Android中实现跨应用数据共享的重要机制,通过它们可以方便地获取系统中的图片、视频和音频资源。理解并熟练运用这一机制,能够帮助开发者在开发过程中更加灵活地处理...

    Android高级应用源码-利用contentprovider扫描内存卡上所有的音频文件

    通过ContentProvider,我们可以高效地实现对设备存储中音乐文件的检索,而无需直接访问文件系统,这样既符合Android的沙盒安全机制,又能提高应用程序的兼容性和可维护性。 首先,理解ContentProvider的基本工作...

    android 用ContentProvider操作文件

    在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享数据,而无需直接访问对方的内部存储。在本教程中,我们将深入探讨如何利用ContentProvider来操作文件,以及其在跨应用数据传输中的作用。 ...

    ContentProvider客户端

    ContentProvider客户端是指应用程序通过ContentResolver接口来与ContentProvider交互,获取或修改存储在ContentProvider中的数据。下面我们将深入探讨ContentProvider客户端的相关知识点。 一、ContentProvider基础...

    Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果,提供访问本地图片的工具类,有效避免OOM的出现,项目详情http://blog.csdn.net/xiaanming/article/details/18730223

    android-关于ContentProvider的使用例子

    ContentProvider使得应用程序之间能够安全、有序地访问彼此的数据,无论是系统内置的数据(如联系人、日历等)还是自定义的数据存储。下面我们将深入探讨ContentProvider的使用,并结合"ContentProviderApp1"和...

    Android-Intent-数据存取-ContentProvider.doc

    使用 ContentProvider 可以实现数据的共享,例如:使用 ContentProvider 可以实现图片的共享,例如:Intent it = new Intent(Intent.ACTION_VIEW); it.setDataAndType(Uri.parse("content://media/external/images/...

    第8章 跨程序共享数据,探究ContentProvider.pptx

    ContentProvider 是 Android 实现跨程序共享数据的标准方式,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。本文将详细介绍 ContentProvider 的主要功能、运行时...

Global site tag (gtag.js) - Google Analytics