Android 获取视频照片与刷新媒体库
1、获取本地所有视频
public void getLoadMedia() {
Cursor cursor = UILApplication.instance.getApplicationContext().getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);
try {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)); // id
String displayName =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM)); // 专辑
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST)); // 艺术家
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)); // 显示名称
String mimeType =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); // 路径
long duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)); // 时长
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)); // 大小
String resolution =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.RESOLUTION));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
cursor.close();
}
}
2、获取拍照视频
//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
try {
fileUri = Uri.fromFile(createMediaFile()); // create a file to save the video
} catch (IOException e) {
e.printStackTrace();
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, ); // set the video image quality to high
// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
public static final String[] videoCursorCols = new String[] { MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.TITLE, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.ARTIST, MediaStore.Video.Media.ALBUM, MediaStore.Video.Media.RESOLUTION, MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DATA }; public static Video fileUriForVideo(Activity activity, Uri uri) { Cursor cursor = activity.getContentResolver().query(uri, videoCursorCols, null, null, null); if (cursor == null || cursor.getCount() == 0) {
return null;
} else { Video video = new Video();
cursor.moveToFirst();
/* file name */
if (cursor.getString(1) != null) {
video.setName(cursor.getString(1));
}
/* media name */
if (cursor.getString(2) != null) {
video.setDisplayName(cursor.getString(2));
}
/* play duration */
if (cursor.getString(3) != null) {
video.setTimelong((cursor.getInt(3) / 1000) + "s");
}
/* artist */
if (cursor.getString(4) != null) {
video.setSinger(cursor.getString(4));
}
/* album */
if (cursor.getString(5) != null) {
video.setAlbum(cursor.getString(5));
}
/* resolution */
if (cursor.getString(6) != null) {
video.setResolution(cursor.getString(6));
}
/* media type */
if (cursor.getString(7) != null) {
video.setMimeType(cursor.getString(7).trim());
}
/* media size */
if (cursor.getString(8) != null) {
video.setDownfilesize(new java.text.DecimalFormat("#.00").format((cursor.getInt(8) / 1024.0 / 1024.0)) + " MB"); }
/* media file path */
if (cursor.getString(9) != null) {
video.setVoiceurl(cursor.getString(9));
}
if (cursor != null) {
cursor.close();
}
return video;
}
}
播放视频
private void initView() {
String url="http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8";
VideoView videoView=findViewById(R.id.mVideoView);
videoView.setVideoPath(url);
videoView.requestFocus();
videoView.start();
}
1、开始录制
首先实例化一个MediaRecord对象,对其中开始设置。我在这里遇到的问题是时音频文件的存储位置。代码中getCacheDir得到的是内部缓存目录,这个目录可以通过file exploer看到,具体在data/data/app名称/cache。file exploer在windows->show view->other中找到。先打开它,在启动模拟器,刚开始启动时可以发现窗口中出现文件列表。
private void StartAudio(){//开始录制
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //内容输出格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //输出到缓存目录,此处可以添加上传录音的功能,也可以存到其他位置
audioFile = new File(getCacheDir(), "recoder"+ "_" + System.currentTimeMillis() + ".3gp");
recorder.setOutputFile(audioFile.getAbsolutePath());
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
record=true;
Log.i(tag,"开始录制!");
StartButton.setEnabled(false);
StopButton.setEnabled(true);
PlayButton.setEnabled(false);
}
2、结束录制
一开始运行时stop函数出现各种问题,后来总结可能是start函数根本没有运行。可惜我也是刚接触它,并不熟悉过程。之后查了很多文章,可以用Log.i进行输出,大致相当于C++中的printf函数。所以一定是要在start之后才能stop。
private void StopAudio(){ //结束录制
recorder.stop();
//recorder.reset(); //14:19添加修改
recorder.release();
Log.i(tag,"停止录制!");
record=false; //更新状态
//PlayButton.setEnabled(true);
StartButton.setEnabled(true);
StopButton.setEnabled(false);
PlayButton.setEnabled(true);
}
private void PlayAudio(){
player = new MediaPlayer();
try {
player.setDataSource(audioFile.getAbsolutePath());
player.prepare();
player.start();
} catch (IOException e) {
e.printStackTrace();
}
StartButton.setEnabled(true);
StopButton.setEnabled(false);
PlayButton.setEnabled(false);
}
1.从本地相册获取照片:
一般就是写出这个方法
protected void getImageFromAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");//相片类型
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
}
2.从照相机获取照片
一般就是写出这个方法
protected void getImageFromCamera() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(getImageByCamera, REQUEST_CODE_CAPTURE_CAMEIA);
} else {
Toast.makeText(getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();
}
}
写完这个方法后,一般我们还需要通过响应这个方法去获取图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_PICK_IMAGE) {
Uri uri = data.getData();
//to do find the path of pic } else if (requestCode == REQUEST_CODE_CAPTURE_CAMEIA ) {
Uri uri = data.getData();
//to do find the path of pic
}
}
但是,有时候我们会发现用相机拍摄获取照片的时候,得到的 uri 是 null 的,这是因为android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,可能有的相机能够通过
inten.getData()获取到uri
然后再根据uri获取数据的路径,在封装成bitmap,但有时候有的相机获取到的是null的,这时候我们该怎么办呢?
其实这时候我们就应该从bundle中获取数据,通过
(Bitmap) bundle.get("data")
获取到相机图片的bitmap数据。
为了能够同时适应上述两种情况,我们这时候就应该在获取图片时做判断了。我们可以在响应的时候做一个判断:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_PICK_IMAGE) {
Uri uri = data.getData();
//to do find the path of pic by uri
} else if (requestCode == REQUEST_CODE_CAPTURE_CAMEIA ) {
Uri uri = data.getData();
if(uri == null){
//use bundle to get data
Bundle bundle = data.getExtras();
if (bundle != null) {
Bitmap photo = (Bitmap) bundle.get("data"); //get bitmap
} else {
Toast.makeText(getApplicationContext(), "err****", Toast.LENGTH_LONG).show();
return;
}
}else{
//to do find the path of pic by uri
}
}
}
后面的过程就需要通过bitmap转化成相应的图片文件了。不过得到最终的图片是被压缩了的。如果我们想得到相机拍摄出来的原照片在
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
之后我们直接讲文件先保存到指定的路径filepath,然后直接在
onActivityResult(int requestCode, int resultCode, Intent data)
中把filepath传递过去
示例代码
protected void getImageFromCamera() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
String out_file_path = Constant.SAVED_IMAGE_DIR_PATH;
File dir = new File(out_file_path);
if (!dir.exists()) {
dir.mkdirs();
}
capturePath = Constant.SAVED_IMAGE_DIR_PATH + System.currentTimeMillis() + ".jpg";
getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(capturePath)));
getImageByCamera.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(getImageByCamera, Constant.REQUEST_CODE_CAPTURE_CAMEIA);
}
else {
Toast.makeText(getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();
}
}
刷新媒体库
1. 问题概述
使用我们自己写的程序生成一张图像或者一段视频,存放在SD卡的某个位置下,之后打开系统自带媒体库(图库)无法找到对于的图像和视频。连上电脑打开相应文件夹也找不到相应的文件?但是当手机重启之后,不管是在媒体库里找还是连上电脑搜索都可以找到。这其中发生了啥?
2. 问题原因
Android 内部维护了很多数据库,比如媒体数据库、联系人数据库等等。你在生成视频后并没有将视频的位置添加到这个数据库中。所以找不到呗。但是系统在每次重启后会自动更新一遍数据库,所以重启就可以找到了。
3. 如何解决
android可以手动更新媒体数据库,通常的做法都是发送广播
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, dirUri)); //刷新sd卡
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,fileUri)); //刷新单个文件
目前在android API 23下直接刷新SD卡是会报错的,被系统禁止了,我屡次使用刷新单个文件都不怎么见效果。网上有个人说采用广播的方式刷新文件是可以的,一般没效果都是因为文件路径没有写对。这个供各位参考。
我实现媒体库数据的自动更新采用以下代码
/*
* Copyright (c) 2016. All rights reserved
* Created by GH_HOME on 16-12-12 下午3:04
* Last modified 16-12-12 下午2:41
*
*/
package com.test;
import java.io.File;
import android.content.Context;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.util.Log;
public class SingleMediaScanner implements MediaScannerConnectionClient {
private MediaScannerConnection mMs;
private File mFile;
public SingleMediaScanner(Context context, File f) {
mFile = f;
mMs = new MediaScannerConnection(context, this);
mMs.connect();
}
@Override
public void onMediaScannerConnected() {
mMs.scanFile(mFile.getAbsolutePath(), null);
}
@Override
public void onScanCompleted(String path, Uri uri) {
mMs.disconnect();
Log.i("TAG", "Finished scanning " + path);
}
}
调用方式为
new SingleMediaScanner(this, mOutputFile);
其中this为你当前的activity,mOutputFile为你生成的文件。在文件生成之后调用即可。
Android 获取视频照片与刷新媒体库的更多相关文章
- Android -- 获取视频第一帧缩略图
干货 从API 8开始,新增了一个类: android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理. public ...
- [转]android 获取视频帧
本文转自:http://blog.csdn.net/heart_Moving/article/details/17414067 今天做Android视频文件解码,需求:从一个视频文件获取到一帧一帧的图 ...
- android 获取视频缩略图终极解决方案(ffmpeg)
http://blog.csdn.net/u010499721/article/details/50338623 前些天有个师弟(在做一个仿LinkInEyes行车记录仪的app)问我怎么获取视频缩略 ...
- Android加入新的视频格式--媒体库扫描
需求:在mediaprovider数据库中加入.mov后缀格式的视频文件 能够使用工具MediaInfo_GUI_0.7.67_Windows.3243836749.exe 查看mov文件编码格式类型 ...
- mono for android 获取手机照片或拍照并裁剪保存
axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- Android 插入图片到媒体库
今天介绍一下在Android中怎么插入图片到媒体库,下面看代码: final String titleName = Function.md5(imageUri.toLowerCase()) + &qu ...
- 如何扫描出Android系统媒体库中视频文件
Android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息: publicstatic Lis ...
- Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器
前言 在Android里获取视频的信息主要依靠MediaMetadataRetriever实现 获取最佳视频预览图 所谓的最佳就是MediaMetadataRetriever自己计算的 /** * 获 ...
- android 中获取视频文件的缩略图(非原创)
在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...
随机推荐
- SuperMap-WMTS服务修改切片集顺序
1.访问iserver的服务接口,找到WMTS服务接口 2.选择切片集的默认顺序
- IDEA打开光标是粗黑色,backspace键、insert键点击无效的解决办法
问题描述:打开IDEA的编译器之后,界面显示的光标变粗,点击backspace键和insert键盘之后无效 解决方法:打开File——Settings——Plugins,在右侧的搜索栏中搜索IdeaV ...
- numpy中与金融有关的函数
fv函数 计算未来的价值 def fv(rate, nper, pmt, pv, when='end'): ... 参数: rate:存款/贷款每期的利率 nper:存款/贷款期数 pmt:存款/贷款 ...
- QT Qdialog的对话框模式以及其关闭
模式对话框 描述 阻塞同一应用程序中其它可视窗口输入的对话框.模式对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口.模式对话框仅阻止访问与对 ...
- 自学Python-基于tcp协议的socket
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- xml配置文件命名空间学习
xmlns(XML Namespaces的缩写)是一个属性,是XML(标准通用标记语言的子集)命名空间.作用是赋予命名空间一个唯一的名称. 编写Spring或者Maven或者其他需要用到XML文档的程 ...
- hdu1864最大报销额 01
先把小数乘100变成整数然后处理每个发票里面可以报销的 最后自底向上DP #include <stdio.h> #include <algorithm> #include &l ...
- maven私仓搭建——nexus3
maven私仓搭建——nexus3本文主要介绍maven私仓在windows下的搭建.本文主要参考:http://www.cnblogs.com/bingyeh/p/5913486.html好,下面上 ...
- k8sDaemonSet控制器
DaemonSet用于再集群中的全部节点上同时运行一份指定的pod资源副本,后续新加入的工作节点也会自动创建一个相关的pod对象,当从集群中移除节点时,此类pod对象也将被自动回收而无须重建.也可以使 ...
- 快速排序java代码
法一: //快速排序 通过测试 public class QuickSortTest2 { public static void quickSort(int[] data,int low,int hi ...