Giter Site home page Giter Site logo

li-xiaojun / matisse Goto Github PK

View Code? Open in Web Editor NEW
197.0 6.0 33.0 8.79 MB

基于知乎Matisse增强,一行代码实现图片/视频选择,裁剪,微信同款视频录制和拍照,无需权限申请!

Java 99.95% Shell 0.05%
matisse pictureselector imagepicker camera cameraview

matisse's Introduction

Matisse

知乎Matisse的增强版,简化了使用,优化了用户体验,功能上集成了UCrop + CameraView

功能

  • 拍摄照片和视频,或者只拍摄照片,或者只拍视频
  • 支持照片裁剪
  • 自动申请所需所有权限,无需额外操作
  • Matisse本身所有功能

预览

Image Image Image

使用

Download

implementation 'com.lxj:matisse:最新版本'

如何使用

最简单一行代码即可调用:

Matisse.from(SampleActivity.this)
    .choose(MimeType.ofAll()) //显示所有文件类型,比如图片和视频,
    .capture(true)//是否显示拍摄按钮,默认不显示
    //.capture(true, CaptureMode.All)//是否显示拍摄按钮,可以同时拍视频和图片
    .isCrop(true)//开启裁剪,默认不开启
    //.imageEngine(new GlideEngine()) //默认是Glide4.x版本的加载器,如果你用的是Glide4.x,则无需设置
    //.imageEngine(new Glide3Engine())//如果你用的是Glide3.x版本,请打开这个,Glide3Engine这个类在demo中
    .forResult(REQUEST_CODE_CHOOSE); //请求码

直接跳转拍摄界面:

Matisse.from(SampleActivity.this)
    .jumpCapture()//直接跳拍摄,默认可以同时拍摄照片和视频
    //.jumpCapture(CaptureMode.Image)//只拍照片
    //.jumpCapture(CaptureMode.Video)//只拍视频
    .isCrop(true) //开启裁剪
    .forResult(REQUEST_CODE_CHOOSE);

详细设置:

Matisse.from(SampleActivity.this)
    .choose(MimeType.ofAll())
    .capture(true) //默认只能拍照片
    //.capture(true, CaptureMode.All)//通过CaptureMode控制拍照照片还是视频,或者都拍
    .maxSelectable(9) //默认最大选中9张,设置为1就是单选
    .theme(R.style.Matisse_Dracula)//暗色主题
    //添加图片过滤器,比如过滤掉小于10K的图片
    .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
    //设置选中图片的监听器
    .setOnSelectedListener(new OnSelectedListener() {
        @Override
        public void onSelected(
                @NonNull List<Uri> uriList, @NonNull List<String> pathList) {
            // DO SOMETHING IMMEDIATELY HERE
            Log.e("onSelected", "onSelected: pathList=" + pathList);

        }
    })
    .originalEnable(true)//是否显示原图,默认显示
    //设置原图选中和取消选中的监听器
    .setOnCheckedListener(new OnCheckedListener() {
        @Override
        public void onCheck(boolean isChecked) {
            // DO SOMETHING IMMEDIATELY HERE
            Log.e("isChecked", "onCheck: isChecked=" + isChecked);
        }
    })
    //.imageEngine(new GlideEngine()) // 默认是Glide4.x版本的加载器,如果你用的是Glide4.x,则无需设置
    //.imageEngine(new Glide3Engine())//如果你用的是Glide3.x版本,Glide3Engine这个类在demo中
    //.imageEngine(new PicassoEngine())//如果你用的是Picasso
    .forResult(REQUEST_CODE_CHOOSE); //请求码

接收结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {
        //获取拍摄的图片路径,如果是录制视频则是视频的第一帧图片路径
        String captureImagePath = Matisse.obtainCaptureImageResult(data);

        //获取拍摄的视频路径
        String captureVideoPath = Matisse.obtainCaptureVideoResult(data);

        //获取裁剪结果的路径,不管是选择照片裁剪还是拍摄照片裁剪,结果都从这里取
        String cropPath = Matisse.obtainCropResult(data);

        //获取选择图片或者视频的结果路径,如果开启裁剪的话,获取的是原图的地址
        Matisse.obtainSelectUriResult(data);//uri形式的路径
        Matisse.obtainSelectPathResult(data)//文件形式路径
    }
}

混淆

如果你使用Picasso:

-dontwarn com.squareup.picasso.**

如果你使用Glide:

-dontwarn com.bumptech.glide.**

matisse's People

Contributors

junixapp avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

matisse's Issues

少了存储权限

兄弟,你加了拍照的权限,没加存储的权限,导致拍照文件返回不了数据

华为,一加点击闪退

//华为 p20
Process: cn.cbct.seefm, PID: 18869
java.lang.RuntimeException: An error occurred while executing doInBackground()
at androidx.loader.content.ModernAsyncTask$3.done(ModernAsyncTask.java:164)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:929)
Caused by: android.database.sqlite.SQLiteException: near "GROUP": syntax error (Sqlite code 1 SQLITE_ERROR): , while compiling: SELECT _id, bucket_id, bucket_display_name, _data, COUNT(*) AS count FROM files WHERE ((is_pending=0) AND (is_trashed=0) AND (volume_name IN ( 'external_primary' ))) AND (((media_type=? OR media_type=?) AND _size>0) GROUP BY (bucket_id)) ORDER BY datetaken DESC, (OS error - 2:No such file or directory)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:184)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:423)
at android.content.ContentResolver.query(ContentResolver.java:955)
at android.content.ContentResolver.query(ContentResolver.java:891)
at androidx.core.content.ContentResolverCompat.query(ContentResolverCompat.java:81)
at androidx.loader.content.CursorLoader.loadInBackground(CursorLoader.java:63)
at com.lxj.matisse.internal.loader.AlbumLoader.loadInBackground(AlbumLoader.java:97)
at com.lxj.matisse.internal.loader.AlbumLoader.loadInBackground(AlbumLoader.java:33)
at androidx.loader.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:307)
at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:60)
at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:48)
at androidx.loader.content.ModernAsyncTask$2.call(ModernAsyncTask.java:141)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
at java.lang.Thread.run(Thread.java:929) 

//一加onePlues
Process: cn.cbct.seefm, PID: 4945
java.lang.RuntimeException: An error occurred while executing doInBackground()
at androidx.loader.content.ModernAsyncTask$3.done(ModernAsyncTask.java:164)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.IllegalArgumentException: Invalid column COUNT(*) AS count
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:437)
at android.content.ContentResolver.query(ContentResolver.java:962)
at android.content.ContentResolver.query(ContentResolver.java:890)
at androidx.core.content.ContentResolverCompat.query(ContentResolverCompat.java:81)
at androidx.loader.content.CursorLoader.loadInBackground(CursorLoader.java:63)
at com.lxj.matisse.internal.loader.AlbumLoader.loadInBackground(AlbumLoader.java:97)
at com.lxj.matisse.internal.loader.AlbumLoader.loadInBackground(AlbumLoader.java:33)
at androidx.loader.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:307)
at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:60)
at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:48)
at androidx.loader.content.ModernAsyncTask$2.call(ModernAsyncTask.java:141)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
at java.lang.Thread.run(Thread.java:919) 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.