在 Android 設(shè)備上獲取照片佛析、裁剪圖片、壓縮圖片 @TakePhoto V3.0 發(fā)布

TakePhoto 簡介

TakePhoto是一款用于在Android設(shè)備上獲取照片(拍照或從相冊彪蓬、文件中選擇)寸莫、裁剪圖片、壓縮圖片的開源工具庫档冬,目前最新版本3.0.0膘茎。
3.0以下版本及API說明桃纯,詳見TakePhoto2.0+

V3.0

  • 支持通過相機拍照獲取圖片
  • 支持從相冊選擇圖片
  • 支持從文件選擇圖片
  • 支持批量圖片選取
  • 支持圖片壓縮以及批量圖片壓縮
  • 支持圖片裁切以及批量圖片裁切
  • 支持照片旋轉(zhuǎn)角度自動糾正
  • 支持自動權(quán)限管理(無需關(guān)心SD卡及攝像頭權(quán)限等問題)
  • 支持對裁剪及壓縮參數(shù)個性化配置
  • 提供自帶裁剪工具(可選)
  • 支持智能選取及裁剪異常處理
  • 支持因拍照Activity被回收后的自動恢復(fù)
  • 支持Android7.0

GitHub地址: https://github.com/crazycodeboy/TakePhoto

目錄

安裝說明

Gradle:

    compile 'com.jph.takephoto:takephoto_library:3.0.0'

Maven:

<dependency>
  <groupId>com.jph.takephoto</groupId>
  <artifactId>takephoto_library</artifactId>
  <version>3.0.0</version>
  <type>pom</type>
</dependency>

演示

運行效果圖:

預(yù)覽圖
預(yù)覽圖

運行效果圖
運行效果圖

使用說明

使用TakePhoto有以下兩種方式:

方式一:通過繼承的方式

  1. 繼承TakePhotoActivity披坏、TakePhotoFragmentActivity态坦、TakePhotoFragment三者之一。
  2. 通過getTakePhoto()獲取TakePhoto實例進行相關(guān)操作棒拂。
  3. 重寫以下方法獲取結(jié)果
 void takeSuccess(TResult result);
 void takeFail(TResult result,String msg);
 void takeCancel();

此方式使用簡單伞梯,滿足的大部分的使用需求,具體使用詳見simple帚屉。如果通過繼承的方式無法滿足實際項目的使用谜诫,可以通過下面介紹的方式。

方式二:通過組裝的方式

可參照:TakePhotoActivity攻旦,以下為主要步驟:

1.實現(xiàn)TakePhoto.TakeResultListener,InvokeListener接口喻旷。

2.在 onCreate,onActivityResult,onSaveInstanceState方法中調(diào)用TakePhoto對用的方法。

3.重寫onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)牢屋,添加如下代碼且预。

  @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //以下代碼為處理Android6.0、7.0動態(tài)權(quán)限所需
        TPermissionType type=PermissionManager.onRequestPermissionsResult(requestCode,permissions,grantResults);
        PermissionManager.handlePermissionsResult(this,type,invokeParam,this);
    }

4.重寫TPermissionType invoke(InvokeParam invokeParam)方法烙无,添加如下代碼:

 @Override
    public TPermissionType invoke(InvokeParam invokeParam) {
        TPermissionType type=PermissionManager.checkPermission(TContextWrap.of(this),invokeParam.getMethod());
        if(TPermissionType.WAIT.equals(type)){
            this.invokeParam=invokeParam;
        }
        return type;
    }

5.添加如下代碼獲取TakePhoto實例:

   /**
     *  獲取TakePhoto實例
     * @return
     */
    public TakePhoto getTakePhoto(){
        if (takePhoto==null){
            takePhoto= (TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this,this));
        }
        return takePhoto;
    }    

API

獲取圖片

TakePhoto提供拍照锋谐,從相冊選擇,從文件中選擇三種方式獲取圖片截酷。

API:

/**
 * 從文件中獲取圖片(不裁剪)
 */
void onPickFromDocuments();
/**
 * 從相冊中獲取圖片(不裁剪)
 */
void onPickFromGallery();
/**
 * 從相機獲取圖片(不裁剪)
 * @param outPutUri 圖片保存的路徑
 */
void onPickFromCapture(Uri outPutUri);
/**
 * 圖片多選
 * @param limit 最多選擇圖片張數(shù)的限制
 **/
void onPickMultiple(int limit);

以上三種方式均提供對應(yīng)的裁剪API怀估,詳見:裁剪圖片
注:
由于不同Android Rom廠商對系統(tǒng)有不同程度的定制合搅,有可能導(dǎo)致某種選擇圖片的方式不支持,所以為了提高TakePhoto的兼容性歧蕉,當(dāng)某種選的圖片的方式不支持時灾部,TakePhoto會自動切換成使用另一種選擇圖片的方式進行圖片選擇。

裁剪圖片

API

TakePhoto支持對圖片進行裁剪惯退,無論是拍照的照片,還是從相冊赌髓、文件中選擇的圖片。你只需要調(diào)用TakePhoto的相應(yīng)方法即可:

/**
 * 從相機獲取圖片并裁剪
 * @param outPutUri 圖片裁剪之后保存的路徑
 * @param options 裁剪配置             
 */
void onPickFromCaptureWithCrop(Uri outPutUri, CropOptions options);
/**
 * 從相冊中獲取圖片并裁剪
 * @param outPutUri 圖片裁剪之后保存的路徑
 * @param options 裁剪配置
 */
void onPickFromGalleryWithCrop(Uri outPutUri, CropOptions options);
/**
 * 從文件中獲取圖片并裁剪
 * @param outPutUri 圖片裁剪之后保存的路徑
 * @param options 裁剪配置
 */
void onPickFromDocumentsWithCrop(Uri outPutUri, CropOptions options);
/**
 * 圖片多選催跪,并裁切
 * @param limit 最多選擇圖片張數(shù)的限制
 * @param options  裁剪配置
 * */
void onPickMultipleWithCrop(int limit, CropOptions options);

對指定圖片進行裁剪

另外锁蠕,TakePhoto也支持你對指定圖片進行裁剪:

/**
 * 裁剪圖片
 * @param imageUri 要裁剪的圖片
 * @param outPutUri 圖片裁剪之后保存的路徑
 * @param options 裁剪配置
 */
void onCrop(Uri imageUri, Uri outPutUri, CropOptions options)throws TException;
/**
 * 裁剪多張圖片
 * @param multipleCrop 要裁切的圖片的路徑以及輸出路徑
 * @param options 裁剪配置
 */
void onCrop(MultipleCrop multipleCrop, CropOptions options)throws TException;

CropOptions

CropOptions是用于裁剪的配置類,通過它你可以對圖片的裁剪比例懊蒸,最大輸出大小荣倾,以及是否使用TakePhoto自帶的裁剪工具進行裁剪等,進行個性化配置骑丸。

Usage:

 CropOptions cropOptions=new CropOptions.Builder().setAspectX(1).setAspectY(1).setWithOwnCrop(true).create();  
 getTakePhoto().onPickFromDocumentsWithCrop(imageUri,cropOptions);  
 //或  
 getTakePhoto().onCrop(imageUri,outPutUri,cropOptions);  

注:
由于不同Android Rom廠商對系統(tǒng)有不同程度的定制舌仍,有可能系統(tǒng)中沒有自帶或第三方的裁剪工具妒貌,所以為了提高TakePhoto的兼容性,當(dāng)系統(tǒng)中沒有自帶或第三方裁剪工具時铸豁,TakePhoto會自動切換到使用TakePhoto自帶的裁剪工具進行裁剪灌曙。

壓縮圖片

你可以選擇是否對圖片進行壓縮處理,你只需要告訴它你是否要啟用壓縮功能以及CompressConfig即可节芥。

API

 /**
  * 啟用圖片壓縮
  * @param config 壓縮圖片配置
  * @param showCompressDialog 壓縮時是否顯示進度對話框
  * @return
  */
 void onEnableCompress(CompressConfig config,boolean showCompressDialog);

Usage:

TakePhoto takePhoto=getTakePhoto();
takePhoto.onEnableCompress(compressConfig,true);
takePhoto.onPickFromGallery();

如果你啟用了圖片壓縮在刺,TakePhoto會使用CompressImage對圖片進行壓縮處理,CompressImage目前支持對圖片的尺寸以及圖片的質(zhì)量進行壓縮头镊。默認情況下蚣驼,CompressImage開啟了尺寸與質(zhì)量雙重壓縮。

對指定圖片進行壓縮

另外拧晕,你也可以對指定圖片進行壓縮:
Usage:

new CompressImageImpl(compressConfig,result.getImages(), new CompressImage.CompressListener() {
    @Override
    public void onCompressSuccess(ArrayList<TImage> images) {
        //圖片壓縮成功
    }
    @Override
    public void onCompressFailed(ArrayList<TImage> images, String msg) {
        //圖片壓縮失敗
    }
}).compress();

CompressConfig

CompressConfig是用于圖片壓縮的配置類隙姿,你可以通過CompressConfig.Builder對圖片壓縮后的尺寸以及質(zhì)量進行相關(guān)設(shè)置。如果你想改變壓縮的方式可以通過CompressConfig.Builder進行相關(guān)設(shè)置厂捞。
Usage:

CompressConfig compressConfig=new CompressConfig.Builder().setMaxSize(50*1024).setMaxPixel(800).create();

兼容性

Android6.0

由于Android6.0新增了"運行時權(quán)限控制(Runtime Permissions)"输玷,為了應(yīng)對這一改變,TakePhoto加入和自動權(quán)限管理靡馁,當(dāng)TakePhoto檢測到需要權(quán)限時欲鹏,TakePhoto會自動申請權(quán)限,所以小伙伴們不用擔(dān)心權(quán)限的使用問題臭墨。

Android7.0

在Android N中赔嚎,Android 框架執(zhí)行了 StrictMode,應(yīng)用間共享文件和以前也有所區(qū)別胧弛。為了適配Android7.0的改變尤误,同時也為了方便大家使用TakePhoto,TakePhoto會自動根據(jù)手機的Android版本自行適配结缚,小伙伴們依舊可以向TakePhoto傳遞Uri imageUri = Uri.fromFile(file);類型的Uri而不用擔(dān)心兼容性問題损晤。

TakePhoto在深度兼容性方面的測試

兼容性測試報告
兼容性測試報告

獲取更高的兼容性

TakePhoto是基于Android官方標(biāo)準(zhǔn)API編寫的,適配了目前市場上主流的Rom红竭。如果你在使用過程中發(fā)現(xiàn)了適配問題尤勋,可以提交Issues

  1. 為適配部分手機拍照時會回收Activity茵宪,TakePhotoonSaveInstanceStateonCreate做了相應(yīng)的恢復(fù)處理最冰。
  2. 為適配部分手機拍照或從相冊選擇圖片時屏幕方向會發(fā)生轉(zhuǎn)變,從而導(dǎo)致拍照失敗的問題,可以在AndroidManifest.xml中對使用了TakePhotoActivity添加android:configChanges="orientation|keyboardHidden|screenSize"配置稀火。
    eg:
<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

貢獻

如果你在使用TakePhoto中遇到任何問題可以提Issues出來暖哨。另外歡迎大家為TakePhoto貢獻智慧,歡迎大家Fork and Pull requests凰狞。

最后

既然來了鹿蜀,留下個喜歡再走吧箕慧,鼓勵我繼續(xù)創(chuàng)作(_)∠※

如果喜歡我的文章,那就關(guān)注我的博客吧茴恰,讓我們一起做朋友~~

戳這里,加關(guān)注哦:

微博:第一時間獲取推送
個人博客:干貨文章都在這里哦
GitHub:我的開源項目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颠焦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子往枣,更是在濱河造成了極大的恐慌伐庭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件分冈,死亡現(xiàn)場離奇詭異圾另,居然都是意外死亡,警方通過查閱死者的電腦和手機雕沉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門集乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坡椒,你說我怎么就攤上這事扰路。” “怎么了倔叼?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵汗唱,是天一觀的道長。 經(jīng)常有香客問我丈攒,道長哩罪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任巡验,我火速辦了婚禮际插,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘显设。我一直安慰自己框弛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布敷硅。 她就那樣靜靜地躺著,像睡著了一般愉阎。 火紅的嫁衣襯著肌膚如雪绞蹦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天榜旦,我揣著相機與錄音幽七,去河邊找鬼。 笑死溅呢,一個胖子當(dāng)著我的面吹牛澡屡,可吹牛的內(nèi)容都是我干的猿挚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼驶鹉,長吁一口氣:“原來是場噩夢啊……” “哼绩蜻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起室埋,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤办绝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姚淆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孕蝉,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盗扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年斯议,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哲思。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡搏讶,死狀恐怖佳鳖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窍蓝,我是刑警寧澤腋颠,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站吓笙,受9級特大地震影響淑玫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜面睛,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一絮蒿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叁鉴,春花似錦土涝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至常侣,卻和暖如春蜡饵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胳施。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工溯祸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓焦辅,卻偏偏與公主長得像博杖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筷登,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容