Música online de reconhecimento facial, um aplicativo imaturo para Android desenvolvido por mim

Música online de reconhecimento facial, um aplicativo imaturo para Android desenvolvido por mim

[Declaração]
Bem-vindo à reimpressão, mas por favor, mantenha a fonte original do artigo

O primeiro blog, peço desculpas
por anexar o mapa final acabado, embora algumas funções não sejam muito maduras

Reconhecimento facial

A primeira é a função de reconhecimento de rosto. Agora, muitas empresas fizeram esse recurso para os desenvolvedores escolherem. Estou usando a tecnologia de reconhecimento de rosto do Face ++, mas agora só posso enviar fotos ligando para a câmera do sistema para tirar fotos. Analise a imagem para obter informações sobre o rosto. Você não pode obter e analisar diretamente o rosto enquanto visualiza a câmera.
Este é o site oficial do Developer Center of Face ++, você pode consultar o documento API
http://www.faceplusplus.com.cn/uc_home/
Este é o código para análise facial

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case PARSE_OK:

                    JSONObject rs = (JSONObject) msg.obj;
                    parseInfo(rs);
                    Log.i("MyTest", "---age-->" + age + "-----gender--" + gender + "----smiling--" + smiling);
                    emotionInfo.setVisibility(View.VISIBLE);
                    find_btn_submit.setVisibility(View.GONE);
                    emotionInfo.setText("检测结果如下:\n年龄:" + age + "\n性别:" + gender + "\n笑脸值:" + smiling);
                    noCamera.clearAnimation();
                    tips.clearAnimation();
                    tips.setText("下拉开启音乐之旅");
                    break;
                case PARSE_ERRO:
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(FindMusicActivity.this, "请检查网络连接", Toast.LENGTH_SHORT).show();
                            tips.clearAnimation();
                            tips.setText("当前网络状况出了点问题,检查一下再来吧~\n下拉随机推荐音乐");
                            noCamera.clearAnimation();
                            noCamera.setImageResource(R.mipmap.get_face_fail);
                        }
                    });
                    break;
            }
        }


    };

    /**
     * 解析心情
     */
    private void parseInfo(JSONObject obj) {
        try {
            JSONArray faces = obj.getJSONArray("face");
            int faceCounts = faces.length();
            if (faceCounts == 0) {
                Toast.makeText(FindMusicActivity.this, "不好意思,没有检测出来,请重新检测", Toast.LENGTH_SHORT).show();
                tips.clearAnimation();
                tips.setText("不好意思,没有检测出来,请长按重新检测");
                noCamera.clearAnimation();
                noCamera.setImageResource(R.mipmap.get_face_fail);
                smiling=50;
            } else {
                JSONObject face = faces.getJSONObject(0);
                String sex = face.getJSONObject("attribute").getJSONObject("gender").getString("value");
                gender = "Male".equals(sex) ? "男" : "女";
                age = face.getJSONObject("attribute").getJSONObject("age").getInt("value");
                smiling = face.getJSONObject("attribute").getJSONObject("smiling").getDouble("value");
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

Tocar música online

O problema de tocar música tem sido uma dor de cabeça para mim há muito tempo e não consigo encontrar a interface. Muitas interfaces encontradas na Internet dizem que podem ser usadas, mas não podem analisar os dados. No final, ainda não encontrei uma boa interface, então só posso obtê-la diretamente da Internet. os links de 70 músicas armazenados na classe e, em seguida, carrega e reproduz música do endereço
de rede do link de músicas da forma: http://m.blog.csdn.net/blog/gikieng_tjsd/38750971
músicas para tocar Eu realmente escrevi a um amigo , Este processo também tem vários problemas, especialmente o problema do serviço.É sempre impossível obter o serviço, ou o serviço não pode ser cancelado, a música não pode ser interrompida e não está perfeito até agora. Este é um problema que permanece.

Outras funções

Barra Lateral

A barra deslizante lateral usa o DrawLayout do pacote Android v4. Não devo mencionar o uso do DrawLayout. Acredito que todos sabem disso. O principal é prestar atenção na posição onde ele aparece, caso contrário, um erro será reportado.

gesto

Existem muitos gestos usados ​​nele, como deslizar para cima, para baixo, pressionar longamente, etc., que podem ser implementados com a classe Gesture. Eu não usei isso aqui. Usei a interface View.OnTouchListener e, em seguida, no método OnTouch (), o dedo está na tela. Toque para fazer um julgamento. De acordo com as diferentes coordenadas e timestamps ao pressionar e levantar, julgue qual operação é feita, mas esse julgamento não é muito preciso e não é recomendado.

Barra de progresso circular

Esta é uma barra de progresso circular customizada, é um código de referência para encontrar online
que podemos consultar

package com.sdf.DefineView;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

import com.sdf.facemusic.R;

/**
 * Created by Administrator on 15-11-5.
 */
public class RoundProgressBar extends View
{
    
    
    // 画笔对象的引用
    private Paint paint;

    // 圆环的颜色
    private int roundColor;

    // 圆环进度的颜色

    private int roundProgressColor;

    // 中间进度百分比的字符串的颜色
    // private int textColor;

    // 中间进度百分比的字符串的字体
    // private float textSize;

    // 圆环的宽度
    private float roundWidth;

    // 最大进度
    private int max;

    // 当前进度
    private int progress;

    // 是否显示中间的进度
    //private boolean textIsDisplayable;

    // 进度的风格,实心或者空心
    private int style;

    public static final int STROKE = 0;
    public static final int FILL = 1;

    public RoundProgressBar(Context context) {
        this(context, null);
    }

    public RoundProgressBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RoundProgressBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        paint = new Paint();

        TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar);

        // 获取自定义属性和默认值
        roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.WHITE);
        roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);
        roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 5);
        max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);
        style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);
        //回收mTypedArray
        mTypedArray.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 画最外层的大圆环
        int centre = getWidth() / 2; // 获取圆心的x坐标
        int radius = (int) (centre - roundWidth / 2); // 圆环的半径
        paint.setColor(roundColor); // 设置圆环的颜色
        paint.setStyle(Paint.Style.STROKE); // 设置空心
        paint.setStrokeWidth(roundWidth); // 设置圆环的宽度
        paint.setAntiAlias(true); // 消除锯齿
        canvas.drawCircle(centre, centre, radius, paint); // 画出圆环


        // 画圆弧 ,画圆环的进度
        // 设置进度是实心还是空心
        paint.setStrokeWidth(roundWidth); // 设置圆环的宽度
        paint.setColor(roundProgressColor); // 设置进度的颜色
        RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); // 用于定义的圆弧的形状和大小的界限

        switch (style) {
            case STROKE: {
                paint.setStyle(Paint.Style.STROKE);
                canvas.drawArc(oval, 0, 360 * progress / max, false, paint); // 根据进度画圆弧
                break;
            }
            case FILL: {
                paint.setStyle(Paint.Style.FILL_AND_STROKE);
                if (progress != 0)
                    canvas.drawArc(oval, 0, 360 * progress / max, true, paint); // 根据进度画圆弧
                break;
            }
        }

    }

    public synchronized int getMax() {
        return max;
    }

    /**
     * 设置进度的最大值
     *
     * @param max
     */
    public synchronized void setMax(int max) {
        if (max < 0) {
            throw new IllegalArgumentException("max not less than 0");
        }
        this.max = max;
    }

    /**
     * 获取进度.需要同步
     *
     * @return
     */
    public synchronized int getProgress() {
        return progress;
    }

    /**
     * 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步 刷新界面调用postInvalidate()能在非UI线程刷新
     *
     * @param progress
     */
    public synchronized void setProgress(int progress) {
        if (progress < 0) {
            throw new IllegalArgumentException("progress not less than 0");
        }
        if (progress > max) {
            progress = max;
        }
        if (progress <= max) {
            this.progress = progress;
            postInvalidate();
        }

    }

    public int getCricleColor() {
        return roundColor;
    }

    public void setCricleColor(int cricleColor) {
        this.roundColor = cricleColor;
    }

    public int getCricleProgressColor() {
        return roundProgressColor;
    }

    public void setCricleProgressColor(int cricleProgressColor) {
        this.roundProgressColor = cricleProgressColor;
    }


    public float getRoundWidth() {
        return roundWidth;
    }

    public void setRoundWidth(float roundWidth) {
        this.roundWidth = roundWidth;
    }

}

Login de terceiros e função de compartilhamento

O terceiro usa ShareSDK, acredito que usei como desenvolvedor. Quando estava trabalhando neste projeto, por ser a primeira vez que desenvolvia com o Android Studio, não sabia como adicioná-lo. Mais tarde, encontrei um amigo na Internet para um tutorial muito detalhado. Você pode consultar
http: //www.cnblogs. com / smyhvae / p / 4585340.html

A essa altura, provavelmente a função do projeto já está concluída.A primeira vez que escrevo um blog pode estar confuso, me perdoe.

Acho que você gosta

Origin blog.csdn.net/lizebin_bin/article/details/49716569
Recomendado
Clasificación