При использовании моего приложения для Android все работает нормально, но как только я получаю входящее уведомление (из других приложений), мое приложение просто перезапускается.
Это происходит только тогда, когда у меня активна камера и в течение этого времени я также рисую на холсте.
Как я понял, невозможно отключить уведомления во время определенных процессов (например, запись), поэтому мне нужно как-то это исправить, но я получаю только следующее сообщение об ошибке:
--------- beginning of crash
2019-01-23 23:33:59.712 7469-7469/com.myApp.com E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myApp.com, PID: 7469
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@cafcfb0
at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1271)
at android.graphics.Canvas.drawBitmap(Canvas.java:1368)
at android.graphics.Bitmap.createBitmap(Bitmap.java:973)
at com.author.myApp.Songplayer.Managers.CanvasDraw.getResizedBitmap(CanvasDraw.java:53)
at com.author.myApp.Songplayer.Managers.CanvasDraw.onDraw(CanvasDraw.java:38)
at android.view.View.draw(View.java:17236)
at android.view.View.updateDisplayListIfDirty(View.java:16201)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1254)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16196)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16196)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16196)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.draw(View.java:17239)
at android.view.View.updateDisplayListIfDirty(View.java:16201)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.draw(View.java:17239)
at android.view.View.updateDisplayListIfDirty(View.java:16201)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16196)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16196)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16196)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.updateDisplayListIfDirty(View.java:16196)
at android.view.View.draw(View.java:17002)
at android.view.ViewGroup.drawChild(ViewGroup.java:3777)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3560)
at android.view.View.draw(View.java:17239)
at com.android.internal.policy.DecorView.draw(DecorView.java:801)
at android.view.View.updateDisplayListIfDirty(View.java:16201)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:677)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:683)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:797)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2991)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2785)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2376)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1366)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6768)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:926)
at android.view.Choreographer.doCallbacks(Choreographer.java:735)
at android.view.Choreographer.doFrame(Choreographer.java:667)
2019-01-23 23:33:59.712 7469-7469/com.myApp.com E/AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:912)
at android.os.Handler.handleCallback(Handler.java:761)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
2019-01-23 23:33:59.742 542-8728/? I/ImagingSystem: virtual TRetCode hw::CIMX219Spec::getOTPTestResult(): OTP module_id=0xc8,vendor_id=0x31,checksum=0x1
2019-01-23 23:33:59.746 542-8714/? I/ProjectName: Tornado: mrc_cv_ColorSaturationDetectionTOA:UISaturationLevel:0,saturationCompValid:0,outPutSaturationComp:256.
2019-01-23 23:33:59.775 542-8728/? I/ImagingSystem: virtual TRetCode hw::CIMX219Spec::getOTPTestResult(): OTP module_id=0xc8,vendor_id=0x31,checksum=0x1
2019-01-23 23:33:59.779 542-8714/? I/ProjectName: Tornado: mrc_cv_ColorSaturationDetectionTOA:UISaturationLevel:0,saturationCompValid:0,outPutSaturationComp:256.
2019-01-23 23:33:59.802 1218-4278/? E/ReportTools: This is not beta user build
Что в принципе мне ничего не говорит ... только то, что он не смог найти холст после уведомления.
Я не уверен, что мне следует делать. Когда я проверял, как камера Android делает это, они отключают звук и вибрацию, так что, может быть, это поможет мне? Если да, то я довольно долго искал, но не нашел способа отключить вибрацию / звук других уведомлений.
EDIT
Добавление класса onDraw
:
public class CanvasDraw extends View{
Bitmap voiceMeterChart;
Paint linePaint = new Paint();
public CanvasDraw(Context context) {
super(context);
voiceMeterChart = BitmapFactory.decodeResource(getResources(), R.drawable.voice_chart_meter);
voiceMeterChart = adjustOpacity(voiceMeterChart, 125);
linePaint.setColor(Color.RED);
linePaint.setStrokeWidth(1);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int canvasWidth = canvas.getWidth();
int canvasHeight = canvas.getHeight();
canvas.drawBitmap(getResizedBitmap(voiceMeterChart, (canvasWidth * 0.1), canvasHeight, canvasWidth), 25, 0, null);
}
public Bitmap getResizedBitmap(Bitmap bm, double newWidth, int newHeight, int canvasWidth) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(
bm, 0, 0, width, height, matrix, false);
bm.recycle();
return resizedBitmap;
}
private Bitmap adjustOpacity(Bitmap bitmap, int opacity)
{
Bitmap mutableBitmap = bitmap.isMutable()
? bitmap
: bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
int colour = (opacity & 0xFF) << 24;
canvas.drawColor(colour, PorterDuff.Mode.DST_IN);
return mutableBitmap;
}
}
И в журнале видно, что он вылетает на этой строке:
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);