2

Hello I've this app that save an image for everytime my face move something similar to the IG stories my problem is that the cellphone get very slow and the app close suddenly because of allocation memory problems I want to know how i can do this without slowing down the cellphone and dont receive the error of closing.

The next code open the svg:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static Bitmap getBitmap(VectorDrawable vectorDrawable) {
    Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
            vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    vectorDrawable.draw(canvas);
    Log.e("", "getBitmap: 1");
    return bitmap;
}

private static Bitmap getBitmap(Context context, int drawableId) {
    Log.e("", "getBitmap: 2");
    Drawable drawable = ContextCompat.getDrawable(context, drawableId);
    if (drawable instanceof BitmapDrawable) {
        return BitmapFactory.decodeResource(context.getResources(), drawableId);
    } else if (drawable instanceof VectorDrawable) {
        return getBitmap((VectorDrawable) drawable);
    } else {
        throw new IllegalArgumentException("unsupported drawable type");
    }
}

The next one draw the svg below the position of the face.

    /**
     * Draws the face annotations for position on the supplied canvas.
     */
    @Override
    public void draw(Canvas canvas) {
        Face face = mFace;
        if (face == null) {
            return;
        }

        // Draws a circle at the position of the detected face, with the face's track id below.
        float x = translateX(face.getPosition().x + face.getWidth() / 2);
        float y = translateY(face.getPosition().y + face.getHeight() / 2);
        canvas.drawCircle(x, y, FACE_POSITION_RADIUS, mFacePositionPaint);
        canvas.drawText("id: " + mFaceId, x + ID_X_OFFSET, y + ID_Y_OFFSET, mIdPaint);
        canvas.drawText("happiness: " + String.format("%.2f", face.getIsSmilingProbability()), x - ID_X_OFFSET, y - ID_Y_OFFSET, mIdPaint);
        canvas.drawText("right eye: " + String.format("%.2f", face.getIsRightEyeOpenProbability()), x + ID_X_OFFSET * 2, y + ID_Y_OFFSET * 2, mIdPaint);
        canvas.drawText("left eye: " + String.format("%.2f", face.getIsLeftEyeOpenProbability()), x - ID_X_OFFSET*2, y - ID_Y_OFFSET*2, mIdPaint);

        // Draws a bounding box around the face.
        float xOffset = scaleX(face.getWidth() / 2.0f);
        float yOffset = scaleY(face.getHeight() / 2.0f);
        float left = x - xOffset;
        float top = y - yOffset;
        float right = x + xOffset;
        float bottom = y + yOffset;
        //bitmap = BitmapFactory.decodeResource(getOverlay().getContext().getResources(), R.drawable.ic_shirt);

        bitmap = getBitmap(getOverlay().getContext(), R.drawable.ic_tshirt);
        float eyeX = left-400;
//        for(Landmark l : face.getLandmarks()){
//            if(l.getType() == Landmark.LEFT_EYE){
//                eyeX = l.getPosition().x + bitmap.getWidth() / 2;
//            }
//        }

        tshirt = Bitmap.createScaledBitmap(bitmap, (int) scaleX(bitmap.getWidth() / 2),
                (int) scaleY(bitmap.getHeight()/2), false);
        float top_shirt=(face.getPosition().y + face.getHeight())+200;
        canvas.drawBitmap(tshirt, eyeX, top_shirt, new Paint());


        Canvas myCanvas = new Canvas(tshirt);
        myCanvas.drawBitmap(tshirt, eyeX, top_shirt, new Paint());
        HashMap<String, Object> args = new HashMap<>();
    args.put("tshirt", tshirt);
    new saveImg(args).execute();
        //canvas.drawRect(left, top, right, bottom, mBoxPaint);
    }

This one save the image on the cellphone.

    package com.google.android.gms.samples.vision.face.facetracker;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Environment;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by diegohidalgo on 10/12/17.
 */

public class saveImg extends AsyncTask<Void, Void, Void> {
    Bitmap tshirt;
    String name;
    saveImg(HashMap<String, Object> args){
        tshirt = (Bitmap)args.get("tshirt");
        File file=new File(Environment.getExternalStorageDirectory() + "/facedetection/");
        File[] list = file.listFiles();
        int count = 0;
        for (File f: list){
            String name = f.getName();
            if (name.endsWith(".png"))
                count++;

        }
        name="img"+count+".png";
    }

    @Override
    protected Void doInBackground(Void... args) {
        File file = new File(Environment.getExternalStorageDirectory() + "/facedetection/"+ name);

        try {
            tshirt.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(file));
        } catch (Exception e) {
            e.printStackTrace();

        }
        System.gc();
        tshirt.recycle();
        tshirt= null;
        return null;
    }

    protected void onPostExecute() {

    }
}

This is the mistake that give me before close the app.

10-13 10:38:17.526 8443-8443/com.google.android.gms.samples.vision.face.facetracker W/art: Throwing OutOfMemoryError "Failed to allocate a 8916492 byte allocation with 1111888 free bytes and 1085KB until OOM" 10-13 10:38:18.020 8443-8443/com.google.android.gms.samples.vision.face.facetracker I/Process: Sending signal. PID: 8443 SIG: 9

thanks in advance.

hidura
  • 681
  • 3
  • 11
  • 36
  • Do you face this app closing problem in any specific device or is it general issue ? – SweetWisher ツ Oct 13 '17 at 13:12
  • Yes @SweetWisherツ, I edited the code to show the error when the app is closed. – hidura Oct 13 '17 at 15:50
  • Does your stack trace point to some specific line of your code? Like, createBitmap()? – Alex Cohn Oct 14 '17 at 12:37
  • No, but i solve that issue thanks! The solution of the code is to collect the position of the image on a variable created in the main activity and the used at the end of the animation. – hidura Oct 14 '17 at 13:59

0 Answers0