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.