android 完美选择视频不留bug方案

标签: android 选择小视频 选取视频 获取视频 获取手机视频
13人阅读 评论(0) 收藏 举报
分类:
最近应公司需求,社区需要发表视频的动态,现提供最终解决方案,并附上获取小视频的缩略图的方法。咋们一步步来,走你。。。

1:首先是跳转到选取小视频吧    

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("video/*");
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(intent, REQUEST_VIDEO_CODE);
2:在activity或者fragment回调中处理选取的结果
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_VIDEO_CODE) {
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                // 视频路径
                final String videoPath = FileUtil.getPath(PublicVideoActivity.this, uri);
                // 视频大小
                long videoSize = 0;
                try {
                    videoSize = FileUtil.getFileSize(new File(videoPath));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                showLog("videoPath== " + videoPath + " videoSize== " + videoSize);
                //转换文件大小类型
                if (videoSize > MAX_LENGTH) {
                    showToast("大小超出限制,最大20MB");
                    return;
                }
                // 通过视频路径获取bitmap
                Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MICRO_KIND);
                //把bitmap保存到sdcard然后得到图片的路径
                String imagePath = Tools.saveBitmapToSDCard(bitmap, System.currentTimeMillis() + ".jpg");
                //显示到控件上
                videoIcon.setImageBitmap(bitmap);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
3:附上  FileUtil.class
public class FileUtil {
    /**
     * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
     */
    @SuppressLint("NewApi")
    public static String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }


    /**
     * 获取指定文件大小
     * @param file
     * @return
     * @throws Exception   
     */
    public static long getFileSize(File file) throws Exception {
        long size = 0;
        if (file.exists()) {
            FileInputStream fis = null;
            fis = new FileInputStream(file);
            size = fis.available();
        } else {
            file.createNewFile();
            Log.e("lfl", "文件不存在!");
        }
        return size;
    }

}
4:附上  bitmap 保存到sdcard中并获取路径的方法
 /**
     * 保存bitmap到SD卡
     *
     * @param bitmap
     * @param imagename
     */
    public static String saveBitmapToSDCard(Bitmap bitmap, String imagename) {
        String path = "/sdcard/" + "img_" + imagename + ".jpg";
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(path);
            if (fos != null) {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                fos.close();
            }

            return path;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
以上就是完整的视频选择方案啦,如果对您有帮助,麻烦点个赞吧




查看评论

Android_通过Bugtags平台,方便测试人员提交bug及整个bug系统的管理

Bugtags 是什么?Bugtags 是一款缺陷发现及管理工具。当您的 App 集成了 Bugtags SDK 后,测试人员就可直接在 App 里所见即所得的提交 Bug.SDK 会自动截屏,并与设...
  • strawberry2013
  • strawberry2013
  • 2016-01-08 16:07:41
  • 3227

Android从相册选取视频(单一)

1. /** * 从相册中选择视频 */ private void choiceVideo() { Intent i = new Intent(Intent.ACTION_PICK, a...
  • CocaCoca_
  • CocaCoca_
  • 2017-05-15 12:00:39
  • 1156

测试搜集android:bug的方法(基于人测试的)

帮助测试人员搜集android测试bug的好的三方方法(测试版使用,正式版不建议使用) 以下是对这2款三方的做一个比较: 一. bugtags(推荐使用) 1.出处:好像是:北京八哥科技有限责任...
  • yangjianbo456
  • yangjianbo456
  • 2016-07-05 15:55:39
  • 746

Android 手机视频选择器---快速开发系列

Android 手机视频选择器—快速开发系列 分析别人的代码 找到解决问题的关键点 视频选择跟图片选择的区别 如何阅读别人的无注释代码 把图片选择器改编成视频选择器 说在前面的话 本案例是基于开源...
  • ndscbetter
  • ndscbetter
  • 2016-09-28 16:47:45
  • 3104

Android拍摄视频和本地选择视频demo

  • 2016年04月01日 09:47
  • 2.66MB
  • 下载

Android 从系统媒体库中选择视频

只需两步: 第一步:发送Intent action。会在onActivityResult方法中返回选中视频的uri:Intent i = new Intent(Intent.ACTION_PICK,...
  • zrbcsdn
  • zrbcsdn
  • 2016-06-22 10:47:33
  • 4197

android选择本地视频和图片,很好的demo

  • 2015年08月17日 10:29
  • 820KB
  • 下载

H5适配逼疯人!这个方案或许能帮到你

以往拿到一份视觉稿要做页面适配,通常都是针对不同分辨率尺寸做断点写 media query,然后看效果再微调。开发过程中视觉稿要是做了修改,修改的地方就得再走一遍分辨率测试和微调,这时想屎的心都有了。...
  • yylurex
  • yylurex
  • 2017-05-08 16:47:30
  • 1137

android多图选择 图片/视频 单选or多选,以及视频录制

最近项目中用到多图选择上传的需求,随后百度了一下用了别人写的demo,发现在很多机型上各种不适,闪退等问题,严重影响使用,后面我自己写了一个,公司20几款手机全部通过,在腾讯云测中也使用了4,50款手...
  • sinat_28238111
  • sinat_28238111
  • 2017-05-25 15:48:57
  • 426

android 选取本地视频或图片

近期做的留言板功能,有从本地选取图片或视频发送到留言板的功能: 点击主页面的图片按钮: case R.id.ll_pic: if (!PermissionHelper.checkPermi...
  • liuye066
  • liuye066
  • 2017-02-27 16:47:35
  • 1700
    个人资料
    等级:
    访问量: 1252
    积分: 104
    排名: 125万+
    文章分类
    文章存档