美文网首页
Android图片选择(拍照)框架分享

Android图片选择(拍照)框架分享

作者: MrYag | 来源:发表于2019-11-20 09:51 被阅读0次

图片选择其实在APP中还是很常用的,最简单的都是头像选择,拍照或者从相册中选择,发表一下心情的时候也会需要使用。

图片选择框架 github上有很多,比如PhotoPicker是吧,但是像Matisse这么萌萌哒的还是比较少的,而且一般来说爱啪啪中是只有选择图片的,如果需要加上选择视频,是不是有需要重新添加一个框架,或者说自己写一个,当然,还是选择同一个的好,这个时候Matisse就体现出他的价值了。

github地址Matisse https://github.com/zhihu/Matisse

现在开始使用 implementation 'com.zhihu.android:matisse:0.5.2-beta2'

注意这个版本是可以选择图片和视频,我目前在用,还没有出现什么bug,并且图片支持的格式更多(JPEG, PNG, GIF, BMP, WEBP),图片格式(MPEG, MP4, QUICKTIME, THREEGPP, THREEGPP2, MKV, WEBM, TS, AVI),是不是感觉有点厉害了

1.没图你用个毛线,先来张图,看看是不是你喜欢的风格,不喜欢,下面就不用看了。

image image

2.看过了效果图,现在是不是感觉有点好看的,开始简单使用一下,这里的代码是有问题的,请自行选择使用!!!!!!还有一些其他的方法,这里就不再一一表述,基本用不到,比如缩略图的宽高,间隙,基本上一行3个是标配。其他的可以自行找找方法。


Matisse
                .from(mActivity)
                //选择视频和图片
                .choose(MimeType.ofAll()) 
                //选择图片
                .choose(MimeType.ofImage()) 
                //选择视频
                .choose(MimeType.ofVideo()) 
                //自定义选择选择的类型
                .choose(MimeType.of(MimeType.JPEG,MimeType.AVI)) 
                //是否只显示选择的类型的缩略图,就不会把所有图片视频都放在一起,而是需要什么展示什么
                .showSingleMediaType(true)
                //这两行要连用 是否在选择图片中展示照相 和适配安卓7.0 FileProvider
                .capture(true)
                .captureStrategy(new CaptureStrategy(true,"PhotoPicker"))
                //有序选择图片 123456...
                .countable(true)
                //最大选择数量为9
                .maxSelectable(9)
                //选择方向
                .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
                //界面中缩略图的质量
                .thumbnailScale(0.8f)
                //蓝色主题
                .theme(R.style.Matisse_Zhihu)
                //黑色主题
                .theme(R.style.Matisse_Dracula)
                //Glide加载方式
                .imageEngine(new GlideEngine())
                //Picasso加载方式
                .imageEngine(new PicassoEngine())
                //请求码
                .forResult(REQUEST_CODE_CHOOSE);

获取图片路径


@Override     
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == case REQUEST_CODE_CHOOSE_PHOTO_ALBUM: && resultCode == RESULT_OK) {
        //图片路径 同样视频地址也是这个 根据requestCode
        List<String> pathList = Matisse.obtainResult(data);       
    }
}

2.图片加载器

说到这个,我的APP中基本上都是使用的Glide,毕竟。。。。。。我也不知道为什么,反正就是用它了,matisse就支持使用Glide,好评!当然还支持Picasso,以及一些其他的都可以实现ImageEngine重写方法进行实现,所以很多Issues中说要使用Glide 4.x的其实也不用这么着急,毕竟稳定是最重要的,我们可以自己实现ImageEngine来完成。


public class GlideImageEngine implements ImageEngine {

    @Override
    public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
        GlideApp.with(context)
                .asBitmap()
                .load(uri)
                .placeholder(placeholder)
                .override(resize, resize)
                .centerCrop()
                .into(imageView);
    }

    @Override
    public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView,
                                 Uri uri) {
        GlideApp.with(context)
                .asBitmap()
                .load(uri)
                .placeholder(placeholder)
                .override(resize, resize)
                .centerCrop()
                .into(imageView);
    }

    @Override
    public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        GlideApp.with(context)
                .load(uri)
                .override(resizeX, resizeY)
                .priority(Priority.HIGH)
                .into(imageView);
    }

    @Override
    public void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        GlideApp.with(context)
                .asGif()
                .load(uri)
                .override(resizeX, resizeY)
                .priority(Priority.HIGH)
                .into(imageView);
    }

    @Override
    public boolean supportAnimatedGif() {
        return true;
    }
}

3.拍照

上面的代码也有说需要FileProvider 这个基本上都知道了吧 百度一大堆

在Android Manifest当中的Application节点下添加FileProvider


<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="PhotoPicker"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/photo_path" />
        </provider>

然后在Res文件下创建xml文件夹,然后创建photo_path.xml 注意:这里是不能改路径的就是在Image文件夹下面,如果要改可能就需要自行实现了


<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="my_images"
        path="Pictures"/>
</paths>

Matisse都可以使用手机自带拍照那我们就不用这么麻烦去自己写一个了,就是路径需要注意一下,都是在Image文件夹下面,需要从这里找而不是从onActivityResult里面的data中获取,因为这个时候的data为null


MediaStoreCompat mediaStoreCompat = new MediaStoreCompat(mView.getContext());
        mediaStoreCompat.setCaptureStrategy(new CaptureStrategy(true,"PhotoPicker"));
        mediaStoreCompat.dispatchCaptureIntent(mView.getContext(),REQUEST_CODE_CHOOSE_PHOTO_SHOOT);
        //因为是指定Uri所以onActivityResult中的data为空 只能再这里获取拍照的路径
        String currentPhotoPath = mediaStoreCompat.getCurrentPhotoPath();
        //返回图片路径名
        mView.getCurrentPhotoPath(currentPhotoPath);

4.GifFilter

这个就直接从github上复制下来使用就好了


class GifSizeFilter extends Filter {

    private int mMinWidth;
    private int mMinHeight;
    private int mMaxSize;

    GifSizeFilter(int minWidth, int minHeight, int maxSizeInBytes) {
        mMinWidth = minWidth;
        mMinHeight = minHeight;
        mMaxSize = maxSizeInBytes;
    }

    @Override
    public Set<MimeType> constraintTypes() {
        return new HashSet<MimeType>() {{
            add(MimeType.GIF);
        }};
    }

    @Override
    public IncapableCause filter(Context context, Item item) {
        if (!needFiltering(context, item))
            return null;

        Point size = PhotoMetadataUtils.getBitmapBound(context.getContentResolver(), item.getContentUri());
        if (size.x < mMinWidth || size.y < mMinHeight || item.size > mMaxSize) {
            return new IncapableCause(IncapableCause.DIALOG, context.getString(R.string.error_gif, mMinWidth,
                    String.valueOf(PhotoMetadataUtils.getSizeInMB(mMaxSize))));
        }
        return null;
    }
}

之后还有权限问题,相信了解过的都知道了Matisse是提示申请摄像头权限的,这个就是一个有趣的地方了
Android有两个相机权限:
(1)<uses-feature android:name="android.hardware.camera"/>
(2)<uses-permission android:name="android.permission.CAMERA" />
permission.CAMERA权限
1、在6.0以上是必须需要申请动态权限,否则会闪退
2、可以拍照、录像、扫码
hardware.camera权限
1、只有拍照权限
2、4.0-8.0都不需要相机权限就可以拍照,然而9.0不行(华为p20真机)

相关文章

  • Android图片选择(拍照)框架分享

    图片选择其实在APP中还是很常用的,最简单的都是头像选择,拍照或者从相册中选择,发表一下心情的时候也会需要使用。 ...

  • Android图片选择框架

    支持图库选择和拍照的图片选择框架 之前在android的学习过程中,用了几次图片上传,其中就使用了图片选择和拍照返...

  • 开源项目图片选择器--ImageSelect

    说明 ImageSelect是android 经量级选择图片框架,支持拍照,获取相册图片,本地视频,可以多选,单选...

  • Android拍照选取图片

    Android拍照选取图片 Android经常会需要拍照、裁剪及图库中选择图片,其实都是通过intent调用系统相...

  • 一款神级选择图片工具,支持所有主流图片缓存框架

    今天介绍一个Android相册自定义,包括拍照、图片选择(单选/多选)和裁剪,支持所有主流图片缓存框架的工具。 A...

  • Android Camer Framework

    Camera框架 Camera拍照流程 拍照采用ImageReader来作为中介保存图片例子参考android-C...

  • 图片选择器:PictureSelector

    前言 轻量级图片选择框架,多选,拍照,支持剪裁,自定义图片加载 图片选择框架其实已有许多优秀成熟的框架,比如知乎开...

  • Android 图片选择器 进阶版

    GalleryPick 图片选择器 GalleryPick 是 Android 自定义相册,实现了拍照、图片选择(...

  • Android开源的东西收集

    WaveLoadingView ===波浪式加载控件 Android图片实现了拍照、图片选择(单选/多选)、 裁剪...

  • Android 图片或拍照选择图片

    前言 一般公司都有更换用户头像功能,需要从图库中选择图片或者拍照,基本还会对图片进行裁剪。最近抽空就做了一些简单的...

网友评论

      本文标题:Android图片选择(拍照)框架分享

      本文链接:https://www.haomeiwen.com/subject/iawnictx.html