问题
When I try to use Custom Keyboard got an exception on Android P Beta, everything is working fine until Android Oreo but recently got a crash. Just try to figure out which class might be responsible for the exception. Currently unable to access complete custom keyboard code so not posting the code.
java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed
at android.graphics.Canvas.checkValidClipOp(Canvas.java:779)
at android.graphics.Canvas.clipRect(Canvas.java:826)
at android.inputmethodservice.KeyboardView.onBufferDraw(KeyboardView.java:666)
at android.inputmethodservice.KeyboardView.onDraw(KeyboardView.java:647)
at android.view.View.draw(View.java:20205)
at android.view.View.updateDisplayListIfDirty(View.java:19080)
at android.view.View.draw(View.java:19933)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.draw(View.java:20208)
at android.view.View.updateDisplayListIfDirty(View.java:19080)
at android.view.View.draw(View.java:19933)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19071)
at android.view.View.draw(View.java:19933)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19071)
at android.view.View.draw(View.java:19933)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19071)
at android.view.View.draw(View.java:19933)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19071)
at android.view.View.draw(View.java:19933)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.draw(View.java:20208)
at com.android.internal.policy.DecorView.draw(DecorView.java:784)
at android.view.View.updateDisplayListIfDirty(View.java:19080)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:685)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:691)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:799)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3259)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3075)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2455)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1443)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7125)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:935)
at android.view.Choreographer.doCallbacks(Choreographer.java:747)
at android.view.Choreographer.doFrame(Choreographer.java:682)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:921)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6649)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
回答1:
It actually tells you the reason:
only INTERSECT and DIFFERENCE are allowed
The reason is written here:
This method was deprecated in API level 26. Region.Op values other than INTERSECT and DIFFERENCE have the ability to expand the clip. The canvas clipping APIs are intended to only expand the clip as a result of a restore operation. This enables a view parent to clip a canvas to clearly define the maximal drawing area of its children. The recommended alternative calls are clipRect(RectF) and clipOutRect(RectF); As of API Level API level Build.VERSION_CODES.P only INTERSECT and DIFFERENCE are valid Region.Op parameters.
So you either have to use lower targetSdk version (which you shouldn't, because Google will force you to use at least 26 it by the end of the year), or you fix it by using your clipping via the canvas in a different way.
I've asked a question about it here, of what's the alternative.
回答2:
you just need to remove this line :
.setCropShape(CropImageView.CropShape.OVAL)
来源:https://stackoverflow.com/questions/50371334/custom-keyboard-not-working-on-android-p-beta