android 调用微信语音识别,Android 仿微信语音识别

参考于:Android模仿微信语音聊天功能,这代码跑起来有问题,自己改动了一下,基本上没什么大问题

先贴下效果图

214654_0.png

214654_1.png

214654_2.png

1、三个布局文件

activity_main.xml

dialog_manger.xml

item_layout

2.自定义的类

(1)DialogManger

package com.nickming.view;

import com.example.weixin_record.R;

import android.app.Dialog;

import android.content.Context;

import android.graphics.drawable.AnimationDrawable;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.ImageView;

import android.widget.TextView;

/**

*

* @ClassName: DialogManager

* @Description:对话框管理类

* @author: 张 维

* @date: 2016-5-23 下午4:56:03

*

*/

public class DialogManager {

/**

* 以下为dialog的初始化控件,包括其中的布局文件

*/

private Dialog mDialog;

private ImageView mIcon;

private ImageView mVoice;

private TextView mLable;

private Context mContext;

public DialogManager(Context context) {

mContext = context;

}

public void showRecordingDialog() {

mDialog = new Dialog(mContext,R.style.Theme_audioDialog);

// 用layoutinflater来引用布局

LayoutInflater inflater = LayoutInflater.from(mContext);

View view = inflater.inflate(R.layout.dialog_manager, null);

mDialog.setContentView(view);

mIcon = (ImageView) mDialog.findViewById(R.id.dialog_icon);

mVoice = (ImageView) mDialog.findViewById(R.id.dialog_voice);

mVoice.setBackgroundResource(R.drawable.play02);

AnimationDrawable drawable = (AnimationDrawable) mVoice

.getBackground();

drawable.start();

mLable = (TextView) mDialog.findViewById(R.id.recorder_dialogtext);

mDialog.show();

}

/**

* 设置正在录音时的dialog界面

*/

public void recording() {

if (mDialog != null && mDialog.isShowing()) {

mIcon.setVisibility(View.VISIBLE);

mVoice.setVisibility(View.VISIBLE);

mLable.setVisibility(View.VISIBLE);

mIcon.setImageResource(R.drawable.recorder);

mLable.setText(R.string.shouzhishanghua);

}

}

/**

* 取消界面

*/

public void wantToCancel() {

// TODO Auto-generated method stub

if (mDialog != null && mDialog.isShowing()) {

mIcon.setVisibility(View.VISIBLE);

mVoice.setVisibility(View.GONE);

mLable.setVisibility(View.VISIBLE);

mIcon.setImageResource(R.drawable.cancel);

mLable.setText(R.string.want_to_cancle);

}

}

// 时间过短

public void timeShort() {

// TODO Auto-generated method stub

if (mDialog != null && mDialog.isShowing()) {

mIcon.setVisibility(View.VISIBLE);

mVoice.setVisibility(View.GONE);

mLable.setVisibility(View.VISIBLE);

mIcon.setImageResource(R.drawable.voice_to_short);

mLable.setText(R.string.timeshort);

}

}

// 隐藏dialog

public void dimissDialog() {

// TODO Auto-generated method stub

if (mDialog != null && mDialog.isShowing()) {

mDialog.dismiss();

mDialog = null;

}

}

public void updateVoiceLevel(int level) {

// TODO Auto-generated method stub

if (mDialog != null && mDialog.isShowing()) {

//先不改变它的默认状态

//mIcon.setVisibility(View.VISIBLE);

//mVoice.setVisibility(View.VISIBLE);

//mLable.setVisibility(View.VISIBLE);

//通过level来找到图片的id,也可以用switch来寻址,但是代码可能会比较长

int resId = mContext.getResources().getIdentifier("v" + level,

"drawable", mContext.getPackageName());

mVoice.setImageResource(resId);

}

}

}

(2)AudioRecordButton

package com.nickming.view;

import com.example.weixin_record.R;

import com.example.weixin_record.R.string;

import com.nickming.view.AudioManager.AudioStageListener;

import android.R.bool;

import android.content.Context;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.Button;

/**

*

* @ClassName: AudioRecordButton

* @Description:自定义的button按钮

* @author: 张 维

* @date: 2016-5-23 下午2:13:20

*

*/

public class AudioRecordButton extends Button implements AudioStageListener {

private static final int STATE_NORMAL = 1;

private static final int STATE_RECORDING = 2;

private static final int STATE_WANT_TO_CANCEL = 3;

private static final int DISTANCE_Y_CANCEL = 50;

private int mCurrentState = STATE_NORMAL;

// 已经开始录音

private boolean isRecording = false;

private DialogManager mDialogManager;

private AudioManager mAudioManager;

private float mTime = 0;

// 是否触发了onlongclick,准备好了

private boolean mReady;

/**

* 先实现两个参数的构造方法,布局会默认引用这个构造方法,

* 用一个 构造参数的构造方法来引用这个方法 * @param context

*/

public AudioRecordButton(Context context) {

this(context, null);

// TODO Auto-generated constructor stub

}

public AudioRecordButton(Context context, AttributeSet attrs) {

super(context, attrs);

mDialogManager = new DialogManager(getContext());

// 这里没有判断储存卡是否存在,有空要判断

String dir = Environment.getExternalStorageDirectory()

+ "/temp";

mAudioManager = AudioManager.getInstance(dir);

mAudioManager.setOnAudioStageListener(this);

setOnLongClickListener(new OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

// TODO Auto-generated method

mReady = true;

mAudioManager.prepareAudio();

return false;

}

});

}

/**

* 录音完成后的回调,回调给activiy,可以获得mtime和文件的路径

* @author nickming

*

*/

public interface AudioFinishRecorderListener{

void onFinished(float mtime,String filePath);

}

private AudioFinishRecorderListener mListener;

public void setAudioFinishRecorderListener(AudioFinishRecorderListener listener)

{

mListener=listener;

}

// 获取音量大小的runnable

private Runnable mGetVoiceLevelRunnable = new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

while (isRecording) {

try {

Thread.sleep(100);

mTime += 0.1f;

mhandler.sendEmptyMessage(MSG_VOICE_CHANGE);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

};

// 准备三个常量

private static final int MSG_AUDIO_PREPARED = 0X110;

private static final int MSG_VOICE_CHANGE = 0X111;

private static final int MSG_DIALOG_DIMISS = 0X112;

private Handler mhandler = new Handler() {

public void handleMessage(android.os.Message msg) {

switch (msg.what) {

case MSG_AUDIO_PREPARED:

// 显示应该是在audio end prepare之后回调

mDialogManager.showRecordingDialog();

isRecording = true;

new Thread(mGetVoiceLevelRunnable).start();

// 需要开启一个线程来变换音量

break;

case MSG_VOICE_CHANGE:

mDialogManager.updateVoiceLevel(mAudioManager.getVoiceLevel(7));

break;

case MSG_DIALOG_DIMISS:

break;

}

};

};

// 在这里面发送一个handler的消息

@Override

public void wellPrepared() {

// TODO Auto-generated method stub

mhandler.sendEmptyMessage(MSG_AUDIO_PREPARED);

}

/**

* 直接复写这个监听函数

*/

@Override

public boolean onTouchEvent(MotionEvent event) {

// TODO Auto-generated method stub

int action = event.getAction();

int x = (int) event.getX();

int y = (int) event.getY();

switch (action) {

case MotionEvent.ACTION_DOWN://表示用户开始触摸.

changeState(STATE_RECORDING);

break;

case MotionEvent.ACTION_MOVE://表示用户在移动(手指或者其他)

if (isRecording) {

// 根据x,y来判断用户是否想要取消

if (wantToCancel(x, y)) {

changeState(STATE_WANT_TO_CANCEL);

} else {

changeState(STATE_RECORDING);

}

}

break;

case MotionEvent.ACTION_UP://表示用户抬起了手指

// 首先判断是否有触发onlongclick事件,没有的话直接返回reset

if (!mReady) {

reset();

return super.onTouchEvent(event);

}

// 如果按的时间太短,还没准备好或者时间录制太短,就离开了,则显示这个dialog

if (!isRecording || mTime < 0.6f) {

mDialogManager.timeShort();//取消对话框

mAudioManager.cancel();

mhandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMISS, 1300);// 持续1.3s

} else if (mCurrentState == STATE_RECORDING) {//正常录制结束

mDialogManager.dimissDialog();

mAudioManager.release();// release释放一个mediarecorder

if (mListener!=null) {// 并且callbackActivity,保存录音

mListener.onFinished(mTime, mAudioManager.getCurrentFilePath());

}

} else if (mCurrentState == STATE_WANT_TO_CANCEL) {

// cancel

mAudioManager.cancel();

mDialogManager.dimissDialog();

}

reset();// 恢复标志位

break;

}

return super.onTouchEvent(event);

}

/**

* 回复标志位以及状态

*/

private void reset() {

// TODO Auto-generated method stub

isRecording = false;

changeState(STATE_NORMAL);

mReady = false;

mTime = 0;

}

private boolean wantToCancel(int x, int y) {

// 超过按钮的宽度

if (x < 0 || x > getWidth()) {// 判断是否在左边,右边,上边,下边

return true;

}

// 超过按钮的高度

if (y < -DISTANCE_Y_CANCEL || y > getHeight() + DISTANCE_Y_CANCEL) {

return true;

}

return false;

}

private void changeState(int state) {

if (mCurrentState != state) {

mCurrentState = state;

switch (mCurrentState) {

case STATE_NORMAL:

setBackgroundResource(R.drawable.button_recordnormal);

setText(R.string.normal);

break;

case STATE_RECORDING:

setBackgroundResource(R.drawable.button_recording);

setText(R.string.recording);

if (isRecording) {

mDialogManager.recording();

// 复写dialog.recording();

}

break;

case STATE_WANT_TO_CANCEL:

setBackgroundResource(R.drawable.button_recording);

setText(R.string.want_to_cancle);

// 取消

mDialogManager.wantToCancel();

break;

}

}

}

@Override

public boolean onPreDraw() {

return false;

}

}

(3)MediaRecorder

package com.nickming.view;

import java.io.File;

import java.io.IOException;

import java.util.UUID;

import android.media.MediaRecorder;

/**

*

* @ClassName: AudioManager

* @Description: 录音的管理类(准备工作)

* @author: 张 维

* @date: 2016-5-23 下午2:10:35

*

*/

public class AudioManager {

private MediaRecorder mRecorder;

private String mDirString;

private String mCurrentFilePath;

private boolean isPrepared;// 是否准备好了

/**

* 单例化的方法

* 1 先声明一个static 类型的变量a

* 2 在声明默认的构造函数

* 3 再用public synchronized static

* 类名 getInstance() { if(a==null) { a=new 类();} return a; } 或者用以下的方法

*/

/**

* 单例化这个类

*/

private static AudioManager mInstance;

private AudioManager(String dir) {

mDirString=dir;

}

public static AudioManager getInstance(String dir) {

if (mInstance == null) {

synchronized (AudioManager.class) {

if (mInstance == null) {

mInstance = new AudioManager(dir);

}

}

}

return mInstance;

}

/**

* 回调函数,准备完毕,准备好后,button才会开始显示录音框

*

* @author nickming

*

*/

public interface AudioStageListener {

void wellPrepared();

}

public AudioStageListener mListener;

public void setOnAudioStageListener(AudioStageListener listener) {

mListener = listener;

}

// 准备方法

public void prepareAudio() {

try {

// 一开始应该是false的

isPrepared = false;

File dir = new File(mDirString);

//判断对象file是否存在

if (!dir.exists()) {

//创建此抽象路径指定的目录,包括所有必须但不存在的父目录。(及可以创建多级目录,无论是否存在父目录)

dir.mkdirs();

}

String fileNameString = generalFileName();

File file = new File(dir, fileNameString);

mCurrentFilePath = file.getAbsolutePath();

mRecorder = new MediaRecorder();

// 设置输出文件

mRecorder.setOutputFile(file.getAbsolutePath());

// 设置meidaRecorder的音频源是麦克风

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

// 设置文件音频的输出格式为amr

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);

// 设置音频的编码格式为amr

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

// 严格遵守google官方api给出的mediaRecorder的状态流程图

mRecorder.prepare();

mRecorder.start();

// 准备结束

isPrepared = true;

// 已经准备好了,可以录制了

if (mListener != null) {

mListener.wellPrepared();

}

} catch (IllegalStateException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 随机生成文件的名称

*

* @return

*/

private String generalFileName() {

//UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。

return UUID.randomUUID().toString() + ".amr";

}

// 获得声音的大小

public int getVoiceLevel(int maxLevel) {

// mRecorder.getMaxAmplitude()这个是音频的振幅范围,值域是1-32767

if (isPrepared) {

try {

// 取证+1,否则去不到7

return maxLevel * mRecorder.getMaxAmplitude() / 32768 + 1;

} catch (Exception e) {

}

}

return 1;

}

// 释放资源

public void release() {

// 严格按照api流程进行

mRecorder.stop();

mRecorder.release();

mRecorder = null;

}

// 取消,因为prepare时产生了一个文件,所以cancel方法应该要删除这个文件,

// 这是与release的方法的区别

public void cancel() {

release();

if (mCurrentFilePath != null) {

File file = new File(mCurrentFilePath);

file.delete();//删除文件

mCurrentFilePath = null;

}

}

public String getCurrentFilePath() {

return mCurrentFilePath;

}

}

3.调用的类

(1)RecorderAdapter

package com.example.weixin_record;

import java.util.List;

import com.example.weixin_record.MainActivity.Recorder;

import android.content.Context;

import android.util.DisplayMetrics;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.ArrayAdapter;

import android.widget.TextView;

/**

*

* @ClassName: RecorderAdapter

* @Description:list的适配器

* @author: 张 维

* @date: 2016-5-23 下午4:04:02

*

*/

public class RecorderAdapter extends ArrayAdapter {

private LayoutInflater inflater;

private int mMinItemWith;// 设置对话框的最大宽度和最小宽度

private int mMaxItemWith;

public RecorderAdapter(Context context, List dataList) {

super(context, -1, dataList);

inflater = LayoutInflater.from(context);

// 获取系统宽度

WindowManager wManager = (WindowManager) context

.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics outMetrics = new DisplayMetrics();

wManager.getDefaultDisplay().getMetrics(outMetrics);

mMaxItemWith = (int) (outMetrics.widthPixels * 0.7f);

mMinItemWith = (int) (outMetrics.widthPixels * 0.15f);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder = null;

if (convertView == null) {

convertView = inflater.inflate(R.layout.item_layout, parent, false);

viewHolder=new ViewHolder();

viewHolder.seconds=(TextView) convertView.findViewById(R.id.recorder_time);

viewHolder.length=convertView.findViewById(R.id.recorder_length);

convertView.setTag(viewHolder);

}else {

viewHolder=(ViewHolder) convertView.getTag();

}

viewHolder.seconds.setText(Math.round(getItem(position).time)+""");

ViewGroup.LayoutParams lParams=viewHolder.length.getLayoutParams();

lParams.width=(int) (mMinItemWith+mMaxItemWith/60f*getItem(position).time);

viewHolder.length.setLayoutParams(lParams);

return convertView;

}

class ViewHolder {

TextView seconds;// 时间

View length;// 对话框长度

}

}

(2)MediaManager

package com.example.weixin_record;

import java.io.IOException;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

import android.media.MediaPlayer.OnErrorListener;

import android.util.Log;

/**

*

* @ClassName: MediaManager

* @Description:播放的管理类

* @author: 张 维

* @date: 2016-5-23 下午4:04:43

*

*/

public class MediaManager {

private static MediaPlayer mPlayer;

private static boolean isPause;

public static void playSound(String filePathString,

OnCompletionListener onCompletionListener) {

if (mPlayer==null) {

mPlayer=new MediaPlayer();

//保险起见,设置报错监听

mPlayer.setOnErrorListener(new OnErrorListener() {

@Override

public boolean onError(MediaPlayer mp, int what, int extra) {

Log.i("info", "");

mPlayer.reset();

return false;

}

});

}else {

mPlayer.reset();//就回复

}

try {

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mPlayer.setOnCompletionListener(onCompletionListener);

mPlayer.setDataSource(filePathString);

mPlayer.prepare();

mPlayer.start();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//停止函数

public static void pause(){

if (mPlayer!=null&&mPlayer.isPlaying()) {

mPlayer.pause();

isPause=true;

}

}

//继续

public static void resume()

{

if (mPlayer!=null&&isPause) {

mPlayer.start();

isPause=false;

}

}

public static void release()

{

if (mPlayer!=null) {

mPlayer.release();

mPlayer=null;

}

}

}

(3)MainActivity

package com.example.weixin_record;

import java.util.ArrayList;

import java.util.List;

import com.nickming.view.AudioRecordButton;

import com.nickming.view.AudioRecordButton.AudioFinishRecorderListener;

import android.app.Activity;

import android.graphics.drawable.AnimationDrawable;

import android.media.MediaPlayer;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class MainActivity extends Activity {

AudioRecordButton button;

private ListView mlistview;

private ArrayAdapter mAdapter;

private View viewanim;

private List mDatas = new ArrayList();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mlistview = (ListView) findViewById(R.id.listview);

button = (AudioRecordButton) findViewById(R.id.recordButton);

button.setAudioFinishRecorderListener(new AudioFinishRecorderListener() {

@Override

public void onFinished(float seconds, String filePath) {

// TODO Auto-generated method stub

Recorder recorder = new Recorder(seconds, filePath);

mDatas.add(recorder);

mAdapter.notifyDataSetChanged();

mlistview.setSelection(mDatas.size() - 1);

}

});

mAdapter = new RecorderAdapter(this, mDatas);

mlistview.setAdapter(mAdapter);

mlistview.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView parent, View view,

int position, long id) {

// 播放动画

if (viewanim!=null) {//让第二个播放的时候第一个停止播放

viewanim.setBackgroundResource(R.drawable.adj);

viewanim=null;

}

viewanim = view.findViewById(R.id.show_anim01);

viewanim.setBackgroundResource(R.drawable.play);

AnimationDrawable drawable = (AnimationDrawable) viewanim

.getBackground();

drawable.start();

// 播放音频

Log.i("info", "position==="+position);

MediaManager.playSound(mDatas.get(position).filePathString,

new MediaPlayer.OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

viewanim.setBackgroundResource(R.drawable.adj);

}

});

}

});

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

MediaManager.pause();

}

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

MediaManager.resume();

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

MediaManager.release();

}

class Recorder {

float time;

String filePathString;

public Recorder(float time, String filePathString) {

super();

this.time = time;

this.filePathString = filePathString;

}

public float getTime() {

return time;

}

public void setTime(float time) {

this.time = time;

}

public String getFilePathString() {

return filePathString;

}

public void setFilePathString(String filePathString) {

this.filePathString = filePathString;

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老罗android oat,入门ART虚拟机(5)——OAT文件

Android安全交流群&#xff1a;478084054先贴老罗的一张图&#xff1a;再摘一段老罗的描述&#xff1a;“作为Android私有的一种ELF文件&#xff0c;OAT文件包含有两个特殊的段oatdata和oatexec&#xff0c;前者包含有用来生成本地机器指令的dex文件内容&#xff0c;后者包含生…

Dajngo-Xadmin 修改菜单摆放排序

问题: Xadmin 默认是读取了所有被注册到 xadmin 的模型生成对应的菜单!这个是没问题的 ,但是xadmin又对菜单做了 "通过菜单名称" 排序.英文状态下我们的排列至少是 a-z排列的,但是一到中文就乱了,完全不符合我们的要求. 解决办法: 要到达按照我们 在 django 的 setti…

华为鸿蒙2.0什么核心,鸿蒙系统2.0:安卓最核心部分基本已去除,将带来全新的体验...

早些时候&#xff0c;华为在东莞举办的华为2020华为开发者大会如期召开&#xff0c;在大会上华为正式发布了鸿蒙系统2.0&#xff0c;并称将于明年应用到智能手机上&#xff0c;其中升级了EMUI 11的用户可以优先获得体验鸿蒙系统2.0的资格&#xff0c;瞬间将会议推向高潮。值得一…

Java 8:在2分钟内将智能流与数据库一起使用

快速流媒体 当Java 8最终问世时&#xff0c;我和一些大学开始了一个开源项目&#xff0c;以利用Java 8的流库使整个Java / DB问题进一步向前发展&#xff0c;以便将数据库表视为纯Java 8流。 速度诞生了&#xff01; 哇&#xff0c;现在我们可以做类型安全的数据库应用程序了&a…

MapReduce 详解

MapReduce的整个运行分为两个阶段&#xff1a; Map和Reduce Map阶段由一定数量的Map Task组成 输入格式的数据格式化&#xff1a;InputFormat 数日数据的处理:Mapper 数据分组&#xff1a;Partitioner 下面流程图&#xff1a; 1. Map task 首先从HDFS上Read文件&#xff0c;通过…

早期访问中具有NetBeans的Oracle公共云Java服务

谁期望发生这种情况&#xff1a;Oracle正在开发公共云产品&#xff0c;并且即将开始正式启动的迹象已经出现。 在正式宣布之后将近一年&#xff0c;我被邀请加入所谓的“抢先体验”计划&#xff0c;以试驾新服务并提供反馈。 多亏负责产品的经理Reza Shafii &#xff0c;我才可…

HTML5调整图像垂直边距,77.通过vspace和hspace属性可以分别调整图像的垂直边距和水平边距。()()...

具有东方建筑特色、&#xff0e;通图像规模宏大、气势雄伟的古代建筑群是( )属性水平完成规定的大作业分别Which of the following parks are the urban parks of New York?调整的垂Which of the following countries have once occupied New York city in the 17th century?…

Javac可以编译,Java显示找不到或无法加载主类

运行时候加入完整包名。转载于:https://www.cnblogs.com/theWinter/p/8594354.html

台式计算机欢迎界面下不去,Win7系统开机不显示欢迎界面的方法

现在办公人员做事情都讲究效率&#xff0c;甚至连电脑开机都不放过&#xff0c;win7系统加快开机速度的方法有很多种&#xff0c;开机不显示欢迎界面便是其中之一。有些用户觉得开机显示欢迎界面是非常浪费时间的一件事&#xff0c;想要删除电脑中的欢迎界面。但是很多电脑白不…

CompressedOops:Java压缩参考简介

在本文中&#xff0c;我们将向您介绍一种称为Compressed oops的JVM优化。 压缩oop的概念是由32位和64位体系结构之间的差异引起的。 因此&#xff0c;我们将对64位体系结构进行简短的回顾&#xff0c;然后再深入探讨压缩oop的主题。 最后&#xff0c;我们将通过一个简单的示例看…

NYOJ90 整数划分(经典递归和dp)

整数划分 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c; 其中n1≥n2≥…≥nk≥1&#xff0c;k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。…

昆士兰科技大学计算机专业,昆士兰科技大学QUT计算机科学Computer Science专业排名第101-125位(2021年THE世界大学商科排名)...

2021年THE泰晤士高等教育计算机科学Computer Science专业世界大学排名公布&#xff0c;昆士兰科技大学QUT计算机科学世界排名第101-125位&#xff0c;昆士兰科技大学QUT计算机科学专业实力怎么样呢&#xff1f;下面美英港新留学介绍昆士兰科技大学QUT计算机科学专业培养计划&am…

计算机休眠下睡眠的不同点是什么,电脑的关机选项里,休眠和睡眠有什么具体的区别呢?...

电脑的关机选项里&#xff0c;休眠和睡眠有什么具体的区别呢&#xff1f;以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;电脑的关机选项里&#xff0c;休眠和睡眠有什么具体的区别呢&#x…

开发一个智能问答机器人(优化篇)

上一篇介绍了整个问答机器人的技术架构和特定&#xff0c;本篇着重说下 如何让机器人&#xff08;看起来&#xff09;更智能 输入联想 使用jquery.autosuggest.js实现的输入联想&#xff0c;在输入2个字后&#xff0c;在5000个问答中基于全文检索&#xff0c;检索10条记录&…

java中的单例模型

参考网址:http://www.runoob.com/design-pattern/singleton-pattern.html 1.目的:保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。(比如世界只有一个月亮,党只有一个主席) 2. 优点&#xff1a; 1、在内存里只有一个实例&#xff0c;减少了内存的开销&#x…

跨站点脚本(xss)_跨站点脚本(XSS)和预防

跨站点脚本(xss)如OWASP网站&#xff08;https://www.owasp.org/index.php/Cross-site_Scripting_(XSS&#xff09;&#xff09;所述&#xff0c;跨站点脚本&#xff08;XSS&#xff09;攻击的变种几乎是无限的。 在这里&#xff0c;我建议使用基于Servlet筛选器的解决方案来清…

countdown软件测试死亡时间真假,countdown

countdown死亡倒计时真的假的?countdown这款软件是一款有电影衍生出来的产品&#xff0c;很多朋友都很好奇这个countdownapp测试死亡时间准不准&#xff0c;那么今天小编就为大家带来详细的介绍&#xff0c;感兴趣的朋友们一起来看看吧!这是一款在电影倒忌时中出现的时钟软件&…

在计算机中描述景物结构形状与外貌,在计算机中通过描述景物的结构、形状与外貌,然后将它绘制成图在屏幕上显示出来,此类图像称为_____。...

并实打印现共享文件和机等共享功能&#xff0c;计中通屏完全地相信平等互通&#xff0c;网工需的则所作模局域式是&#xff0c;网络的各没有台计一个内部主次之分若要算机。算机述景包括条件主要区域规划发展。过描的咨项目询包括(准备建设阶段。结构包括咨询主要工程任务师的。…

background-size属性100% cover contain

backgroun-size: 数字&#xff1a;100px 80px 百分比&#xff1a;100% 100% 相对于父元素的&#xff0c;能占满全屏&#xff0c;但是比例可能会失真 cover&#xff1a;占满全屏&#xff0c;可能一部分显示不出来 contain&#xff1a;有一个占满方向占满&#xff0c;背景图不失真…

展示Java开发人员课程包

60个小时以上的课程&#xff0c;5门所有级别的课程&#xff1a;成为Java编程专家 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的Java Developer Course Bundle 仅售39美元&#xff0c;而不是…