Giter Club home page Giter Club logo

boxing's Introduction

boxing


Android multi-media selector based on MVP mode.中文文档 Build Status

boxing Inside:

bili

Feature


  • Custom UI
  • Multiple/single selection, preview and crop function
  • Gif support
  • Video selection
  • Image compression
  • Gif encode(checkout feature/gif-encode to have fun), see Bilibili/BurstLinker

Download


Core version: only contain the core function.

UI version: contain UI implements base on core version.

  • Maven

Core version

<dependency>                       
  	<groupId>com.bilibili</groupId>  
  	<artifactId>boxing</artifactId>  
  	<version>1.0.4</version>
  	<type>pom</type>                
</dependency>                      		

UI version

<dependency>                          
  	<groupId>com.bilibili</groupId>     
  	<artifactId>boxing-impl</artifactId>
  	<version>1.0.4</version>
  	<type>pom</type>                    
</dependency>                         
  • Gradle

Core version

compile 'com.bilibili:boxing:1.0.4'

UI version

compile 'com.bilibili:boxing-impl:1.0.4'

Preview

multi_image single_image_crop video

Getting Started

  • Media loading initialization(required)
BoxingMediaLoader.getInstance().init(new IBoxingMediaLoader()); // a class implements IBoxingMediaLoader 
  • Image cropping initialization(optional)
BoxingCrop.getInstance().init(new IBoxingCrop());  // a class implements IBoxingCrop 
  • Build BoxingConfig Specify the mode(Mode.SINGLE_IMG, Mode.MULTI_IMG, Mode.VIDEO) with camera and gif support.
BoxingConfig config = new BoxingConfig(Mode); // Mode:Mode.SINGLE_IMG, Mode.MULTI_IMG, Mode.VIDEO
config.needCamera(cameraRes).needGif().withMaxCount(9) // camera, gif support, set selected images count
.withMediaPlaceHolderRes(resInt) // set the image placeholder, default 0
.withAlbumPlaceHolderRes(resInt) // set the album placeholder, default 0
.withVideoDurationRes(resInt) // set the video duration resource in video mode, default 0
  • Get Boxing, set Intent and call start
// start thumbnails Activity, need boxing-impl.
Boxing.of(config).withIntent(context, BoxingActivity.class).start(callerActivity, REQUEST_CODE); 
  	
// start view raw image Activity, need boxing-impl.
Boxing.of(config).withIntent(context, BoxingViewActivity.class).start(callerActivity, REQUEST_CODE); 
  	
// call of() use Mode.MULTI_IMG by default.
Boxing.of().withIntent(context, class).start(callerActivity, REQUEST_CODE);
  • Get Result
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  	List<BaseMedia> medias = Boxing.getResult(data);
  	// avoid null
}

Advanced usage

Media loading and image cropping initialization are the same as Simple Usage.

  • Customize Activity and Fragment Extends AbsBoxingViewActivity and AbsBoxingViewFragment. call Boxing.of(config).withIntent(context, AbsBoxingViewActivity.class).start(callerActivity, REQUEST_CODE); to start.

  • Only customize Fragment Extends AbsBoxingViewFragment,no AbsBoxingViewActivity. call Boxing.of(BoxingConfig).setupFragment(AbsBoxingViewFragment, OnFinishListener); to start.

FileProvider

Use camera in Android N, add this in AndroidManifest.xml

<provider                                                 
	android:name="android.support.v4.content.FileProvider"
	android:authorities="${applicationId}.file.provider" >               
	<meta-data                                            
		android:name="android.support.FILE_PROVIDER_PATHS"
		android:resource="@xml/boxing_file_provider"/>
</provider>                 

Kotlin Support

Stay hungry, stay foolish. checkout feature/kotlin for fun.

TODO

Support different config at the same moment.

License


Copyright 2017 Bilibili 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.

boxing's People

Contributors

chensiliang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

boxing's Issues

多选模式

impl模块中:

1:多选模式时,是否可以支持设置选择的数量,现在写死为9.

         private static final int MAX_SELECTED_COUNT = 9;

2:错别字

    <string name="load_image_fail">肥肠抱歉,加载出错啦</string>
    <string name="crop_error">肥肠抱歉,裁剪出错啦</string>

有时候会打开进去崩溃

错误信息:java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@33388de7

手机:HTC,5.0系统

裁剪的时候报这个错误

05-16 16:11:04.824 9966-24510/com.bilibili.boxing W/ExifInterface: Invalid image: ExifInterface got an unsupported image format file(ExifInterface supports JPEG and some RAW image formats only) or a corrupted JPEG file to ExifInterface.
java.io.IOException: Invalid marker: 89
at android.media.ExifInterface.getJpegAttributes(ExifInterface.java:1852)
at android.media.ExifInterface.loadAttributes(ExifInterface.java:1485)
at android.media.ExifInterface.(ExifInterface.java:1122)
at com.yalantis.ucrop.task.BitmapCropTask.crop(BitmapCropTask.java:150)
at com.yalantis.ucrop.task.BitmapCropTask.doInBackground(BitmapCropTask.java:94)
at com.yalantis.ucrop.task.BitmapCropTask.doInBackground(BitmapCropTask.java:35)
at android.os.AsyncTask$2.call(AsyncTask.java:316)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)

About manifest merge

建议boxing-impl的资源都加上前缀,以避免在资源合并时由于与其他模块资源重名导致重名资源被覆盖的问题。

横屏状态拍照方向不对

当我在横屏状态调用拍照功能的时候,拍照界面是竖屏的,导致拍出来的照片方向不对,有没有办法能解决呢?

Manifest中添加了provider后程序无法启动

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.file.provider"
        android:exported="false"
        android:grantUriPermissions="true">

        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/boxing_file_provider"/>

    </provider>

在清单文件中加入后程序直接无法启动,

Error:Execution failed for task ':app:processDebugManifest'.

Manifest merger failed with multiple errors, see logs

去掉这个以后就可以启动,不知道啥原因

impl的style建议

  1. 建议将AppTheme换为Theme.AppCompat.Light.NoActionBar. DarkActionBar会在toolbar的title和menu处加入半透明的背景.
  2. 为什么impl的drawable文件夹要加入v4,这样我想在我的项目中重写某些资源还要再建一堆v4的drawable文件夹
  3. 建议将图片选中的那个checkbox的资源抽取出来,可以定制.

图片框架切换为Glide会导致二次选择图片报错

将图片加载框架改为Glide时,第一次选择图片可以正常显示,然后在进行选择会加载图片失败,报错位置为BoxingGlideLoader的44行,You must not call setTag() on a view Glide is targeting,原因为Item的布局简化代码,需外部嵌套父布局即可正常显示

权限问题

java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.SecurityException: Provider must grant uri permissions
at android.app.ActivityThread.installProvider(ActivityThread.java:5814)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5403)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5342)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.SecurityException: Provider must grant uri permissions
at android.support.v4.content.FileProvider.attachInfo(FileProvider.java:372)
at android.app.ActivityThread.installProvider(ActivityThread.java:5811)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5403) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5342) 
at android.app.ActivityThread.-wrap2(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

集成lib后运行 就报这个错, 请问下这个权限要怎么弄?

这是我的配置


裁剪后,没有回调 onActivityResult

demo上裁剪正常,然后继承到自己的app上就裁剪点击确定后,停留在选择图片界面。
试着把demo里面的 FirstActivity 整个复制过来,发现一样的停留在选择图片界面,一进入 Activity 就初始化了。

BoxingMediaLoader.getInstance().init(new BoxingGlideLoader()); // IBoxingMediaLoader
BoxingCrop.getInstance().init(new BoxingUcrop());  // a class implements IBoxingCrop

找了好久找不到原因,对比了很久,并没有发现哪里缺了设置,还请指教

请问拿到图片的imageMedia.getPath()后,如何将这张图片通过retrofit上传给远端?

我的代码:
File file = new File(path);
RequestBody avatarRequestBody = RequestBody.create(MediaType.parse("image/png"), file);
MultipartBody.Part avatar = MultipartBody.Part.createFormData("photos", "icon.png", avatarRequestBody);

presenter.sendModifyAvatarRequest(avatar, entity.getToken(), UtilDevice.getAndroidId(), UtilDevice.getTime(), entity.getUserId(), entity.getNickName(), UtilDevice.beginHashReStr(map));

会报错误:
W/System.err: java.io.FileNotFoundException: file:/data/user/0/xique.yinwei.ren/cache/boxing/1492675723592.jpg: open failed: ENOENT (No such file or directory)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at java.io.FileInputStream.(FileInputStream.java:76)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okio.Okio.source(Okio.java:168)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.RequestBody$3.writeTo(RequestBody.java:117)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.MultipartBody.writeOrCountBytes(MultipartBody.java:171)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.MultipartBody.writeTo(MultipartBody.java:113)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:756)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:613)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.RealCall.getResponse(RealCall.java:244)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at okhttp3.RealCall.execute(RealCall.java:57)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.Subscriber.setProducer(Subscriber.java:209)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.Subscriber.setProducer(Subscriber.java:205)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.Observable.unsafeSubscribe(Observable.java:8460)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:222)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
04-20 16:08:48.831 7233-7233/xique.yinwei.ren W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
04-20 16:08:48.832 7233-7233/xique.yinwei.ren W/System.err: at java.lang.Thread.run(Thread.java:818)
04-20 16:08:48.832 7233-7233/xique.yinwei.ren W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
04-20 16:08:48.832 7233-7233/xique.yinwei.ren W/System.err: at libcore.io.Posix.open(Native Method)
04-20 16:08:48.832 7233-7233/xique.yinwei.ren W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
04-20 16:08:48.832 7233-7233/xique.yinwei.ren W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
04-20 16:08:48.832 7233-7233/xique.yinwei.ren W/System.err: ... 31 more

如何关闭预览界面

跳转到图片选择界面,CheckBox选中范围很小,手指粗的人一点很容易就跳到图片预览界面,如何关闭这个,让用户点击左下的按钮去预览。点击整个图片为选中

关于返回值

使用的时候有个小疑问,我需要定义自己的实体,ImageMedia或者BaseMedia里的字段不能满足我的需求,不过我看源码中返回的就是List,这个应该怎么修改?谢谢

java.lang.NullPointerException: Attempt to invoke interface method 'void com.bilibili.boxing.presenter.PickerContract$Presenter.loadMedias(int, java.lang.String)'

app Activity 在后台被内存回收之后,重新onStart方法会挂~

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.bilibili.boxing.presenter.PickerContract$Presenter.loadMedias(int, java.lang.String)' on a null object reference
at com.bilibili.boxing.AbsBoxingViewFragment.loadMedias(AbsBoxingViewFragment.java:357)
at com.bilibili.boxing_impl.ui.BoxingBottomSheetFragment.startLoading(BoxingBottomSheetFragment.java:172)
at com.bilibili.boxing.AbsBoxingViewFragment.checkPermissionAndLoad(AbsBoxingViewFragment.java:187)
at com.bilibili.boxing.AbsBoxingViewFragment.onViewCreated(AbsBoxingViewFragment.java:178)
at com.bilibili.boxing_impl.ui.BoxingBottomSheetFragment.onViewCreated(BoxingBottomSheetFragment.java:84)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1315)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1523)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1585)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2832)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:603)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181)
at ***.MainActivity.onStart(MainActivity.java:523)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
at android.app.Activity.performStart(Activity.java:6699)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2629)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6121) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

Loader in Production ?

Hey, Cool library !
So you mentionned here ,in the Picaasso's loader, that it can not be used in Production Environment.

So what's the alternative to use this library in production ? Thanks.

关闭activity时崩溃

com.qienanxiang.tip/com.qienanxiang.tip.activity.EditF3SecondActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
05-12 08:31:41.719 1617-1915/? E/InputDispatcher: channel 'f1dc6c1 com.qienanxiang.tip/com.qienanxiang.tip.activity.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

拍照后完成响应时间较长

公司测试组反馈在oppo A53m手机上拍照完成时响应较慢,经过查看源码定位到
CameraPickerHelper.java文件230-241行:
原代码如下:
int degree = BoxingExifHelper.getRotateDegree(file.getAbsolutePath());
Matrix matrix = new Matrix();
if (degree != 0) {
matrix.postRotate(degree);
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
outBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
outputStream = new FileOutputStream(file);
outBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
建议修改为:
int degree = BoxingExifHelper.getRotateDegree(file.getAbsolutePath());
Matrix matrix = new Matrix();
if (degree != 0) {
matrix.postRotate(degree);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
outBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
outputStream = new FileOutputStream(file);
outBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
}
以避免在不需要旋转的时候浪费资源

急死了

我照着demo写了一个,跳转到BoxingViewActivity就崩溃了。
BoxingConfig config = new BoxingConfig(BoxingConfig.Mode.MULTI_IMG).needCamera(R.drawable.ic_boxing_camera_white).needGif();
Boxing.of(config).withIntent(this, BoxingActivity.class).start(this, REQUEST_CODE);

混淆

你好,请问混淆要怎么配置?

缩略图有些无法加载

在加载图片列表中,有些图片无法正常显示,使用Picasso加载图片的缩略图报no such file or directory异常,而使用图片原图加载则正常。手机型号为:zuk z1,小米3c。
详情图


boxing-impl/src/main/res/values/strings.xml:41行有错字
<string name="crop_error">肥肠(非常)抱歉,裁剪出错啦</string>

使用问题

不是很明白needCamera(int )该怎么使用!

点击预览图片的时候出错

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@cc64ef4
at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1270)
at android.graphics.Canvas.drawBitmap(Canvas.java:1404)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:544)
at android.widget.ImageView.onDraw(ImageView.java:1246)
at android.view.View.draw(View.java:16201)
at android.view.View.updateDisplayListIfDirty(View.java:15198)
at android.view.View.draw(View.java:15971)
我使用的是Fresco图片库,BoxingRawImageFragment的BoxingCallback类也是能调onSuccess的

主题颜色的问题

关于主题颜色的问题,我的colorPrimary被Boxing的colorPrimary覆盖掉,Title显示的一直是黑色,开始我怀疑是主题的问题,在Application中使用了 tools:replace="android:theme",但是效果还是黑色,请问如何才能不被Boxing的颜色 覆盖掉

初步使用反馈

1.多选图片的时候(最大9张),缩略图页面 选择了4张后,第五张点进去看大图,右下角显示 4/4,选中了第五张之后 变成正常的 5/9。

2.拍摄照片、裁剪的图片,存放的文件夹可以自己选择嘛? 现在存放的文件夹是固定的 boxing,在项目中不易统一管理。

3.相册页面滑动时:CloseableReference: Finalized without closing: 187a0660 28262719 (type = CloseableStaticBitmap)这个警告会不停的出现。

4.多选时,缩略图右上角的选中按钮 点击范围太小,不容易点击。

项目中有很多借鉴的东西,反馈建议只是想让此开源项目更好的让新手开发者使用。期待作者的回复。

小米5s 多选闪退

小米5s运行demo,多选图片时闪退.6.0.1 miui8 7.3.16开发版

AndroidRuntime: java.lang.ClassCastException: com.facebook.imagepipeline.image.CloseableAnimatedImage cannot be castto com.facebook.imagepipeline.image.CloseableStaticBitmap at com.bilibili.boxing.impl.BoxingFrescoLoader$1.onNewResultImpl(BoxingFrescoLoader.java:115) at com.facebook.datasource.BaseDataSubscriber.onNewResult(BaseDataSubscriber.java:48) at com.facebook.datasource.AbstractDataSource$1.run(AbstractDataSource.java:181) at android.os.Handler.handleCallback(Handler.java:742) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:5486) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

Canvas: trying to use a recycled bitmap android.graphics.Bitmap

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@6d2f883
at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1301)
at android.graphics.Canvas.drawBitmap(Canvas.java:1435)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:551)
at android.widget.ImageView.onDraw(ImageView.java:1270)
at android.view.View.draw(View.java:17469)
at android.view.View.updateDisplayListIfDirty(View.java:16464)
at android.view.View.draw(View.java:17238)
at android.view.ViewGroup.drawChild(ViewGroup.java:3921)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711)
at android.view.View.draw(View.java:17472)
at android.view.View.updateDisplayListIfDirty(View.java:16464)
at android.view.View.draw(View.java:17238)
at android.view.ViewGroup.drawChild(ViewGroup.java:3921)
at android.support.v7.widget.RecyclerView.drawChild(RecyclerView.java:4248)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711)
at android.view.View.draw(View.java:17472)
at android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3657)
at android.view.View.updateDisplayListIfDirty(View.java:16464)
at android.view.View.draw(View.java:17238)
at android.view.ViewGroup.drawChild(ViewGroup.java:3921)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711)
at android.view.View.updateDisplayListIfDirty(View.java:16459)
at android.view.View.draw(View.java:17238)
at android.view.ViewGroup.drawChild(ViewGroup.java:3921)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711)
at android.view.View.draw(View.java:17472)
at android.view.View.updateDisplayListIfDirty(View.java:16464)
at android.view.View.draw(View.java:17238)
at android.view.ViewGroup.drawChild(ViewGroup.java:3921)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711)
at android.view.View.updateDisplayListIfDirty(View.java:16459)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:325)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:331)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:366)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3134)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2933)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2522)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
at android.view.Choreographer.doCallbacks(Choreographer.java:695)
at android.view.Choreographer.doFrame(Choreographer.java:631)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7237)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Crash in open BoxingViewActivity

Hey dude, thank you for the awesome repository!

I am going to use your Boxing in my project and unfortunately I got a crash. Please check out the following image and I am looking forward that you can offer some helps.

image

我把targetSdkVersion设置为23依然会崩溃

 compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "webapps.MOrangeCheck.com"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

compileSdkVersion选择了25,但是targetSdkVersion是23,按理来说应该以23的状态运行的,但是拍照时还是会崩溃

05-02 09:50:19.474 13528-13528/webapps.MOrangeCheck.com E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: webapps.MOrangeCheck.com, PID: 13528
                                                                          java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
                                                                              at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:583)
                                                                              at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:557)
                                                                              at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:399)
                                                                              at com.bilibili.boxing.utils.CameraPickerHelper.getFileUri(CameraPickerHelper.java:182)
                                                                              at com.bilibili.boxing.utils.CameraPickerHelper.startCameraIntent(CameraPickerHelper.java:165)
                                                                              at com.bilibili.boxing.utils.CameraPickerHelper.takePhotoSecure(CameraPickerHelper.java:128)
                                                                              at com.bilibili.boxing.utils.CameraPickerHelper.startCamera(CameraPickerHelper.java:97)
                                                                              at com.bilibili.boxing.AbsBoxingViewFragment.startCamera(AbsBoxingViewFragment.java:438)
                                                                              at com.bilibili.boxing_impl.ui.BoxingViewFragment$OnCameraClickListener.onClick(BoxingViewFragment.java:461)
                                                                              at android.view.View.performClick(View.java:5657)
                                                                              at android.view.View$PerformClick.run(View.java:22314)
                                                                              at android.os.Handler.handleCallback(Handler.java:751)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:241)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6217)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                                                                          
                                                                          
                                                                          --------- beginning of system

另外,如果按照7.0的配置去配置是可以正常拍照的,但是拍完会黑屏一段时间才回去原来的页面,比6.0的时候要慢

通过compile进行依赖会出现Manifest文件冲突

通过compile进行项目依赖的时候,会出现Manifest文件出现label名字冲突,必须要使用box_app_name才会编译通过,建议作者删除library包中的application节点,或者请给我一个能够解决这个问题的建议,谢谢。

关于图片存放目录的问题

1.选择自带压缩拍照后的图片是存2份?一份原图在DCIM文件夹,一份压缩后的在APP自己的catch目录?
2.如果不想放在DCIM的话可以选择不放吗?如何操作
3.想压缩得更小一些,即使模糊一点也行,在哪里调整压缩率

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.