TakePhoto
½éÉÜ£º
Ò»¿îÓÃÓÚÔÚAndroidÉ豸ÉÏ»ñÈ¡ÕÕƬ£¨ÅÄÕÕ»ò´ÓÏà²á¡¢ÎļþÖÐÑ¡Ôñ£©¡¢²Ã¼ôͼƬ¡¢Ñ¹ËõͼƬµÄ¿ªÔ´¹¤¾ß¿â
ÔËÐÐЧ¹û£º
ʹÓÃ˵Ã÷£º
https://crazycodeboy.github.io/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>
ʹÓÃTakePhotoÓÐÒÔÏÂÁ½ÖÖ·½Ê½£º
·½Ê½Ò»£ºÍ¨¹ý¼Ì³ÐµÄ·½Ê½
1. ¼Ì³ÐTakePhotoActivity¡¢TakePhotoFragmentActivity¡¢TakePhotoFragmentÈýÕßÖ®Ò»¡£
2. ͨ¹ýgetTakePhoto()»ñÈ¡TakePhotoʵÀý½øÐÐÏà¹Ø²Ù×÷¡£
3. ÖØдÒÔÏ·½·¨»ñÈ¡½á¹û
void takeSuccess(TResult result);
void takeFail(TResult result,String msg);
void takeCancel();
´Ë·½Ê½Ê¹Óüòµ¥£¬Âú×ãµÄ´ó²¿·ÖµÄʹÓÃÐèÇ󣬾ßÌåʹÓÃÏê¼ûsimple¡£Èç¹ûͨ¹ý¼Ì³ÐµÄ·½Ê½ÎÞ·¨Âú×ãʵ¼ÊÏîÄ¿µÄʹÓ㬿ÉÒÔͨ¹ýÏÂÃæ½éÉܵķ½Ê½¡£
·½Ê½¶þ£ºÍ¨¹ý×é×°µÄ·½Ê½
¿É²ÎÕÕ£ºTakePhotoActivity£¬ÒÔÏÂΪÖ÷Òª²½Ö裺
1.ʵÏÖTakePhoto.TakeResultListener,InvokeListener½Ó¿Ú¡£
2.ÔÚ onCreate,onActivityResult,onSaveInstanceState·½·¨Öе÷ÓÃ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¶¯Ì¬È¨ÏÞËùÐè
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 ×î¶àÑ¡ÔñͼƬÕÅÊýµÄÏÞÖÆ
**/
void onPickMultiple(int limit);
ÒÔÉÏÈýÖÖ·½Ê½¾ùÌṩ¶ÔÓ¦µÄ²Ã¼ôAPI£¬Ïê¼û£º²Ã¼ôͼƬ¡£
×¢£º
ÓÉÓÚ²»Í¬Android Rom³§É̶ÔϵͳÓв»Í¬³Ì¶ÈµÄ¶¨ÖÆ£¬ÓпÉÄܵ¼ÖÂijÖÖÑ¡ÔñͼƬµÄ·½Ê½²»Ö§³Ö£¬ËùÒÔΪÁËÌá¸ßTakePhotoµÄ¼æÈÝÐÔ£¬µ±Ä³ÖÖÑ¡µÄͼƬµÄ·½Ê½²»Ö§³Öʱ£¬TakePhoto»á×Ô¶¯Çл»³ÉʹÓÃÁíÒ»ÖÖÑ¡ÔñͼƬµÄ·½Ê½½øÐÐͼƬѡÔñ¡£
²Ã¼ôͼƬ
API
TakePhotoÖ§³Ö¶ÔͼƬ½øÐвüô£¬ÎÞÂÛÊÇÅÄÕÕµÄÕÕƬ,»¹ÊÇ´ÓÏà²á¡¢ÎļþÖÐÑ¡ÔñµÄͼƬ¡£ÄãÖ»ÐèÒªµ÷ÓÃTakePhotoµÄÏàÓ¦·½·¨¼´¿É£º
/**
* ´ÓÏà»ú»ñȡͼƬ²¢²Ã¼ô
* @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 ×î¶àÑ¡ÔñͼƬÕÅÊýµÄÏÞÖÆ
* @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³§É̶ÔϵͳÓв»Í¬³Ì¶ÈµÄ¶¨ÖÆ£¬ÓпÉÄÜϵͳÖÐûÓÐ×Ô´ø»òµÚÈý·½µÄ²Ã¼ô¹¤¾ß£¬ËùÒÔΪÁËÌá¸ßTakePhotoµÄ¼æÈÝÐÔ£¬µ±ÏµÍ³ÖÐûÓÐ×Ô´ø»òµÚÈý·½²Ã¼ô¹¤¾ßʱ£¬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Ä¿Ç°Ö§³Ö¶ÔͼƬµÄ³ß´çÒÔ¼°Í¼Æ¬µÄÖÊÁ¿½øÐÐѹËõ¡£Ä¬ÈÏÇé¿öÏ£¬CompressImage¿ªÆôÁ˳ߴçÓëÖÊÁ¿Ë«ÖØѹËõ¡£
¶ÔÖ¸¶¨Í¼Æ¬½øÐÐѹËõ
ÁíÍ⣬ÄãÒ²¿ÉÒÔ¶ÔÖ¸¶¨Í¼Æ¬½øÐÐѹËõ£º
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¶ÔͼƬѹËõºóµÄ³ß´çÒÔ¼°ÖÊÁ¿½øÐÐÏà¹ØÉèÖá£Èç¹ûÄãÏë¸Ä±äѹËõµÄ·½Ê½¿ÉÒÔͨ¹ýCompressConfig.Builder½øÐÐÏà¹ØÉèÖá£
Usage:
CompressConfig compressConfig=new CompressConfig.Builder().setMaxSize(50*1024).setMaxPixel(800).create();
¼æÈÝÐÔ
Android6.0
ÓÉÓÚAndroid6.0ÐÂÔöÁË"ÔËÐÐʱȨÏÞ¿ØÖÆ(Runtime Permissions)"£¬ÎªÁËÓ¦¶ÔÕâÒ»¸Ä±ä£¬TakePhoto¼ÓÈëºÍ×Ô¶¯È¨ÏÞ¹ÜÀí£¬µ±TakePhoto¼ì²âµ½ÐèҪȨÏÞʱ£¬TakePhoto»á×Ô¶¯ÉêÇëȨÏÞ£¬ËùÒÔС»ï°éÃDz»Óõ£ÐÄȨÏÞµÄʹÓÃÎÊÌâ¡£
Android7.0
ÔÚAndroid NÖУ¬Android ¿ò¼ÜÖ´ÐÐÁË StrictMode£¬Ó¦Óü乲ÏíÎļþºÍÒÔÇ°Ò²ÓÐËùÇø±ð¡£ÎªÁËÊÊÅäAndroid7.0µÄ¸Ä±ä£¬Í¬Ê±Ò²ÎªÁË·½±ã´ó¼ÒʹÓÃTakePhoto£¬TakePhoto»á×Ô¶¯¸ù¾ÝÊÖ»úµÄAndroid°æ±¾×ÔÐÐÊÊÅ䣬С»ï°éÃÇÒÀ¾É¿ÉÒÔÏòTakePhoto´«µÝUri imageUri = Uri.fromFile(file);ÀàÐ͵ÄUri¶ø²»Óõ£ÐļæÈÝÐÔÎÊÌâ¡£
TakePhotoÔÚÉî¶È¼æÈÝÐÔ·½ÃæµÄ²âÊÔ
»ñÈ¡¸ü¸ßµÄ¼æÈÝÐÔ
TakePhotoÊÇ»ùÓÚAndroid¹Ù·½±ê×¼API±àдµÄ£¬ÊÊÅäÁËÄ¿Ç°Êг¡ÉÏÖ÷Á÷µÄRom¡£Èç¹ûÄãÔÚʹÓùý³ÌÖз¢ÏÖÁËÊÊÅäÎÊÌ⣬¿ÉÒÔÌá½»Issues¡£
1. ΪÊÊÅ䲿·ÖÊÖ»úÅÄÕÕʱ»á»ØÊÕActivity£¬TakePhotoÔÚonSaveInstanceStateÓë onCreate×öÁËÏàÓ¦µÄ»Ö¸´´¦Àí¡£
2. ΪÊÊÅ䲿·ÖÊÖ»úÅÄÕÕ»ò´ÓÏà²áÑ¡ÔñͼƬʱÆÁÄ»·½Ïò»á·¢Éúת±ä,´Ó¶øµ¼ÖÂÅÄÕÕʧ°ÜµÄÎÊÌ⣬¿ÉÒÔÔÚAndroidManifest.xmlÖжÔʹÓÃÁËTakePhotoµÄActivityÌí¼Ó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>