日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Matisse图片选择

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matisse图片选择 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用

  • gitbub:https://github.com/zhihu/Matisse
  • gradle
repositories {jcenter() }dependencies {implementation 'com.zhihu.android:matisse:$latest_version' }
  • 權限? 高版本權限自行配置
  • android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE

    ?

圖片選擇與拍照

  • 拍照需增加

在Android Manifest當中的Application節點下添加FileProvider

authorites是你項目的包名 + fileprovider

<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.zhihu.matisse.sample.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths_public"></meta-data></provider></application>//節點

然后在Res文件下創建xml文件夾,然后創建filepaths.xml

<paths><external-pathname="my_images"path="Pictures"/> </paths>

?

  • 申請權限
  • 使用
  • @Overridepublic void onClick(final View v) {RxPermissions rxPermissions = new RxPermissions(this);rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Observer<Boolean>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Boolean aBoolean) {if (aBoolean) {switch (v.getId()) {case R.id.zhihu://圖片多選MatisseUtils.chooseImage(SampleActivity.this);break;case R.id.dracula://拍照MatisseUtils.takePhoto(SampleActivity.this, "com.zhihu.matisse.sample.fileprovider", "test");break;default:break;}mAdapter.setData(null, null);} else {Toast.makeText(SampleActivity.this, R.string.permission_request_denied, Toast.LENGTH_LONG).show();}}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != RESULT_OK) return;if (requestCode == REQUEST_CODE_CHOOSE){List<Uri> listuri = Matisse.obtainResult(data);List<String> listpath = Matisse.obtainPathResult(data);} else if(requestCode == REQUEST_CODE_PHOTO) {Uri contentUri = MatisseUtils.getPhotoUri();String path = MatisseUtils.getPhotoPath();}}
  • MatisseUtils類
package com.zhihu.matisse.sample.image; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.net.Uri; import android.util.Log; import androidx.annotation.NonNull; import com.zhihu.matisse.Matisse; import com.zhihu.matisse.MimeType; import com.zhihu.matisse.filter.Filter; import com.zhihu.matisse.internal.entity.CaptureStrategy; import com.zhihu.matisse.internal.ui.adapter.AlbumMediaAdapter; import com.zhihu.matisse.internal.utils.MediaStoreCompat; import com.zhihu.matisse.listener.OnCheckedListener; import com.zhihu.matisse.listener.OnSelectedListener; import com.zhihu.matisse.sample.R; import java.util.List;public class MatisseUtils {public static final int REQUEST_CODE_CHOOSE = 100;public static final int REQUEST_CODE_PHOTO = 101;private static MediaStoreCompat mMediaStoreCompat;/*** 返回拍照uri* @return*/public static Uri getPhotoUri() {Uri contentUri = null;if(mMediaStoreCompat!=null){contentUri= mMediaStoreCompat.getCurrentPhotoUri();}return contentUri;}/*** 返回拍照路徑* @return*/public static String getPhotoPath() {String path="";if(mMediaStoreCompat!=null){path= mMediaStoreCompat.getCurrentPhotoPath();}return path;}/*** 選擇圖片配置* @param context*/public static void chooseImage(Context context) {Matisse.from((Activity) context).choose(MimeType.ofAll(), false).countable(true)//有序選擇圖片 true:選中后顯示數字;false:選中后顯示對號.capture(true) //使用拍照功能/*** //拍照功能,設置拍照路徑(必 建xml)* @param true* @param authority provider下authorities* @param directory 目錄*/.captureStrategy(new CaptureStrategy(true, "com.zhihu.matisse.sample.fileprovider","test")).maxSelectable(9).addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K)).gridExpectedSize(context.getResources().getDimensionPixelSize(R.dimen.grid_expected_size)).restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT).thumbnailScale(0.85f) // .imageEngine(new GlideEngine()) // for glide-V3.imageEngine(new Glide4Engine()) // for glide-V4.setOnSelectedListener(new OnSelectedListener() {@Overridepublic void onSelected(@NonNull List<Uri> uriList, @NonNull List<String> pathList) {// DO SOMETHING IMMEDIATELY HERELog.e("onSelected", "onSelected: pathList=" + pathList);}}).originalEnable(true).maxOriginalSize(10).autoHideToolbarOnSingleTap(true).setOnCheckedListener(new OnCheckedListener() {@Overridepublic void onCheck(boolean isChecked) {// DO SOMETHING IMMEDIATELY HERELog.e("isChecked", "onCheck: isChecked=" + isChecked);}}).forResult(REQUEST_CODE_CHOOSE);}/*** 拍照* @param context* @param authority* @param directory*/public static void takePhoto(final Context context, final String authority, final String directory) {AlbumMediaAdapter.OnPhotoCapture capture=new AlbumMediaAdapter.OnPhotoCapture() {@Overridepublic void capture() {mMediaStoreCompat = new MediaStoreCompat((Activity) context); // mMediaStoreCompat.setCaptureStrategy(new CaptureStrategy(true, "com.zhihu.matisse.sample.fileprovider","test"));mMediaStoreCompat.setCaptureStrategy(new CaptureStrategy(true, authority,directory));mMediaStoreCompat.dispatchCaptureIntent(context, REQUEST_CODE_PHOTO);}};capture.capture();} }
  • 過濾器
GifSizeFilter /** Copyright 2017 Zhihu Inc.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.zhihu.matisse.sample.image;import android.content.Context; import android.graphics.Point;import com.zhihu.matisse.MimeType; import com.zhihu.matisse.filter.Filter; import com.zhihu.matisse.internal.entity.IncapableCause; import com.zhihu.matisse.internal.entity.Item; import com.zhihu.matisse.internal.utils.PhotoMetadataUtils; import com.zhihu.matisse.sample.R;import java.util.HashSet; import java.util.Set;public class GifSizeFilter extends Filter {private int mMinWidth;private int mMinHeight;private int mMaxSize;public GifSizeFilter(int minWidth, int minHeight, int maxSizeInBytes) {mMinWidth = minWidth;mMinHeight = minHeight;mMaxSize = maxSizeInBytes;}@Overridepublic Set<MimeType> constraintTypes() {return new HashSet<MimeType>() {{add(MimeType.GIF);}};}@Overridepublic 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;}}
  • glide
Glide4Engine /** Copyright 2017 Zhihu Inc.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.zhihu.matisse.sample.image;import android.content.Context; import android.graphics.drawable.Drawable; import android.net.Uri; import android.widget.ImageView;import com.bumptech.glide.Glide; import com.bumptech.glide.Priority; import com.bumptech.glide.request.RequestOptions; import com.zhihu.matisse.engine.ImageEngine;/*** {@link ImageEngine} implementation using Glide.*/public class Glide4Engine implements ImageEngine {@Overridepublic void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {Glide.with(context).asBitmap() // some .jpeg files are actually gif.load(uri).apply(new RequestOptions().override(resize, resize).placeholder(placeholder).centerCrop()).into(imageView);}@Overridepublic void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView,Uri uri) {Glide.with(context).asBitmap() // some .jpeg files are actually gif.load(uri).apply(new RequestOptions().override(resize, resize).placeholder(placeholder).centerCrop()).into(imageView);}@Overridepublic void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {Glide.with(context).load(uri).apply(new RequestOptions().override(resizeX, resizeY).priority(Priority.HIGH).fitCenter()).into(imageView);}@Overridepublic void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {Glide.with(context).asGif().load(uri).apply(new RequestOptions().override(resizeX, resizeY).priority(Priority.HIGH).fitCenter()).into(imageView);}@Overridepublic boolean supportAnimatedGif() {return true;}}

?

關于Api

方法名描述參數
showSingleMediaType()僅僅顯示一種媒體類型Boolean
from()傳遞當前的Activity或者fragmentMainActivity.this
choose()顯示圖片的類型MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF) 或者MimeType.ofAll()
countable()是否有序選擇圖片Boolean
maxSelectable()最大的選擇數量int類型 多少都可以
addFilter()添加過濾器new GifSizeFilter(320, 320, 5?Filter.K?Filter.K),自己重寫過濾器
gridExpectedSize()每個圖片方格的大小120dp
restrictOrientation()設置圖像選擇和預覽活動所需的方向ActivityInfo.SCREEN_ORIENTATION_PORTRAIT或者
thumnailScale()縮放比例0.1-1之間,一般0.85f
imageEngine()使用圖片的加載方式new GlideEngine()或者new PicassoEngine()
theme()主題的設置R.style.Matisse_Zhihu 或者 R.style.Matisse_Dracula
forResult()請求碼REQUEST_CODE_CHOOSE

包含的類

類名描述
ImageEngine圖片加載接口,方便后面根據Glide和Picasso分別實現
GlideEngineGlide實現ImageEngine
PicassoEnginePicasso實現ImageEngine
Filter過濾條件抽象類,我們可以通過集成Filter實現對應的過濾條件來對圖片進行篩選,可以添加多個Filter
Album相冊Entity
CaptureStrategy拍照相關,媒體處理authority
IncapableCause信息處理,toast和dialog
Item選擇媒體界面的Item
SelectionSpec選擇參數類
AlbumLoader相冊CursorLoader
AlbumMediaLoader圖片和視頻CursorLoader
AlbumMediaCollectionAlbumMediaLoader回調
SelectedItemCollection被選中項集合
internal/ui包界面顯示的Adapter,自定義視圖,Fragment和Activity
internal/utils包工具類
MatisseActivity關鍵類,執行選擇媒體操作的時候展示出來的Activity
Matisse開源庫的入口和出口,用來傳遞Activity和Fragment,創建SelectionSpecBuilder和返回結果
MimeType媒體類型
SelectionSpecBuilderBuild構造類,用來傳遞參數

總結

以上是生活随笔為你收集整理的Matisse图片选择的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。