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卡中图片的相关提示信息。
相关推荐
在Android系统中,ContentProvider是四大组件之一,它主要负责数据的存储和共享。这篇博客“contentprovider--读取写入联系人数据”显然聚焦于如何利用ContentProvider操作设备上的联系人信息。ContentProvider作为...
本集视频“079集-ContentProvider(3)-读取并播放SD卡中的视频”深入探讨了如何利用ContentProvider来读取并播放存储在SD卡上的视频文件。下面我们将详细讲解这一主题。 首先,ContentProvider是Android系统提供的一...
在本Demo中,我们假设有一个简单的任务列表应用,数据存储在SQLite数据库中,我们将创建一个名为`TaskProvider`的ContentProvider,用于处理任务数据。 1. **创建TaskProvider类**:继承自ContentProvider,并实现...
在Android开发中,高效地加载图片对于提升用户体验至关重要,尤其是当图片存储在SD卡上时。ContentProvider是一种标准的机制,用于在不同应用程序之间共享数据。在这个场景中,我们将探讨如何利用ContentProvider来...
ContentProvider是Android系统中用于数据共享的机制,我们可以创建一个自定义的ContentProvider来处理SD卡上的图片,并返回一个Uri给WebView。以下是一些关键步骤: 1. 创建ContentProvider: - 定义一个继承自`...
在Android开发中,获取SD卡上用户选择的图片路径是一个常见的需求,这通常涉及到与系统的媒体库交互,以便用户能够从相册中选取图片。以下将详细介绍如何实现这个功能。 首先,我们需要添加必要的权限到...
对于需要共享的数据,可以考虑使用外部存储,如SD卡,但需注意权限问题。 ### 总结 在Android开发中,选择合适的数据存储方案取决于应用的具体需求。SQLite适合存储复杂关系型数据,ContentProvider用于跨应用数据...
Android开发实战经典_030804_ContentProvider_A_ContentProvider简介视频教程.zip
在Android系统中,ContentProvider是实现数据共享和交换的关键组件,它允许应用程序之间安全地访问和操作私有数据。本文将深入探讨如何使用ContentProvider来读取系统的联系人信息。 一、ContentProvider基础 ...
本篇将详细解析如何利用ContentProvider来读取手机通讯录中的联系人名称和手机号码。 首先,了解ContentProvider的基本概念。ContentProvider是Android四大组件之一,它为应用程序提供了一种标准接口,使得不同应用...
在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。本实战源码深入解析了ContentProvider的工作原理及其在实际项目中的应用,通过阅读源码,开发者可以更好地理解如何创建...
Android开发实战经典_030804_ContentProvider_E_使用SimpleCursorAdapter视频教程.zip
总结,ContentProvider和ContentResolver是Android中实现跨应用数据共享的重要机制,通过它们可以方便地获取系统中的图片、视频和音频资源。理解并熟练运用这一机制,能够帮助开发者在开发过程中更加灵活地处理...
通过ContentProvider,我们可以高效地实现对设备存储中音乐文件的检索,而无需直接访问文件系统,这样既符合Android的沙盒安全机制,又能提高应用程序的兼容性和可维护性。 首先,理解ContentProvider的基本工作...
在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享数据,而无需直接访问对方的内部存储。在本教程中,我们将深入探讨如何利用ContentProvider来操作文件,以及其在跨应用数据传输中的作用。 ...
ContentProvider客户端是指应用程序通过ContentResolver接口来与ContentProvider交互,获取或修改存储在ContentProvider中的数据。下面我们将深入探讨ContentProvider客户端的相关知识点。 一、ContentProvider基础...
Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果,提供访问本地图片的工具类,有效避免OOM的出现,项目详情http://blog.csdn.net/xiaanming/article/details/18730223
ContentProvider使得应用程序之间能够安全、有序地访问彼此的数据,无论是系统内置的数据(如联系人、日历等)还是自定义的数据存储。下面我们将深入探讨ContentProvider的使用,并结合"ContentProviderApp1"和...
使用 ContentProvider 可以实现数据的共享,例如:使用 ContentProvider 可以实现图片的共享,例如:Intent it = new Intent(Intent.ACTION_VIEW); it.setDataAndType(Uri.parse("content://media/external/images/...
ContentProvider 是 Android 实现跨程序共享数据的标准方式,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。本文将详细介绍 ContentProvider 的主要功能、运行时...