安卓获取手机视频和图片

获取手机本地视频

首先需要获得手机内存权限

在AndroidManifest.xml中添加代码,获得读取权限

android.permission.READ_EXTERNAL_STORAGE

但是后来我发现android采用了Runtime permission request, 即在运行时请求权限,而不是在编译的时候,即使在manifest.xml里面添加了权限也要在运行时请求

这时可以在运行之后做一下权限判断,如果没有权限则弹出对话框,向用户申请权限,这段代码我写在了刚运行app的第一个activity的oncreate里面,且只需要做一次判断,之后再进入app不需要再开启权限

public static void verifyStoragePermissions(Activity activity) {try {//检测是否有写的权限int permission = ActivityCompat.checkSelfPermission(activity,"android.permission.WRITE_EXTERNAL_STORAGE");if (permission != PackageManager.PERMISSION_GRANTED) {// 没有写的权限,去申请写的权限,会弹出对话框ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);}} catch (Exception e) {e.printStackTrace();}}

定义方法chooseVideo,为某个按钮设置监听器,当点击按钮,执行方法chooseVideo,在方法中首先做机型适配:

private void chooseVideo(View view) {flag=0;if(android.os.Build.BRAND.equals("Huawei")){Intent intentPic = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);this.startActivityForResult(intentPic,2);}if(android.os.Build.BRAND.equals("Xiaomi")){Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "video/*");startActivityForResult(Intent.createChooser(intent, "选择要导入的视频"), 2);}else {Intent intent = new Intent();if(Build.VERSION.SDK_INT < 19){intent.setAction(Intent.ACTION_GET_CONTENT);intent.setType("video/*");}else {intent.setAction(Intent.ACTION_OPEN_DOCUMENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("video/*");}startActivityForResult(Intent.createChooser(intent, "选择要导入的视频"), 2);}}

再重写方法onActivityResult,里面实现的功能有查询文件路径,并且实现函数回调

public void onActivityResult(int requestCode, int resultCode, Intent data) {Uri uri = data.getData();//             通过ContentProvider查询文件路径String[] proj = {MediaStore.Images.Media.DATA};ContentResolver resolver = getContext().getContentResolver();Cursor cursor = resolver.query(uri, proj, null, null, null, null);cursor.moveToFirst();String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));//获得文件路径File file = new File(path);//获得视频
}

然后获得视频的第一帧作为视频封面呈现在可视化界面上,大概思路是先将图片存储,然后根据图片地址,为页面设置背景图片,就可以达到选择某段视频后,以第一帧作为封面的效果

String videoName = path.split("/")[6].split("\\.")[0];//path为视频的路径
MediaMetadataRetriever mmr = new MediaMetadataRetriever();//实例化MediaMetadataRetriever对象
mmr.setDataSource(file.getAbsolutePath());
bitmap = mmr.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);//获得视频第一帧的Bitmap对象
FileOutputStream outStream = null;
try {outStream = new FileOutputStream(new File(this.getContext().getExternalCacheDir().getAbsolutePath() + "/" + videoName + ".jpg"));bitmap.compress(Bitmap.CompressFormat.JPEG, 10, outStream);String imagePath = this.getContext().getExternalCacheDir().getAbsolutePath() + "/" + videoName + ".jpg";File image = new File(imagePath);Uri imUri = Uri.fromFile(image);bitmap = BitmapFactory.decodeStream(getContext().getContentResolver().openInputStream(imUri));imageView.setImageBitmap(bitmap);outStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

(上面的代码看上去有点繁琐,有人问为什么不能在获得视频的第一帧的Bitmap对象之后就设置imageView的Bitmap,我试过了但是会设置失败,图片不显示,所以用了一个比较麻烦的方法,如果有更简单的方法麻烦告诉我一下:)

获取手机本地图片

获取手机图片的方法和获取视频的方法大同小异,首先监听器加上一个方法,不要忘记机型适配

private void chooseSurpass() {Log.d("TAG", "chooseSurpass: -----选中");flag=1;if(android.os.Build.BRAND.equals("Huawei")){Intent intentPic = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);this.startActivityForResult(intentPic,2);}if(android.os.Build.BRAND.equals("Xiaomi")){Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");startActivityForResult(Intent.createChooser(intent, "选择要导入的图片"), 2);}else {Intent intent = new Intent();if(Build.VERSION.SDK_INT < 19){intent.setAction(Intent.ACTION_GET_CONTENT);intent.setType("image/*");}else {intent.setAction(Intent.ACTION_OPEN_DOCUMENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");}startActivityForResult(Intent.createChooser(intent, "选择要导入的图片"), 2);}}

再重写方法onActivityResult,里面实现的功能有查询文件路径,并且实现函数回调

    public void onActivityResult(int requestCode, int resultCode, Intent data) {Uri uri = data.getData();//             通过ContentProvider查询文件路径String[] proj = {MediaStore.Images.Media.DATA};ContentResolver resolver = getContext().getContentResolver();Cursor cursor = resolver.query(uri, proj, null, null, null, null);cursor.moveToFirst();String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));//获得文件路径Log.d("TAG", "onActivityResult: -------"+path);File file = new File(path);//获得图片//把图片显示在封面上面surpass.setImageURI(uri);}

效果

安卓获取手机视频和图片相关推荐

  1. 微信小程序——图片的加载与获取手机内部的图片

    关于将手机里的图片放在上传到小程序,在小程序里这种方法并不陌生,甚至大多数小程序都附带有这种功能,那么这种功能是怎么实现的呢,一起来看看吧!!! 1.微信小程序加载图片的几种方法 1.本地图片的加载 ...

  2. Android之获取手机上的图片和视频缩略图thumbnails

    2019独角兽企业重金招聘Python工程师标准>>> [0]大家都知道Android从1.5开始刚插入SD卡时系统会调用MediaScanner服务进行后台扫描,索引新的歌曲.图片 ...

  3. 安卓获取手机网络强度_USB调试和USB网络共享,安卓有线投屏究竟选哪个?

    用过EZCast投屏设备的安卓手机E粉,可能有过这样的困惑. 「开启USB调试」和「开启USB网络共享」 究竟选哪个进行有线同屏? 今天的小E课堂中,我将带大家看看这两者的区别,以及应该用哪个比较好. ...

  4. 安卓获取手机型号和刘海屏适配

    先上完整代码,因为我这是和unity交互的版本,带有unity的设置就不改了,自行修改即可 package com.unity.qwe; import androidx.annotation.Requ ...

  5. iOS:Photos/Photos.h获取相册视频以及图片

    转自:http://www.jianshu.com/p/ea0274a33209 因为项目的需求,要捕获相册中的视频与图片,之前也对之尚未做过什么探讨,仅知道iOS8.0后,苹果推出了新的相册管理的包 ...

  6. Android安卓读取手机中的图片,实现相册管理功能

    1.实体类Photo.ajva public class Photo {private String name;//名称private String date;//日期private long siz ...

  7. android模拟ip地址,安卓 获取手机IP地址的实现代码

    1.获取手机IP地址的代码: public static String getLocalIpAddress(){ try{ for (Enumeration en = NetworkInterface ...

  8. 安卓获取手机当前GPS开关状态

    项目上需要获取手机当前GPS状态,开始获取到以为正常,后来发现有的小米手机通知栏那边关闭了GPS,手机的GPS并没有真正关闭.但是 我判断的却是关闭了,搜索发现,少判断了一点 正确的应该是下面这样,记 ...

  9. 安卓-获取手机定位数据

    ***/ 获取手机定位 @return Location? / private fun getLastKnownLocation(): Location? { var mLocationManager ...

最新文章

  1. Flink在美团的实践与应用--大数据技术栈15
  2. 词典建立过程缓慢的解决~~子系统构架重新设计!
  3. PlateSpin forge V2P回推步骤。
  4. php byte转 宽字符,C++宽字符与普通字符的转换实例详解
  5. 搜索2.0:利用用户点击记录改善搜索结果
  6. SCCM 2012系列16 操作系统播发⑤
  7. 网际风全推数据接口_智能风控系统设计与实践
  8. 计算机技术在工程施工中的应用,浅析计算机技术及网络在工程施工中的应用
  9. C++创建动态链接库(*.dll)
  10. Android开启桌面模式,Android Q自带桌面模式:支持大宽屏幕
  11. java 四分位算法_Java 四分位算法
  12. 关于物联网的各种转换,16进制 二进制 10进制 效验总结
  13. python绘制的Svg图打开一片空白
  14. 武大教授计算机学院,武汉大学姬东鸿教授访问计算机科学学院和智能信息处理及应用实验室...
  15. 由114.114.114.114和8.8.8.8学习DNS
  16. 著名画家孙王平作品欣赏
  17. 知道创宇技能表3.1
  18. 华润置地php面试题_华润置地有限公司面试攻略,面试题,面试技巧及流程(附笔试,评论,薪资)-金针菇企评网...
  19. hdu5963 朋友(博弈找规律)
  20. 用Python爬取并分析了B站最热排行榜,我发现了这些秘密

热门文章

  1. Max 文件制作三维场景
  2. Unity Obi插件修改到支持URP
  3. pyqt:让qlabel的图片根据鼠标指向的位置进行放缩
  4. 2月14日快到了, 把 ChatGPT 调教成了情诗王子, 为你守护你的爱情
  5. 将简体字转换成繁体字
  6. 作业Android自我介绍
  7. 企业“招投标”一般需要办理哪些体系认证?
  8. convolutional LSTM(convLSTM)的pytorch版本代码实现
  9. 人人开源后台项目maven构建(yyds)
  10. 域名防洪跳转html单页,域名防红跳转