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开发之获取本地视频和获取自拍视频的更多相关文章

  1. Android开发:SharedPreferences 存储数据、获取数据

    Android开发:SharedPreferences 存储数据.获取数据 email:chentravelling@163.com 开发环境:win7 64位,Android Studio. 关于S ...

  2. Java根路径设置(在获取本地路径时会获取到这个文件夹,,这样就可以专门放配置文件了)

    在获取本地路径时会获取到这个文件夹,,这样就可以专门放配置文件了

  3. 【Android开发VR实战】二.播放360°全景视频

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发 ...

  4. 获取本地ip和获取公网ip

    import socket def get_local_ip(): ''' 获取本地ip地址 :return: ''' s = socket.socket(socket.AF_INET, socket ...

  5. Android 开发--CMakeList调用本地so文件

    这里写代码片Android开发常常遇到Java调用so文件的情况,本文介绍一下Google最近新推出的应用在android studio中的方法–cmakelist.txt格式调用. so文件分为jn ...

  6. Android 开发 facebook分享,登陆,获取信息

    1 搭建开发环境    1.1 在Facebook官网SDK中,下载4.0.0的SDK包.        1.2 使用Eclipse导入SDK包中的Facebook工程,并添加android-supp ...

  7. Android开发学习之路-图片颜色获取器开发(1)

    系列第一篇,从简单的开始,一步一步完成这个小项目. 颜色获取就是通过分析图片中的每个像素的颜色,来分析整个图片的主调颜色,有了主调颜色,我们可以用于图片所在卡片的背景或者标题颜色,这样整体感更加强烈. ...

  8. Android 开发 微信分享,登陆,获取信息

    1 获取appid和appsecret.        https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN     ...

  9. Android开发之通过包管理器获取安装应用信息

    最近在自己写一个APP,有一个模块需要获取手机应用的一些信息.坑还是有,但都基本踩过了,自己把他实现了出来,实现方法还是很需要掌握的.底部弹出的对话框中四个选项的实现不多做说明,主要讲讲如何获取这些安 ...

  10. Android开发 MediaPlayer播放本地视频完善的demo(只是代码记录)

    xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.w ...

随机推荐

  1. [Reprint]C++友元函数与拷贝构造函数详解

    这篇文章主要介绍了C++友元函数与拷贝构造函数,需要的朋友可以参考下   一.友元函数 1.友元函数概述: (1)友元函数是定义在一个类外的普通函数.友元函数和普通函数的定义一样;在类内必须将该普通函 ...

  2. extjs中的下载并对文件重命名功能的实现

    在小白的学习extjs的过程中,如果需要了解多文件的上传功能,也可以查看小白的上篇随笔,希望给大家帮助.http://www.cnblogs.com/wangqc/p/extjsFileUpload. ...

  3. php session memcache

    ini_set("session.save_handler", "memcache"); ini_set("session.save_path&quo ...

  4. 夺命雷公狗—angularjs—10—angularjs里面的内置函数

    我们没学一门语言或者框架,几乎里面都有各自的语法和内置函数,当然,强悍的angularjs也不例外,他的方法其实常用的没多少,因为很多都可以用源生jis几乎都能完成一大部分.. <!doctyp ...

  5. OpenGl And 视图

    OpenGl And 视图 标签(空格分隔): game 简介 本文主要介绍坐标系的观念, 以及在openGL中的视图及其相关的变换. 大纲 视图.模型.投影变换概念 Opengl中对各种变换的支持 ...

  6. 【py分析】使用SGMLParser分析淘宝html

    SGMLParser Python 默认自带 HTMLParser 以及 SGMLParser 等等解析器,前者实在是太难用了,我就用 SGMLParser 写了一个示例程序: import urll ...

  7. C语言初学者代码中的常见错误与瑕疵(3)

    问题: n-1位数字 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数. 输入: 第一行为M,表示测试数据组数. 接下来M行,每行包含一个测 ...

  8. 天天模拟器 和 Genymotion 设置代理

    之前以为是10.0.3.1或者本机IP,尝试几次都不行,百度之,得到答案,原来genymotion里面网关的IP是10.0.3.2 所以,代理IP要设置为:10.0.3.2

  9. Angularjs之controller 和filter(四)

    Controller组件(http://www.angularjs.cn/A00C) 在AngularJS中,控制器是一个Javascript函数(类型/类),用来增强除了根作用域以外的作用域实例的. ...

  10. android 项目学习随笔十(自定义ProgressBar)

    android:innerRadius 内部半径 android:thickness 厚度 gradient 渐变 android:useLevel="false" 取掉控件自带旋 ...