android 屏幕反馈 即时音效

原创 2018年04月17日 11:45:49

目前在做智能家居相关产品,移动端采用APICloud+android 原生模块开发。

下面我来说说为什么要做这个自定义的屏幕反馈、即时音效。首先原生的提示音被各大厂商封装又封装,导致开发者拿不到手机原生的屏幕反馈的提示声,更多的还是通知栏的声音,并且就算拿得到,适配也会更让人头疼的。还有在播放音频文件时。文件的格式还有学问:(我这里用的是wav格式,我也忘记在哪看到一篇博客,说是最好用wav的,解决了适配问题,目前我还没测试。。。)

音频格式比较:
音乐爱好者常见的音频格式有:flac、ape、wav、mp3、aac、ogg、wma
1.压缩比比较:
aac>ogg>mp3(wma)>ape>flac>wav(同一音源条件下)
mp3和wma以192kbps为分界线,192kbps以上mp3好,192kbps以下wma好。

2.音质比较:
wav=flac=ape>aac>ogg>mp3>wma

3.硬件支持比较:
MP3播放器:mp3>wma>wav>flac>ape aac ogg
手机:mp3>wma>aac wav>flac ogg>ape

4.综合性能(就是综合音质体积编码率):aac>ogg>flac ape>mp3>wav、wma


思路是:由于我是在自定义view中添加该功能。所以我在onTouchEvent的move里面实现了接口事件,接口回调监听中播放提示音,这样就能做到手指滑动就触发回调,触发屏幕反馈的提示音。

下面直接粘代码:

package com.face.zophar.modulenext.utils;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

import com.face.zophar.modulenext.R;

/**
 * 自定义播放 屏幕监听
 */

public class SoundPlayUtils {
    // SoundPool对象
    public SoundPool mSoundPlayer = new SoundPool(1,
            AudioManager.STREAM_SYSTEM, 1);
    public SoundPlayUtils soundPlayUtils;
    // 上下文
    public Context mContext;
    public int mCSoundId;

    /**
     * 初始化
     *
     * @param context
     */
    public SoundPlayUtils init(Context context) {
        if (soundPlayUtils == null) {
            soundPlayUtils = new SoundPlayUtils();
        }

        // 初始化声音
        mContext = context;
        mCSoundId = mSoundPlayer.load(mContext, R.raw.note7_b, 1);
        return soundPlayUtils;
    }

    /**
     * 播放声音
     *
     * @param
     */
    public void play() {
        mSoundPlayer.play(mCSoundId, 1, 1, 0, 0, 1);
    }
}

拓展:市面上有很多吉他、钢琴的软件 其实用SoundPool完全可以实现。

思路:可以定义6个view来代替吉他的六条琴弦,再定义一个bitmap(key:viewId,value:音频文件、开始时间、结束时间等(可以写成modle))。for循环添加到List中,结束时,就可以直接遍历这个List达到录制、播放的效果。


下面直接粘代码:

public class MainActivity extends Activity {

    // Helpful Constants
    private final int NR_OF_SIMULTANEOUS_SOUNDS = 7;
    private final float LEFT_VOLUME = 1.0f;
    private final float RIGHT_VOLUME = 1.0f;
    private final int NO_LOOP = 0;
    private final int PRIORITY = 0;
    private final float NORMAL_PLAY_RATE = 1.0f;
    private final static String TAG = "xylo";
    List<KeyTone> keyTones = new ArrayList<>();
    boolean recordingFlag = false;

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // TODO: Create a new SoundPool
        final SoundPool mSoundPool = (new SoundPool.Builder()).build();
        Log.d("Xylo", "" + mSoundPool);

        // TODO: Load and get the IDs to identify the sounds
        int mCSoundId = mSoundPool.load(getApplicationContext(), R.raw.note1_c, 1);
        int mDSoundId = mSoundPool.load(getApplicationContext(), R.raw.note2_d, 1);
        int mESoundId = mSoundPool.load(getApplicationContext(), R.raw.note3_e, 1);
        int mFSoundId = mSoundPool.load(getApplicationContext(), R.raw.note4_f, 1);
        int mGSoundId = mSoundPool.load(getApplicationContext(), R.raw.note5_g, 1);
        int mASoundId = mSoundPool.load(getApplicationContext(), R.raw.note6_a, 1);
        int mBSoundId = mSoundPool.load(getApplicationContext(), R.raw.note7_b, 1);

        final SparseIntArray keyNoteMap = new SparseIntArray();
        keyNoteMap.put(R.id.c_key, mCSoundId);
        keyNoteMap.put(R.id.d_key, mDSoundId);
        keyNoteMap.put(R.id.e_key, mESoundId);
        keyNoteMap.put(R.id.f_key, mFSoundId);
        keyNoteMap.put(R.id.g_key, mGSoundId);
        keyNoteMap.put(R.id.a_key, mASoundId);
        keyNoteMap.put(R.id.b_key, mBSoundId);

        for (int i = 0; i < keyNoteMap.size(); i++) {
            int buttonId = keyNoteMap.keyAt(i);
            int soundId = keyNoteMap.get(buttonId);
            findViewById(buttonId).setOnClickListener(view -> {
                if (recordingFlag) {
                    Log.d("Xylophone", "Recording Flag on");
                    Log.d("Xylophone", "Adding Id " + view.getId());
//                    buttonsClicked.add(view.getId());

                    long currentTime = new Date().getTime();
                    keyTones.add(new KeyTone(buttonId, currentTime, -100000L));

                    int keyTonesSize = keyTones.size();
                    if (keyTonesSize >= 2) {
                        keyTones.get(keyTonesSize - 2).setEndTime(currentTime);
                    }
                }
                mSoundPool.play(soundId, LEFT_VOLUME, RIGHT_VOLUME, PRIORITY, NO_LOOP, NORMAL_PLAY_RATE);
            });
        }

        Button playButton = (Button) findViewById(R.id.button_play);
        Button recordStopButton = (Button) findViewById(R.id.button_record_stop);

        playButton.setOnClickListener(View -> {
            Log.d(TAG, "Playbutton clicked ");
            for (int i = 0; i < keyTones.size(); i++) {
                KeyTone currentTone = keyTones.get(i);
                Button button = (Button) findViewById(currentTone.getButtonId());
                button.performClick();

                long endTime = currentTone.getEndTime();
                long startTime = currentTone.getStartTime();
                if (endTime > 0) {
                    try {
                        Thread.sleep(endTime - startTime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        recordStopButton.setOnClickListener((View) -> {
            Log.d(TAG, "record stop clicked ");
            if (recordingFlag) {
                recordStopButton.setText(R.string.record);
                recordStopButton.setBackgroundColor(getResources().getColor(R.color.green));
                recordingFlag = false;
//                Log.d(TAG, "Buttons clicked: " + buttonsClicked);
                Log.d(TAG, "Keytones: " + keyTones);
            } else {
                recordStopButton.setText(R.string.stop);
                recordStopButton.setBackgroundColor(getResources().getColor(R.color.red));
                recordingFlag = true;
//                buttonsClicked = new ArrayList<>();
                keyTones = new ArrayList<>();
            }
        });

    }

}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zophar_Development/article/details/79972542

iOS开发之多媒体篇-音效

音效就是时间比较短的音频,如斗地主游戏中打牌的声音,魂斗罗游戏中打枪的声音等 ==========================================================...
  • Dick_xyg
  • Dick_xyg
  • 2016-08-21 20:28:50
  • 372

增加修改android按键音效soundpool

一,增加或修改音效文件在frameworks/base/data/sounds目录下 并且在AllAudio.mk中添加修改的文件 $(LOCAL_PATH)/effects/ogg/Effect_u...
  • tzr0330
  • tzr0330
  • 2017-06-15 11:07:45
  • 570

Android如何取消view的点击音效

android的view都带有点击音效, 要取消的话, 需在在xml里面加入android:soundEffectsEnabled=“false”属性。...
  • xy18990
  • xy18990
  • 2016-12-05 10:49:48
  • 1055

华为U9508全局杜比音效

  • 2013年05月09日 04:48
  • 151KB
  • 下载

Android 即时音效

SoundPool sp;    HashMap spMap;  public void initSoundPool(){      sp=new SoundPool(5,AudioManage...
  • vanishLV
  • vanishLV
  • 2011-08-10 09:34:26
  • 101

Android 游戏开发--即时音效

【IT168技术】即时音效,顾名思义,是一个又短又快的音效,适合于播放时间较短反应迅速的音频文件,例如输入法打字时的“哒哒”声就是这个东西,下象棋时的下棋声也是...   该技术继承自android...
  • ihrthk
  • ihrthk
  • 2012-07-12 02:52:39
  • 429

Android 即时音效SoundPool

先贴上代码package com.example.voice; import java.util.HashMap; import java.util.Map; import android.med...
  • ygzk123
  • ygzk123
  • 2012-11-26 22:06:17
  • 4479

android 音效处理(1)

在Android 2.3中,对音频播放提供了更强大的音效支持,其实现位于android.media.audiofx包中。目前Android支持的音效包括:重低音(BassBoost)、环 绕音(Vir...
  • CodySnow
  • CodySnow
  • 2016-05-05 10:08:59
  • 2349

翻转课堂十大精彩案例

秦陇纪2010信息数据精简的微博http://weibo.com/INXCN欢迎大家粉我,跟帖,点赞,互粉(100以上才可以申请V,打扰大家了请多包涵)。秦陇大田地信息数据方面的思考研究者、程序设计员...
  • qq_28260611
  • qq_28260611
  • 2017-02-27 22:53:55
  • 179

即时音效

效果图: activity类的开发: import java.util.HashMap; import android.app.Activity; import android.conte...
  • Anzhongliu
  • Anzhongliu
  • 2015-04-15 17:13:37
  • 442
收藏助手
不良信息举报
您举报文章:android 屏幕反馈 即时音效
举报原因:
原因补充:

(最多只允许输入30个字)