Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)

news2025/8/4 1:33:44

需要源码请点赞关注收藏后评论区留下QQ~~~

一、拖动条和滑动条

拖动条SeekBar继承自进度条ProgressBar,它与进度条的不同之处在于,进度条只能在代码中修改进度值,不能由用户改变进度值,拖动条不仅可以在代码中修改进度值,还可以由用户拖动操作改变进度值,在播放音频和视频时,用户通过拖动条控制播放器快进或快退到指定位置,然后从新位置开始播放,除此之外,拖动条还可以调节音量大小,屏幕亮度,字体大小等

尽管拖动条在多数情况下够用了,但它有一个毛病,拖动之后用户不能直观的看到当前进度值是多少,为此Android设计了全新的滑动条空间Slider,首先要增加以下配置

implementaion 'com.google.android.materia:material:1.4.0'

运行效果如下 可以手动点击控制音量

 代码如下

Java类

package com.example.audio;

import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.slider.Slider;

public class SliderActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slider);
        SeekBar sb_progress = findViewById(R.id.sb_progress);
        sb_progress.setOnSeekBarChangeListener(mSeekListener); // 设置拖动条的拖动监听器
        Slider sl_progress = findViewById(R.id.sl_progress);
        sl_progress.addOnSliderTouchListener(mSliderListener); // 设置滑动条的触摸监听器
    }

    private SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() {
        // 在进度变更时触发。第三个参数为true表示用户拖动,为false表示代码设置进度
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}

        // 在开始拖动进度时触发
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {}

        // 在停止拖动进度时触发
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            Toast.makeText(SliderActivity.this, "您选择的进度是"+seekBar.getProgress(),
                    Toast.LENGTH_SHORT).show();
        }
    };

    private Slider.OnSliderTouchListener mSliderListener = new Slider.OnSliderTouchListener() {
        // 在开始滑动进度时触发
        @Override
        public void onStartTrackingTouch(Slider slider) {}

        // 在停止滑动进度时触发
        @Override
        public void onStopTrackingTouch(Slider slider) {
            Toast.makeText(SliderActivity.this, "您选择的进度是"+slider.getValue(),
                    Toast.LENGTH_SHORT).show();
        }
    };

}

 XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:text="下面是拖动条"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <SeekBar
        android:id="@+id/sb_progress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:max="100"
        android:progress="50"
        android:thumb="@drawable/seekbar_point" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:gravity="center"
        android:text="下面是来自MaterialDesign库的滑动条"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <com.google.android.material.slider.Slider
        android:id="@+id/sl_progress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:stepSize="1"
        android:valueFrom="0"
        android:valueTo="100"
        android:value="0" />

</LinearLayout>

二、音频管理器

Android只有一个麦克风,却管理着6种铃声,分别是通话音,系统音,铃音,闹钟音,通知音等

管理这些铃声音量的工具是音频管理器AudioManager 下面是它的常用方法

getStreamMaxVolume 获取指定类型铃声的最大音量

getStreamVolume 获取指定类型铃声的当前音量

getRingerMode 获取指定类型铃声的响铃模式

音量调整效果如下 这个设置页面不但允许通过拖动条将音量直接调整到目标值,还允许通过加减按钮逐级调大或者调小音量

可以拖动条也可以点击按钮来调节

 

 代码如下

Java类

package com.example.audio;

import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

import androidx.appcompat.app.AppCompatActivity;

public class AudioManagerActivity extends AppCompatActivity implements OnSeekBarChangeListener, OnClickListener {
    private static final String TAG = "VolumeManagerActivity";
    private SeekBar sb_voice, sb_system, sb_ring, sb_music, sb_alarm, sb_notify;
    private ImageView iv_volumn_up, iv_system_up, iv_ring_up, iv_music_up, iv_alarm_up, iv_notify_up;
    private ImageView iv_volumn_down, iv_system_down, iv_ring_down, iv_music_down, iv_alarm_down, iv_notify_down;
    private int[] mStreamType = { // 音频流类型数组
            AudioManager.STREAM_VOICE_CALL, AudioManager.STREAM_SYSTEM,
            AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
            AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION};
    private int[] mMaxVolume = {0, 0, 0, 0, 0, 0}; // 最大音量数组
    private int[] mNowVolume = {0, 0, 0, 0, 0, 0}; // 当前音量数组
    private SeekBar[] mSeekBar = { // 拖动条的控件数组
            sb_voice, sb_system, sb_ring,
            sb_music, sb_alarm, sb_notify};
    private int[] mStreamRes = { // 拖动条的资源编号数组
            R.id.sb_voice, R.id.sb_system, R.id.sb_ring,
            R.id.sb_music, R.id.sb_alarm, R.id.sb_notify};
    private ImageView[] mAddView = { // 增大音量按钮的控件数组
            iv_volumn_up, iv_system_up, iv_ring_up,
            iv_music_up, iv_alarm_up, iv_notify_up};
    private int[] mAddRes = { // 增大音量按钮的资源编号数组
            R.id.iv_volumn_up, R.id.iv_system_up, R.id.iv_ring_up,
            R.id.iv_music_up, R.id.iv_alarm_up, R.id.iv_notify_up};
    private ImageView[] mDelView = { // 减小音量按钮的控件数组
            iv_volumn_down, iv_system_down, iv_ring_down,
            iv_music_down, iv_alarm_down, iv_notify_down};
    private int[] mDelRes = { // 减小音量按钮的资源编号数组
            R.id.iv_volumn_down, R.id.iv_system_down, R.id.iv_ring_down,
            R.id.iv_music_down, R.id.iv_alarm_down, R.id.iv_notify_down};
    private int SEEK_BAR = 1, ADD_VIEW = 2, DEL_VIEW = 3;
    private AudioManager mAudioMgr; // 声明一个音频管理器对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_audio_manager);
        // 从布局文件中依次获取各音量类型的拖动条、增大音量按钮、减小音量按钮
        for (int i = 0; i < mStreamType.length; i++) {
            mSeekBar[i] = findViewById(mStreamRes[i]);
            mAddView[i] = findViewById(mAddRes[i]);
            mDelView[i] = findViewById(mDelRes[i]);
        }
        setStreamVolume(); // 设置各音量类型的拖动条进度
        for (int i = 0; i < mStreamType.length; i++) {
            // 给各音量类型的拖动条设置拖动变更监听器
            mSeekBar[i].setOnSeekBarChangeListener(this);
            // 给各音量类型的增大音量按钮设置点击监听器
            mAddView[i].setOnClickListener(this);
            // 给各音量类型的减小音量按钮设置点击监听器
            mDelView[i].setOnClickListener(this);
        }
    }

    // 设置各音量类型的拖动条进度
    void setStreamVolume() {
        // 从系统服务中获取音频管理器
        mAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        for (int i = 0; i < mStreamType.length; i++) {
            int type = mStreamType[i];
            // 获取指定音频类型的最大音量
            mMaxVolume[i] = mAudioMgr.getStreamMaxVolume(type);
            // 获取指定音频类型的当前音量
            mNowVolume[i] = mAudioMgr.getStreamVolume(type);
            // 设置拖动条的音量大小进度
            mSeekBar[i].setProgress(mSeekBar[i].getMax() * mNowVolume[i] / mMaxVolume[i]);
        }
    }

    // 在进度变更时触发。第三个参数为true表示用户拖动,为false表示代码设置进度
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}

    // 在开始拖动进度时触发
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {}

    // 在停止拖动进度时触发
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        Log.d(TAG, "当前进度为:" + seekBar.getProgress() + ", 最大进度为" + seekBar.getMax());
        int index = getArrayIndex(seekBar.getId(), SEEK_BAR);
        int type = mStreamType[index];
        int volume = mMaxVolume[index] * seekBar.getProgress() / seekBar.getMax();
        Log.d(TAG, "volume=" + volume + ", last volume=" + mNowVolume[index] + ", max volume=" + mMaxVolume[index]);
        if (volume != mNowVolume[index]) {
            mNowVolume[index] = volume;
            // 根据拖动位置,计算并设置拖动条的当前进度
            seekBar.setProgress(seekBar.getMax() * mNowVolume[index] / mMaxVolume[index]);
        }
        // 设置该音频类型的当前音量
        mAudioMgr.setStreamVolume(type, volume, AudioManager.FLAG_PLAY_SOUND);
    }

    @Override
    public void onClick(View v) {
        int add_index = getArrayIndex(v.getId(), ADD_VIEW);
        int del_index = getArrayIndex(v.getId(), DEL_VIEW);
        if (add_index != -1) { // 点击了增大音量按钮
            SeekBar seekBar = mSeekBar[add_index];
            if (mNowVolume[add_index] < mMaxVolume[add_index]) {
                mNowVolume[add_index] = mNowVolume[add_index] + 1;
                // 设置拖动条的音量大小进度
                seekBar.setProgress(seekBar.getMax() * mNowVolume[add_index] / mMaxVolume[add_index]);
                // 把该音频类型的当前音量调大一级
                mAudioMgr.adjustStreamVolume(mStreamType[add_index], AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND);
            }
        } else if (del_index != -1) { // 点击了减小音量按钮
            SeekBar seekBar = mSeekBar[del_index];
            if (mNowVolume[del_index] > 0) {
                mNowVolume[del_index] = mNowVolume[del_index] - 1;
                // 设置拖动条的音量大小进度
                seekBar.setProgress(seekBar.getMax() * mNowVolume[del_index] / mMaxVolume[del_index]);
                // 把该音频类型的当前音量调小一级
                mAudioMgr.adjustStreamVolume(mStreamType[del_index], AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND);
            }
        }
    }

    // 根据资源编号与类型寻找它在对应数组中的位置
    private int getArrayIndex(int resid, int type) {
        int index = -1;
        if (type == SEEK_BAR) { // 这是拖动条
            for (int i = 0; i < mSeekBar.length; i++) {
                if (mSeekBar[i].getId() == resid) {
                    index = i;
                    break;
                }
            }
        } else if (type == ADD_VIEW) { // 这是增大音量按钮
            for (int i = 0; i < mAddView.length; i++) {
                if (mAddView[i].getId() == resid) {
                    index = i;
                    break;
                }
            }
        } else if (type == DEL_VIEW) { // 这是减小音量按钮
            for (int i = 0; i < mDelView.length; i++) {
                if (mDelView[i].getId() == resid) {
                    index = i;
                    break;
                }
            }
        }
        return index;
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="bottom|center_horizontal"
                    android:text="调节通话音量"
                    android:textColor="#000000"
                    android:textSize="17sp" />

                <ImageView
                    android:id="@+id/iv_volumn_down"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="30dp"
                    android:src="@drawable/volumn_down" />

                <ImageView
                    android:id="@+id/iv_volumn_up"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="50dp"
                    android:src="@drawable/volumn_up" />
            </LinearLayout>

            <SeekBar
                android:id="@+id/sb_voice"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:thumb="@drawable/seekbar_point" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="bottom|center_horizontal"
                    android:text="调节系统音量"
                    android:textColor="#000000"
                    android:textSize="17sp" />

                <ImageView
                    android:id="@+id/iv_system_down"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="30dp"
                    android:src="@drawable/volumn_down" />

                <ImageView
                    android:id="@+id/iv_system_up"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="50dp"
                    android:src="@drawable/volumn_up" />
            </LinearLayout>

            <SeekBar
                android:id="@+id/sb_system"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:thumb="@drawable/seekbar_point" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="bottom|center_horizontal"
                    android:text="调节铃声音量"
                    android:textColor="#000000"
                    android:textSize="17sp" />

                <ImageView
                    android:id="@+id/iv_ring_down"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="30dp"
                    android:src="@drawable/volumn_down" />

                <ImageView
                    android:id="@+id/iv_ring_up"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="50dp"
                    android:src="@drawable/volumn_up" />
            </LinearLayout>

            <SeekBar
                android:id="@+id/sb_ring"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:thumb="@drawable/seekbar_point" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="bottom|center_horizontal"
                    android:text="调节音乐音量"
                    android:textColor="#000000"
                    android:textSize="17sp" />

                <ImageView
                    android:id="@+id/iv_music_down"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="30dp"
                    android:src="@drawable/volumn_down" />

                <ImageView
                    android:id="@+id/iv_music_up"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="50dp"
                    android:src="@drawable/volumn_up" />
            </LinearLayout>

            <SeekBar
                android:id="@+id/sb_music"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:thumb="@drawable/seekbar_point" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="bottom|center_horizontal"
                    android:text="调节闹钟音量"
                    android:textColor="#000000"
                    android:textSize="17sp" />

                <ImageView
                    android:id="@+id/iv_alarm_down"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="30dp"
                    android:src="@drawable/volumn_down" />

                <ImageView
                    android:id="@+id/iv_alarm_up"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="50dp"
                    android:src="@drawable/volumn_up" />
            </LinearLayout>

            <SeekBar
                android:id="@+id/sb_alarm"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:thumb="@drawable/seekbar_point" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:orientation="horizontal" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="bottom|center_horizontal"
                    android:text="调节通知音量"
                    android:textColor="#000000"
                    android:textSize="17sp" />

                <ImageView
                    android:id="@+id/iv_notify_down"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="30dp"
                    android:src="@drawable/volumn_down" />

                <ImageView
                    android:id="@+id/iv_notify_up"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="50dp"
                    android:src="@drawable/volumn_up" />
            </LinearLayout>

            <SeekBar
                android:id="@+id/sb_notify"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:thumb="@drawable/seekbar_point" />
            
        </LinearLayout>
    </ScrollView>

</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

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

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

相关文章

ONE 2.0应用场景解读 | 如何通过时序拓扑直观还原故障传导链路?

近年来&#xff0c;随着数字化转型的不断推进&#xff0c;电子商务发展迅速&#xff0c;推动人们的购物行为随之发生转变&#xff0c;在线购物已成为人们的主要购物方式之一。相关数据表明&#xff0c;超过九成的中国网民使用过在线购物平台。 面对庞大的在线用户流量&#xf…

KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答

1.kmp算法基本介绍 KMP 是一个解决模式串在文本串是否出现过&#xff0c;如果出现过&#xff0c;最早出现的位置的经典算法。Knuth-Morris-Pratt 字符串查找算法&#xff0c;简称为 “KMP 算法”&#xff0c;常用于在一个文本串 S 内查找一个模式串 P 的出现位置&#xff0c;这…

使用koa框架部署项目

将打包好的代码打包上线&#xff0c;并在nodejs中代理跨域 前端工程师完成开发流程&#xff0c;按照常规的做法&#xff0c;此时&#xff0c;运维会将我们的代码部署到阿里云的ngix服务上&#xff0c;对于我们而言&#xff0c;我们可以将其部署到本机的nodejs环境中 企业代码部…

AI产业沙龙【语音之家】—京东在AI语音方向的技术探索与实践

由CCF语音对话与听觉专委会 、中国人工智能产业发展联盟&#xff08;AIIA&#xff09;评估组、京东科技、语音之家、希尔贝壳共同主办的【语音之家】AI产业沙龙—京东在AI语音方向的技术探索与实践&#xff0c;将于2022年11月29日19:30-21:30线上直播。 沙龙简介 如今人机对话…

【构建ML驱动的应用程序】第 10 章 :为模型构建安全措施

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

MYSQL进阶(3)

SQL语句的优化: 1)Insert语句的优化:我们如果说向数据库中插入数据&#xff0c;可以从下面几个方面来进行优化: 1.1)批量插入数据&#xff0c;values后面加上多个括号 1.2)手动控制事务&#xff0c;关闭自动提交&#xff0c;避免大量用到事务 1.3)按照主键顺序插入 2)大批量插入…

unity和C#的多线程 Thread的IsBackground属性,详解

Thread的IsBackground = true;//主程序结束后,线程随之结束 【日常要用到的】 Thread的IsBackground = false;//主程序结束后,线程不会随之结束 案例1、 using System; using System.Threading; namespace ConsoleApp1 { class Program { static void Main(st…

【数据结构】顺序表—纯C实现顺序表

顺序表文章目录定义特点缺陷静态顺序表动态顺序表接口实现顺序表初始化顺序表销毁顺序表增容头部的插入删除头插头删尾部的插入删除尾插尾删中间的插入删除中间插入中间删除顺序表查找顺序表打印定义 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xf…

sklearn.metrics模块重要API总结(持续更新)

目录前言各类指标分类指标&#xff08;Classification metrics&#xff09;sklearn.metrics.accuracy_scoresklearn.metrics.aucaverage_precision_score (AP)回归指标&#xff08;Regression metrics&#xff09;多标签排序指标&#xff08;Multilabel ranking metrics&#x…

JUC05-AQS、ReentrantLock原理

一、AQS 全称是 AbstractQueuedSynchronizer,是同步器的相关框架&#xff0c;juc中很多锁的实现类依赖同步器(AQS的子类)完成核心操作 要点 内部维护state变量资源状态&#xff0c;state0表示当前无线程占用&#xff0c;state!0代表该锁正在被线程占用提供FIFO的等待队列&…

Mongodb实验二——分片集群搭建

目录 前言 题目一 1.创建副本集实例&#xff08;Mongod&#xff09; cfg0_0配置 cfg0_1配置 cfg0_2配置 ch0_0配置 ch0_1配置 ch0_2配置 ch1_0配置 ch1_1配置 ch1_2配置 2.初始化副本集 ch0conf.js配置 ch1conf.js配置 3.创建路由节点&#xff08;分片管理服务器…

Live800:避开客服雷区,提升客服转化

小刘在某在线商城开了个小店铺&#xff0c;店铺做得不错&#xff0c;宝贝销量稳定&#xff0c;小日子过得有滋有味。 最近一段时间&#xff0c;流量持续下滑&#xff0c;销量跟着走低&#xff0c;可愁死了。 "流量有波动很正常&#xff0c;但是一直降一直降&#xff0c;肯…

《恋上数据结构与算法》第1季:算法概述

数据结构与算法的学习笔记目录&#xff1a;《恋上数据结构与算法》的学习笔记 目录索引算法概述1. 算法和数据结构1.1 什么是算法1.2 什么是数据结构2. 时间复杂度2.1 如何判断一个算法的好坏呢&#xff1f;2.2 基本操作执行次数2.3 大O表示法3. 空间复杂度3.1 概念定义4. 算法…

MCE | BCL6 小分子也能发挥类 PROTAC 的功能

图示摘要&#xff1a;来自作者 Jonas Koeppel (Ph. D., Department of Medical Oncology, Dana-Farber Cancer Institute) 的 Twitter杂合双功能降解技术 (PROTAC&#xff0c;靶蛋白配体-Linker-E3 连接酶配体组成的“三体”聚合物) 已被用于多种疾病相关靶点的降解剂开发&…

老年患者植入LVAD的挑战:胃肠道出血

EF值降低的心力衰竭随着年龄的增长越来越常见。据研究报道&#xff0c;75岁以上人群的患病率是普通人群的4倍&#xff0c;目前是老年人死亡和住院的最常见原因之一。治疗方案主要包括心脏移植(HT)和长期左心室辅助装置(LVAD)植入&#xff0c;这两种方法已被临床研究证明可降低患…

Flutter高仿微信-第34篇-单聊-小视频

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 详情请参考 Flutter高仿微信-第29篇-单聊 &#xff0c; 这里只是提取小视频的部…

Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)

需要源码和服务端代码请点赞关注收藏后评论区留下QQ~~~ 一、通过SocketIO传输文本消息 虽然HTTP协议能够满足多数常见的接口交互&#xff0c;但是他属于短连接&#xff0c;每次调用完就自动断开连接&#xff0c;并且HTTP协议区分了服务端和客户端&#xff0c;双方的通信过程是…

机器学习知识经验分享之三:基于卷积神经网络的经典目标检测算法

文章目录前言一、一阶段目标检测算法1.YOLO系列算法2.SSD检测算法3. RetinaNet检测算法二、两阶段目标检测算法1.Faster R-CNN检测算法2.Mask R-CNN检测算法3.Cascade R-CNN检测算法总结前言 本系列文章将对机器学习知识进行分享总结。便于大家从理论层面了解人工智能基础原理…

软件被人后台篡改了收款码属于入侵吗?

最近很多做平台的小伙伴&#xff0c;碰到了同样的问题&#xff0c;就是软件程序后台被恶意篡改收款二维码 这个问题出现在平台主身上无疑是雪上加霜&#xff0c;第一时间找到了小蚁君&#xff0c;分析了一下当时的情况&#xff0c;先安装了小蚁的入侵检测系统&#xff0c;显示…

计算机毕业设计之java+ssm协同办公系统

项目介绍 本公司文档协同办公管理系统采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发,主要包括系统用户管理模块、用户信息模块、文件信息管理、个人事务管理、资料信息管理、登录模块、和退出模块等多个模块. 本系统主要包含了等系统用户管理、用户信息管理…