Android——Matisse图片选择框架

简介

  Matisse是知乎开源的图片选择框架:https://github.com/zhihu/Matisse

  中文文档:https://blog.csdn.net/qiaoshi96_bk/article/details/76164913

 

使用:

  1. 需要在项目setting.gradle 和 应用build.gradle中实现:

    repositories {
    jcenter()
    }     
    implementation 'com.zhihu.android:matisse:0.5.3-beta3'
    implementation 'com.github.bumptech.glide:glide:4.10.0'

  

  2. 调出图片选择框

复制代码
Matisse.from(UploadZoneActivity.this) //Activity
                            .choose(MimeType.ofAll()) //选择全部(包括视频)
                            .countable(true)  // 有序选择图片
                            .maxSelectable(9)  //最大选择数量为9
                            .gridExpectedSize(400)  //图片显示表格的大小
                            .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
                            .thumbnailScale(0.85f)  //缩放比率
                            .theme(R.style.Matisse_Zhihu) //主题  暗色主题 R.style.Matisse_Dracula
                            .imageEngine(new GlideEngine()) //加载方式
                            .forResult(REQUEST_CODE_CHOOSE); //结果返回码 ,在onActivityResult中获取
复制代码

 

  3. 获取返回结果(URi)

复制代码
     private ArrayList<Uri> mSelected;
@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {
            mSelected = (ArrayList<Uri>) Matisse.obtainResult(data);
            Log.d("Matisse", "mSelected: " + mSelected);
        }
    }
复制代码

 

  4. 通过Uri获取真实地址

复制代码
   public static String getRealFilePath(final Context context, final Uri uri ) {
        if ( null == uri ) return null;
        final String scheme = uri.getScheme();
        String data = null;
        if ( scheme == null )
            data = uri.getPath();
        else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
            data = uri.getPath();
        } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
            Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
            if ( null != cursor ) {
                if ( cursor.moveToFirst() ) {
                    int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
                    if ( index > -1 ) {
                        data = cursor.getString( index );
                    }
                }
                cursor.close();
            }
        }
        return data;
    }
复制代码

 

注意:

  1. 对于Android10需要加

        android:requestLegacyExternalStorage="true"

  2. 需要使用Matisse 时,OnActivityResult()方法,需要判断 resultCode == RESULT_OK 来保证有值

posted @   remix_alone  阅读(2241)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示