Android MediaStore仿微信朋友圈获取图片及视频

Android中所有的多媒体文件除了存储在物理硬盘上,还会将文件信息(路径、id、类型、)保存到数据库中,这样当我们想要获取这些文件的信息时,就不需要耗时的扫描硬盘,只需要读数据库就可以了。Android平台中称手机终端内存为内部存储空间,称SD卡为外部存储空间。针对内部和外部存储空间中的媒体文件信息是分开管理的,各自有独立的数据库管理。外部存储空间和内部存储空间对应的卷标为”external”和”internal”

MediaStore是Android系统提供的一个多媒体数据库,专门用于存放多媒体信息的,通过ContentResolver即可对数据库进行操作。结构如下:

图片信息:MediaStore.Images

音频信息:MediaStore.Audio

视频信息:MediaStore.Video

共享文件,包括多媒体和非多媒体信息:MediaStore.Files

通过ContentResolver和Cursor进行操作,获取图片:

类似获取视频:

Cursor cusor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, null};

一、同时获取图片及视频:

要同时获取图片和视频,找了很久的API和文档,感觉MediaStore.Files应该可用,上面是这样写的:

不过总有些文件比较特殊,用上面的方法查询不出来,或者说,某些媒体文件扫描不到,就没有添加进上述三个数据源中,导致查询不出来;这种请下下,可以尝试用MediaStore.Files,使用方法如下:

Cursor cusor = contentResolver.query(MediaStore.Files.getContentUri("external"),

                         projection[], MediaStore.Files.FileColumns.MIME_TYPE + "=?", new String[] {"video/mp4"}, null};

MediaStore.Files没有EXTERNAL_CONTENT_URI,所以只能用getContentUri()自行获取,得到的URI其实是Uri.parse("content://media/external/files")

二、获取缩略图路径:

缩略图是另外一张表,MediaStore.Images.Thumbnails及MedaiStore.Video.Thumbnails

三、拍照录相:

调用系统的相机拍照,调用系统的录像功能,但是要注意,当调用系统摄像功能的时候,有默认的坐标体系。

以下转自:http://blog.51cto.com/ticktick/1592267

1. 图像的Sensor方向:手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向的,这个方向如下图所示,坐标原点位于手机横放时的左上角:

wKiom1SWRlPS8A37AABKPmT4jEM721.jpg

2. Camera的预览方向:由于手机屏幕可以360旋转,为了保证用户无论怎么旋转手机都能看到“正确”的预览画面(这个“正确”是指显示在UI预览界面的画面与你人眼看到的眼前的画面是一致的),Android系统底层根据当前手机屏幕的方向对图像Sensor采集到的数据进行了旋转处理,然后才送给显示系统,因此,打开Camera应用后,无论怎么旋转,你都能看到“正确”的画面,Android系统提供一个API来手动设置Camera的预览方向,叫做setDisplayOrientation,默认情况下,这个值是0,与图像Sensor方向一致,所以对于横屏应用来说,就不需要更改这个Camera预览方向。但是,如果你的应用是竖屏应用,就必须通过这个API将Camera的预览方向旋转90,与手机屏幕方向一致,这样才会得到正确的预览画面。

3. Camera的拍照方向:当你点击拍照按钮,得到的图片方向不一定与画面找那个预览的方向一致,这是因为拍摄的照片是将图片Sensor采集到的数据直接存储到SDCard上,因此,Camera的拍照方向与上述的Camera的图像Sensor方向一致。

为了演示这个问题,我用手机的Camera对同一个场景拍了两张照片,第一张是横着拿手机拍的,第二张是竖着拿手机拍的。然后用在电脑上打开得到的图片(实际场景中的杯子是竖着的),效果如下所示:

wKiom1SWJRTi0PqOAAG0VYlk6aQ451.jpg

由此可见,如果横向拿手机拍照,由于正好与Camera的拍照方向一致,因此得到的照片是“正确”的;而竖着拿手机拍照的话,Camera的图像Sensor依然以上面描述的角度在采集图像并存储到SDCard上,所以得到的图片就是右图这样的,因为竖着拿手机正好与图像Sensor的方向相差了90度。由此,大家应该明白了为什么我们用手机拍出的照片经常需要旋转90度才能看到“正确”的画面了吧?

上面说了,对于横屏应用,不需要额外设置这个方向,但是对于竖屏应用,则需要调用setDisplayOrientation(90),来保证Camera的预览方向与Activity的方向一致,那么设置了这个函数究竟会不会影响到Camera拍照的结果呢?根据上面的分析,理论上应该是不影响的,因为拍照得到的图片方向是与图像Sensor的方向一致的,当然,我们可以通过Android官方API的注释文档验证一下这个猜想,下面是Camera.setDisplayOrientation的注释文档:

/**
 * Set the clockwise rotation of preview display in degrees. This affects
 * the preview frames and the picture displayed after snapshot. This method
 * is useful for portrait mode applications. Note that preview display of
 * front-facing cameras is flipped horizontally before the rotation, that
 * is, the image is reflected along the central vertical axis of the camera
 * sensor. So the users can see themselves as looking into a mirror.
 *
 * <p>This does not affect the order of byte array passed in {@link
 * PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos. This
 * method is not allowed to be called during preview.     
 */
 
public native final void setDisplayOrientation(int degrees);

重点看这两句话:

This affects the preview frames and the picture displayed after snapshot.

This does not affect the order of byte array passed in {@link
 * PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos.

由此我们得到验证了,这个API修改的仅仅是Camera的预览方向而已,并不会影响到PreviewCallback回调、生成的JPEG图片和录像文件的方向,这些数据的方向依然会跟图像Sensor的方向一致。

本想不调用系统摄像头,直接重写,因为拍照出来,宽高全都反了,用原腾讯VOD视频播出来全都倒了,但是考虑到IOS机拍出来的也是这样,而且IOS端不会重写,换用了新的腾讯VOD点播API解决视频播出来倒的问题。

四、生成缩略图:

平常调用录像时,会生成缩略图,但是当应用调用录像时,系统不会自主生成缩略图,需要我们手动去生成。

以上两种方式实质都是利用MediaMetadataRetriever来生成某一帧画面,ThumbnailUtils方法有进行压缩处理,自己写就能自己控制。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要按类型查找Android文件管理,可以使用以下步骤: 1. 打开文件管理器应用程序。 2. 点击菜单按钮,然后选择“按类型查找”选项。 3. 在弹出的窗口中选择所需的文件类型,例如视频、音频、文档等。 4. 文件管理器将显示所有匹配的文件。 要使用MediaStore获取Android设备上的视频文件,可以按以下步骤操作: 1. 导入以下类: ```java import android.provider.MediaStore; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; ``` 2. 创建一个ContentResolver对象: ```java ContentResolver contentResolver = getContentResolver(); ``` 3. 创建一个Uri对象,指向视频文件的位置: ```java Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; ``` 4. 创建一个Cursor对象,执行查询操作,并指定返回的列: ```java String[] projection = { MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA, MediaStore.Video.Media.DURATION }; Cursor cursor = contentResolver.query(uri, projection, null, null, null); ``` 在查询操作中,参数“projection”指定了返回的列,这里返回了视频文件的ID、文件路径和持续时间。 5. 遍历Cursor对象,并获取每个视频文件的详细信息: ```java while (cursor.moveToNext()) { long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media._ID)); String path = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA)); long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DURATION)); // do something with video information } ``` 在遍历操作中,使用Cursor的getColumnIndex()方法获取每个列的索引,并使用getLong()和getString()方法获取每个视频文件的详细信息。 这些步骤将帮助你使用MediaStore获取Android设备上的视频文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值