GalleryPick 是 Android 自定義相冊,實現了拍照、圖片選擇(單選/多選)、裁剪、ImageLoader無綁定 任由開發者選擇java
UI重改android
全部功能可配置git
解決OOM狀況github
圖片多選、單選app
ImageLoader 無綁定,任由開發者選擇框架
可直接開啓相機maven
可裁剪、可旋轉ide
優化部分代碼。字體
本開源代碼以關聯到 jitpack
網站 ,使用者能夠用如下幾種方式進行抓取。gradle
在 Project
的 build.gradle
中 添加:
allprojects { repositories { ... maven { url "https://jitpack.io" } } }
在 app
的 build.gradle
中 添加:
dependencies { compile 'com.github.YancyYe:GalleryPick:1.2.1' }
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
<dependency> <groupId>com.github.YancyYe</groupId> <artifactId>GalleryPick</artifactId> <version>1.2.1</version> </dependency>
請在 app 中的 AndroidManifest
中的application
標籤下添加
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.yancy.gallerypickdemo.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider>
provider
中的 authorities
能夠本身定義爲 provider所在的包的名字+provider自己定義的名稱 (若是一個設備中出現兩個一樣的authorities
會出現沒法安裝的狀況)
在res
中建立xml
文件夾,在其中建立文件。文件名本身定義。demo中定義了filepaths.xml
。
<?xml version="1.0" encoding="utf-8"?> <resources> <paths> <external-path name="external" path="" /> <files-path name="files" path="" /> <cache-path name="cache" path="" /> </paths> </resources>
FileProvider
中設置的內容我就不介紹了,網上一搜一大片。
最後,在設置GalleryConfig
的時候,設置provider
,內容爲你以前在AndroidManifest
中的provider
中的authorities
設置的值。demo中爲:com.yancy.gallerypickdemo.fileprovider
(使用方法參考)
代碼示例:
在點擊開啓相冊按鈕時:
if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { Log.i(TAG, "須要受權 "); if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Log.i(TAG, "拒絕過了"); // 提示用戶若是想要正常使用,要手動去設置中受權。 Toast.makeText(mContext, "請在 設置-應用管理 中開啓此應用的儲存受權。", Toast.LENGTH_SHORT).show(); } else { Log.i(TAG, "進行受權"); ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_READ_CONTACTS); } } else { Log.i(TAG, "不須要受權 "); // 進行正常操做 } }
如下是用戶受權反饋
Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i(TAG, "贊成受權"); // 進行正常操做。 } else { Log.i(TAG, "拒絕受權"); } } }
IHandlerCallBack
IHandlerCallBack iHandlerCallBack = new IHandlerCallBack() { @Override public void onStart() { Log.i(TAG, "onStart: 開啓"); } @Override public void onSuccess(List<String> photoList) { Log.i(TAG, "onSuccess: 返回數據"); for (String s : photoList) { Log.i(TAG, s); } } @Override public void onCancel() { Log.i(TAG, "onCancel: 取消"); } @Override public void onFinish() { Log.i(TAG, "onFinish: 結束"); } @Override public void onError() { Log.i(TAG, "onError: 出錯"); } };
GalleryConfig
可先進行初始配置,除了ImageLoader
和 IHandlerCallBack
以外,其餘都是選填,都有默認值。
GalleryConfig galleryConfig = new GalleryConfig.Builder() .imageLoader(new GlideImageLoader()) // ImageLoader 加載框架(必填) .iHandlerCallBack(iHandlerCallBack) // 監聽接口(必填) .provider("com.yancy.gallerypickdemo.fileprovider") // provider (必填) .pathList(path) // 記錄已選的圖片 .multiSelect(false) // 是否多選 默認:false .multiSelect(false, 9) // 配置是否多選的同時 配置多選數量 默認:false , 9 .maxSize(9) // 配置多選時 的多選數量。 默認:9 .crop(false) // 快捷開啓裁剪功能,僅當單選 或直接開啓相機時有效 .crop(false, 1, 1, 500, 500) // 配置裁剪功能的參數, 默認裁剪比例 1:1 .isShowCamera(true) // 是否現實相機按鈕 默認:false .filePath("/Gallery/Pictures") // 圖片存放路徑 .build();
能夠按照需求進行單項配置,前提須要填好 ImageLoader
和 IHandlerCallBack
,舉例:
galleryConfig.getBuilder().multiSelect(true).build(); // 修改多選 galleryConfig.getBuilder().isShowCamera(true).build(); // 修改顯示相機 galleryConfig.getBuilder().imageLoader(new PicassoImageLoader()).build(); // 修改圖片加載框架
GalleryPick
圖片選擇器GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);
注意:裁剪功能只能在單選時、直接開啓相機時生效。
GalleryConfig galleryConfig = new GalleryConfig.Builder() .imageLoader(new GlideImageLoader()) // ImageLoader 加載框架(必填) .iHandlerCallBack(iHandlerCallBack) // 監聽接口(必填) .provider("com.yancy.gallerypickdemo.fileprovider") // provider (必填) .pathList(path) // 記錄已選的圖片 .crop(true) // 快捷開啓裁剪功能,僅當單選 或直接開啓相機時有效 .isShowCamera(true) // 是否現實相機按鈕 默認:false .filePath("/Gallery/Pictures") // 圖片存放路徑 .build(); GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);
若是須要自定義裁剪框的比例,可按照如下方法設置:
GalleryConfig galleryConfig = new GalleryConfig.Builder() .imageLoader(new GlideImageLoader()) // ImageLoader 加載框架(必填) .iHandlerCallBack(iHandlerCallBack) // 監聽接口(必填) .provider("com.yancy.gallerypickdemo.fileprovider") // provider (必填) .pathList(path) // 記錄已選的圖片 .crop(true, 1, 1, 500, 500) // 配置裁剪功能的參數, 默認裁剪比例 1:1 .isShowCamera(true) // 是否現實相機按鈕 默認:false .filePath("/Gallery/Pictures") // 圖片存放路徑 .build(); GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);
裁剪圖片存放在 filePath
文件夾下的 crop
目錄下。內部建立了忽略文件,手機系統掃描不到此文件目錄下的媒體文件,防止裁剪圖片顯示在相冊中,影響心情。
在 GalleryConfig
中設置直接開啓相機的標識位。
GalleryConfig galleryConfig = new GalleryConfig.Builder() .iHandlerCallBack(iHandlerCallBack) // 監聽接口(必填) .filePath("/Gallery/Pictures") // 圖片存放路徑 (選填) .isOpenCamera(true) // 直接開啓相機的標識位 .build(); GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);
若是已經設置好了 GalleryConfig
可使用單項參數修改的方法來開啓相機。
galleryConfig.getBuilder().isOpenCamera(true).build(); GalleryPick.getInstance().setGalleryConfig(galleryConfig).open(mActivity);
爲了方便使用,在不變更開啓相冊的GalleryConfig
的狀況下,我還添加了如下方法。
GalleryPick.getInstance().setGalleryConfig(galleryConfig).openCamera(mActivity);
這個方法能夠直接使用。不須要在GalleryConfig
中添加標誌位,或者進行單項修改。方便用戶使用。
可能有不少用戶對 GalleryPick
裏面的界面還有些不滿意。不要緊,接下來我來教你們如何本身定義其中的顏色。
下面舉個簡單的例子:
我在 GalleryPick
中的 gallery_title.xml
中設置了標題欄的顏色爲 @color/gallery_blue
用戶能夠在 app 中的 colors.xml
中定義一個名爲 gallery_blue
的顏色:
<resources> <color name="gallery_blue">#FF4081</color> </resources>
這樣就達到了覆蓋資源文件的效果。從而達到自定義UI。
有些朋友會問,我標題欄設置了白色,可是標題欄的字體和圖標也是白色的,那該怎麼辦?
下面來說一下方法,由於是覆蓋資源文件,因此在 app 中建立 gallery_title.xml
, 先將 GalleryPick
中的 gallery_title.xml
代碼copy過去,而後就簡單了。將TextView
的textColor
中的顏色顏色換一下就行了。一樣,返回按鈕能夠改變一下 ImageView
的src
,很簡單。
忽略裁剪圖片,返回相機拍攝的照片。
優化 Provider
防止兩個以上 App 使用 GalleryPick
會出現安裝不上的問題。
(修改詳情)
修復android 4.x 打開相機崩潰的bug
修復android 7.x 打開相機崩潰的bug
優化相冊系統。拍攝、裁剪的圖片,只有選中時纔在相冊顯示。
修改裁剪所存在的bug
添加經過覆蓋資源的方式,修改截圖頁面的配色。(使用方法參考)
修復直接開啓相機所存在的問題
修復直接開啓相機所隱藏的bug
新增裁剪功能。(使用方法參考)
應使用者需求添加直接開啓相機的方法。 (使用方法參考)
提供單選、多選、以及相機拍照功能。
自定義ImageLoader
圖片裁剪 UCrop
Email: yancy_world@outlook.com