精华内容
下载资源
问答
  • 不过...因为这个教程比较复杂,而且只有安卓手机能用。...首先,在微信中找到你想提取(或转发)的那条语音,长按点击收藏。然后点击【我】—【收藏】,找到那条语音。进入那条语音,在详情页里把它转存为笔记。...

    不过...因为这个教程比较复杂,而且只有安卓手机能用。

    所以这个教程一发出来,就遭到了部分安卓用户和所有苹果用户的吐槽。

    165681132_5_20190710011927691

    165681132_6_20190710011927910经过数月的思考,今天机哥找到了一个简单,又能让所有人都可以使用的语音提取方法。

    借助一台 Windows 电脑即可

    165681132_7_20190710011927957操作非常简单,跟着机哥做哈。

    首先,在微信中找到你想提取(或转发)的那条语音,长按点击收藏。

    165681132_8_201907100119284

    然后点击【我】—【收藏】,找到那条语音。

    165681132_9_20190710011928191

    165681132_10_20190710011928363进入那条语音,在详情页里把它转存为笔记。

    165681132_11_20190710011928441

    做完这一步后打开电脑。

    165681132_12_20190710011928847在微信 PC 客户端的【收藏】里,点击那条笔记。

    165681132_13_20190710011928910

    这时,你会看到微信显示“当前版本无法查看该...”。

    165681132_14_2019071001192935没关系,点一下。

    165681132_15_20190710011929113

    只要你点击完,在你电脑的默认缓存文件夹里就会出现一条语音文件。

    165681132_16_20190710011929207一般来说,这个默认文件夹的地址是:【C盘】—【用户】—【你的电脑用户名那个文件夹】—【文档】—【WeChat Files】—【你微信号命名的文件夹】—【FavTemp】里。

    在【FavTemp】里会有一个乱码命名的文件夹。

    165681132_17_20190710011929269没关系,打开它。

    165681132_18_20190710011929301

    然后打开【res】这个文件夹。你会看到里面有个结尾以“.silk”命名的文件。

    165681132_19_20190710011929457这个就是我们要找的微信语音了,右键把它粘贴到桌面上。

    165681132_20_20190710011929582

    先别急着打开它,这个“.silk”格式的文件是腾讯自己的格式,所以要先转化成“.mp3”格式的。

    165681132_21_20190710011929879老规矩,回复【899】获取机哥的格式转换神器。

    165681132_22_20190710011929910

    下载后只需要把压缩包内的 3 个文件一起解压到桌面即可。

    165681132_23_2019071001193019运行 【silk2mp3】 这个程序。

    165681132_24_2019071001193066

    点击【导入待转换文件】然后选中你刚刚找到的那个“.silk”文件。

    165681132_25_20190710011930191

    在【更改输出目录里】直接选择桌面。

    最后点击【开始转换】。

    165681132_26_20190710011930300这时,你就可以在桌面上找到转换好的 mp3 文件了。

    165681132_27_20190710011930332

    赶紧听听吧~

    一个更简单的办法

    165681132_28_20190710011930379说到这,可能有机友会说:机哥,你这个方法确实能让苹果手机用户也导出音频了,但是...如果想批量导出的话,一个个找,一个个转换还是挺麻烦的啊。

    嗯...机哥也觉得麻烦。

    165681132_29_20190710011930410所以,你还可以直接使用录屏功能(也就是音频内录)。

    现在不少国产安卓手机和 iOS 11 以上的苹果手机都带录屏功能。

    165681132_30_20190710011930457

    录屏在录制屏幕的同时,还会内录系统发出的声音。

    165681132_31_20190710011930675这样就可以间接提取出微信中的语音。

    比如你在录屏时一口气播放 20 段微信语音,那么你一段视频中就可以直接提取出 20 段微信语音,达到批量提取的效果。

    165681132_32_20190710011930754一般来说,手机录制的视频都是通用格式的,后期通过格式工厂之类的软件,去掉视频中的画面,只保留音频,就可以达到批量提取语音的目的了。

    165681132_33_20190710011930863

    165681132_34_2019071001193166不过这个方法的缺点也很明显,因为是通过系统音频内录来实现的抓取,所以音质会有一些损耗。

    165681132_35_2019071001193182总结一下上面两个方法:如果你注重音质,只需要提取几条语音,那就用第一个方法。

    如果你要一次性提取大量语音,同时不太在乎音质,那就用第二个方法。

    说真的,微信不提供语音转发的理由本来是“为了安全”。

    165681132_36_20190710011931129但是你看,我这不也提取出来了吗?

    165681132_37_20190710011931144真的,不要再为难用户了,赶紧放开语音转发吧。

    展开全文
  • 实测微信语音转发点击好友发送过来的语音,有一个选项是更多,进入之后底部有转发的图标,可以选择:逐条转发、合并转发。但选择逐条转发之后,会显示如左图;选择合并转发,可以转发成功,但会显示如右图。不难看出...

    微信的用处很多,实用功能也很多,但可惜的是微信不能转发语音。虽然说这样设计,是为了降低被骗的情况,但有时候真的不是很方便。那么微信语音,应该怎么转发呢?下面这几个方法,其实很简单。

    实测微信语音转发

    点击好友发送过来的语音,有一个选项是更多,进入之后底部有转发的图标,可以选择:逐条转发、合并转发。但选择逐条转发之后,会显示如左图;选择合并转发,可以转发成功,但会显示如右图。

    不难看出,2种方法转发语音消息都是不行的,那么微信语音应该怎么转发呢?下面这几种简单方法,教给你。

    1、 录音录屏

    手机上就有录音录屏的功能,直接打开录音、录屏功能,然后播放语音消息,录制结束后,就可以将好友的语音转发给别人啦。

    2、 语音转文字

    点击好友的语音消息时,会出现语音转文字的选项,直接将转换成文字,就可以转发给好友啦,但只能截图分享,考虑到实用性,可以试试小程序:录音转文字助手。

    可以上传微信里的音频文件转换成文字,也可以将实时语音转文字,有这个需求的,可以试试。

    微信语音不能直接转发,要借助其他方法,希望上面2个方法,可以帮助到你哦。

    微信语音怎么转发?原来方法这么简单,你还不知道吗?如果你知道其他方法,也可以下方留言分享。

    华风扬是一家创业点子分享平台,在这里提供互联网创业项目,以及引流推广、网络营销、实操案例分享,需要网上创业点子那就上华风扬,找项目,学推广就来华风扬!

    版权声明:本站部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们,如若转载,请注明出处:http://www.uxxsn.com/29780.html

    展开全文
  • 参考于:Android模仿微信语音聊天功能,这代码跑起来有问题,自己改动了一下,基本上没什么大问题先贴下效果图1、三个布局文件activity_main.xmldialog_manger.xmlitem_layout2.自定义的类(1)DialogMangerpackage ...

    参考于: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;

    }

    }

    }

    展开全文
  • 微信语音转文字功能

    2021-06-08 11:41:00
    微信7.0.5语音转文字正式版功能上线了,备受关注的发送语音就可以直接转发为文字功能的7.0.5版本终于来了,不过目前只有安卓版微信才能使用这个功能哦,现在微信的使用率非常的大,基本上每个人手机上都装到微信app...

    微信7.0.5语音转文字正式版功能上线了,备受关注的发送语音就可以直接转发为文字功能的7.0.5版本终于来了,不过目前只有安卓版微信才能使用这个功能哦,现在微信的使用率非常的大,基本上每个人手机上都装到微信app,日常生活中大家都是用微信来聊天沟通的。但是你有没有被一大堆语音给吓到过,如今这个版本上线了这个功能真的超“奈斯”哦,再也不怕被语音骚扰的恐惧了。

    微信7.0.5语音转文字正式版特点介绍:

    1、现在微信的使用率越来越普及,很多人工作,学习,生活都是离不开微信,更新的这个版本带给大家更便捷的沟通方式哦;

    2、传统的微信发送消息可以发送文字或者发送语音,但是现在可以将发送的语音转换为文字发出去了,不用担心对方收到语音会反感咯;

    3、微信安卓版用户可以先体验一波哦,操作很简单的,点击语音输入的时候,手指按住不动线上滑动,就可以点击:转文字这个选项。

    微信7.0.5语音转文字正式版优势介绍:

    1、大家使用这个版本的微信,会让沟通更加贴心,也可以多个沟通方式选择哦;

    2、自动将录入的语音转发为文字发送给对方,但前提一定是普通话才能识别。

    微信更新日志:

    v7.0.15

    1.针对深色模式的显示方式进行调整,最新版本可以设置深色模式不跟随系统。

    2.通过网页阅读文章的时候回复消息也能自动打开浮窗。

    3.新增了接龙的固定入口,群接龙更方便。

    4.感兴趣的小程序现在可以收藏。

    展开全文
  • ---------以下为图文,请在本文最后点击“阅读原文”查看视频教程--------ios平台下,导出微信语音只需要两个步骤:使用“语音导出”APP将微信语音导出为mp3格式文件并送到电脑使用QQ影音将多条导出的mp3文件合并为...
  • [非原创,转载]来源,点击跳转微信语音样式* {margin: 0;padding: 0;}.box {width: 120px;height: 120px;box-sizing: border-box;position: relative;margin: 50px auto;}.wifi-symbol {width: 50px;height: 50px;box...
  • 1、长按语音条目。 2、弹出菜单“收藏”。 3、再我-》收藏中即可看到。
  • 前言之前做过一个微信的项目,专家回复可以录音,然后储存成mp3格式,前台可以获取mp3,客户可以在线试听mp3录音效果,今天就简单分享一下这个效果如何实现,及实现思路和方法!效果图前台大体呈现效果图如下:点击...
  • 微信语音amr转mp3

    2021-04-23 23:55:24
    说下整体思路1、服务器安装ffmpeg2、使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用system函数执行即可)3、在网页端使用HTML5的audio标签来播放mp3文件下面是操作细节:一、服务器安装ffmpeg...
  • 设计思路: 播放时使用js的setInterval来替换png达到动画效果 当前demo语音播放使用插件BenzAMRRecorder.js 如需要用其它js插件来播放语音也很容易集成到本demo 准备素材: css代码: .btnPlayAmr{ width:108px;...
  • 微信语音聊天框样式+功能

    千次阅读 2021-11-08 18:19:20
    这里写自定义目录标题仿微信语音聊天播放效果(左右朝向的动态小喇叭) 仿微信语音聊天播放效果(左右朝向的动态小喇叭) 效果图: 纯HTML+CSS代码 <!DOCTYPE html> <meta charset="utf-8"> <...
  • 原标题:微信语音通话如何录音保存并回放最近很多朋友都在网上提问微信语音通话能否录音保存,保存之后在哪里查询回放。其实这类问题有个最简单的方法,下面就跟着我一起来操作吧!也希望这种方法能帮助到大家。 1:...
  • //识别成功,返回结果,元素类型为WXVoiceResult,现阶段数组内只有一个元素 -...此时不会再接受新的语音 - (void)voiceInputWaitForResult{ } //在手动调用的cancel后,取消完成时回调 - (void)voiceInputDidCancel{ }
  • 这篇文章主要介绍了微信语音上传 下载功能实例代码,需要的朋友可以参考下假如现在有一个按钮按住 说话下面就是调用微信jssdk的方法var recorder;var btnRecord = $('#record');var startTime = 0;var recordTimer = ...
  • 微信语音关闭麦克风对方知道吗

    万次阅读 2020-12-29 07:46:28
    微信语音关闭麦克风对方不会知道,如果一方关闭了麦克风,另一方是不会收到任何提示,只是对方无法听到声音而已。微信语音,是微信为开发者提供免费的语音技术,已经开放的语音技术包括在线语音识别、在线语音合成等...
  • <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...meta name="viewport" content="initial-scale=1, maximum-scale=1, user-...
  • 很多朋友在使用手机播放其他好友发送给自己的语音消息时,会出现“语音播放失败”的提示,不知道是什么原因导致的,本期文章就说说导致微信语音播放失败的几个原因,以及可行的解决办法。一、缓存故障当好友给自己...
  • 4.录音类里有两个成员:录音长度,录音路径。 下面贴一下代码: 自定义Button package com.zms.wechatrecorder.view; import com.zms.wechatrecorder.MyAudioManager; ... ...import android.content.Cont
  • 微信语音终于可以转发

    千次阅读 多人点赞 2021-05-21 15:32:56
    近日,看到微信语音可以进行转发了,之前微信出于对安全方面的考虑,语音消息无法进行直接转发,下面给大家分享一个隐藏的转发技巧。 我们将一条语音消息,录制并发送后,长按该条语音消息,这里我们点击收藏...
  • 第一步:把微信语音收藏,然后转存为笔记 第二步:在pc端打开微信客户端,笔记内的语音文件会同步到电脑,找到它 第三部:下一个第三方软件把语音转为mp3 优势:手机上不用安装app,避免了被流氓软件获取隐私数据...
  • 很多做微商、微信培训的人,都会为分享内容不能同步发送至多个微信群而苦恼,多群直播(一起学堂)的出现,就是专门解决这一问题,实现语音、文字、图片、链接以及直拍小视频的都可以做到在多个微信群同步直...
  • 首先是发现微信语音来电不响铃,各种设置检查,没发现问题。因为经常用蓝牙耳机听广播,所以怀疑与这个有关。不过当时并没有连接耳机,难道这也会影响?关掉蓝牙开关,好了,可以正常响铃了,真的是耳机问题? ...
  • WeChat-ASR微信语音批量转文字 调用百度智能云短语音识别API 目前仅支持安卓手机+Windows简介最近线上办公,很多小会议或者讲座等也在微信群里,有时需要记录保存会议讲话内容,也可能为了节省时间,转成文字后快速...
  • 仿微信语音通话悬浮窗效果实现 显示效果 4.1 需求分析 需求分析: 1.悬浮可拖动 2.自动粘边:停留时只粘在屏幕左边或右边 3.圆直角切换:拖动时悬浮窗四个角为圆角,粘边时粘边处皆为直角 4.2 实现 1.悬浮可拖动 ...
  • } 结束:三行代码搞定格式转换 探索过程 最近接到基于微信公众号开发的需求,在处理微信消息的时候,发现语音类型的消息微信推送过来的是 amr 格式的文件,而在网页 HTML5的audio标签不支持amr格式,很是麻烦。...
  • 本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下前言我把录音分成了两部分1.UI界面,弹窗读秒2.一个类(包含开始、停止、创建文件名功能)第一部分由于6.0权限问题,点击按钮申请权限...
  • 只支持移动端预览 手指上划,取消发送 松开手指, 取消发送 以上代码放到 说明,演示一定用浏览器F12的手机页面调试才能看 代码里的图片请百度:html5仿微信语音发送动画特效 个人觉得做H5聊天室语音版的能用到。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,890
精华内容 20,756
关键字:

怎么转发微信语音