Android应用开发之Android开发:创建SoundPool、加载音频文件、播放音频
凌雪 2018-10-24 来源 :网络 阅读 1210 评论 0

摘要:本文将带你了解Android应用开发之Android开发:创建SoundPool、加载音频文件、播放音频,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android开发:创建SoundPool、加载音频文件、播放音频,希望本文对大家学Android有所帮助。


BeatBox.java
package com.example.aster.beatbox; import   android.content.Context;import android.content.res.AssetFileDescriptor;import   android.content.res.AssetManager;import android.media.AudioManager;import   android.media.SoundPool;import android.util.Log; import   java.io.IOException;import java.util.ArrayList;import   java.util.List; public class BeatBox {    private   static final String TAG =   "BeatBox";     private static final String   SOUNDS_FOLDER = "sample_sounds";    private   static final int MAX_SOUNDS = 5;     private   AssetManager mAssets;    private List<sound>   mSounds = new ArrayList<>();    private SoundPool   mSoundPool;     public BeatBox(Context context)   {        mAssets =   context.getAssets();        // This   old constructor is deprecated, but we need it for   compatibility.        mSoundPool =   new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC,   0);        loadSounds();    }     public   void play(Sound sound)   {        Integer soundId =   sound.getSoundId();        if   (soundId == null) {            return;        }        mSoundPool.play(soundId,   1.0f, 1.0f, 1, 0,   1.0f);    }     private void loadSounds()   {        String[]   soundNames;        try   {            soundNames   = mAssets.list(SOUNDS_FOLDER);            Log.i(TAG,   "Found " + soundNames.length + "   sounds");        } catch   (IOException ioe) {            Log.e(TAG,   "Could not list assets",   ioe);            return;        }         for   (String filename : soundNames)   {            try   {                String   assetPath = SOUNDS_FOLDER + "/" +   filename;                Sound   sound = new   Sound(assetPath);                load(sound);                mSounds.add(sound);            }   catch (IOException ioe) {                Log.e(TAG,   "Could not load sound " + filename,   ioe);            }        }    }     private   void load(Sound sound) throws IOException   {        AssetFileDescriptor afd =   mAssets.openFd(sound.getAssetPath());        int   soundId = mSoundPool.load(afd,   1);        sound.setSoundId(soundId);    }     public   List<sound> getSounds() {        return   mSounds;    }}</sound></sound>
BeatBoxActivity.java
package com.example.aster.beatbox; import   android.support.v4.app.Fragment;import   android.support.v7.app.AppCompatActivity;import   android.os.Bundle; public class BeatBoxActivity extends   SingleFragmentActivity {    @Override    protected   Fragment createFragment()   {        return   BeatBoxFragment.newInstance();    }}
BeatBoxFragment.java
package com.example.aster.beatbox; import   android.databinding.DataBindingUtil;import android.os.Bundle;import   android.support.v4.app.Fragment;import   android.support.v7.widget.GridLayoutManager;import   android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import   android.view.View;import android.view.ViewGroup; import   com.example.aster.beatbox.databinding.FragmentBeatBoxBinding;import   com.example.aster.beatbox.databinding.ListItemSoundBinding; import   java.util.List; public class BeatBoxFragment extends Fragment   {     private BeatBox   mBeatBox;     public static BeatBoxFragment   newInstance() {        return new   BeatBoxFragment();    }     @Override    public   void onCreate(Bundle savedInstanceState)   {        super.onCreate(savedInstanceState);         mBeatBox   = new   BeatBox(getActivity());    }     @Override    public   View onCreateView(LayoutInflater inflater, ViewGroup   container,                             Bundle   savedInstanceState)   {        FragmentBeatBoxBinding   binding = DataBindingUtil                .inflate(inflater,   R.layout.fragment_beat_box, container,   false);         binding.recyclerView.setLayoutManager(new   GridLayoutManager(getActivity(),   3));        binding.recyclerView.setAdapter(new   SoundAdapter(mBeatBox.getSounds()));         return   binding.getRoot();    }     private   class SoundHolder extends RecyclerView.ViewHolder   {        private ListItemSoundBinding   mBinding;         private   SoundHolder(ListItemSoundBinding binding)   {            super(binding.getRoot());            mBinding   = binding;        }    }     private   class SoundAdapter extends RecyclerView.Adapter<soundholder>   {        private List<sound>   mSounds;         public   SoundAdapter(List<sound> sounds)   {            mSounds   = sounds;        }         @Override        public   SoundHolder onCreateViewHolder(ViewGroup parent, int viewType)   {            LayoutInflater   inflater =   LayoutInflater.from(getActivity());            ListItemSoundBinding   binding =   DataBindingUtil                    .inflate(inflater,   R.layout.list_item_sound, parent,   false);            return   new SoundHolder(binding);        }         @Override        public   void onBindViewHolder(SoundHolder holder, int position)   {         }         @Override        public   int getItemCount()   {            return   mSounds.size();        }    }}</sound></sound></soundholder>
SingleFragmentActivity.java
package   com.example.aster.beatbox;  import android.os.Bundle;import   android.support.annotation.LayoutRes;import   android.support.v4.app.Fragment;import   android.support.v4.app.FragmentManager;import   android.support.v7.app.AppCompatActivity; public abstract class   SingleFragmentActivity extends AppCompatActivity   {     protected abstract Fragment   createFragment();     @LayoutRes    protected   int getLayoutResId() {        return   R.layout.activity_fragment;    }     @Override    protected   void onCreate(Bundle savedInstanceState)   {        super.onCreate(savedInstanceState);        setContentView(getLayoutResId());         FragmentManager   fm = getSupportFragmentManager();        Fragment   fragment =   fm.findFragmentById(R.id.fragment_container);         if   (fragment == null)   {            fragment   =   createFragment();            fm.beginTransaction().add(R.id.fragment_container,   fragment).commit();        }    }}
Sound.java
package com.example.aster.beatbox; public   class Sound {    private String   mAssetPath;    private String   mName;    private Integer   mSoundId;     public Sound(String assetPath)   {        mAssetPath =   assetPath;        String[] components   =   assetPath.split("/");        String   filename = components[components.length -   1];        mName =   filename.replace(".wav",   "");    }     public   String getAssetPath() {        return   mAssetPath;    }     public   String getName() {        return   mName;    }     public Integer   getSoundId() {        return   mSoundId;    }     public void   setSoundId(Integer soundId)   {        mSoundId =   soundId;    }}
SoundViewModel.java
package com.example.aster.beatbox; import   android.databinding.BaseObservable;import   android.databinding.Bindable; public class SoundViewModel extends   BaseObservable {    private Sound   mSound;    private BeatBox   mBeatBox;     public SoundViewModel(BeatBox beatBox)   {        mBeatBox =   beatBox;    }     @Bindable    public   String getTitle() {        return   mSound.getName();    }     public   Sound getSound() {        return   mSound;    }     public void   setSound(Sound sound) {        mSound   =   sound;        notifyChange();    }}
avtivity_fragment.xml
<!--?xml version="1.0"   encoding="utf-8"?--><framelayout   android:id="@+id/fragment_container"   android:layout_height="match_parent"   android:layout_width="match_parent" xmlns:android="https://schemas.android.com/apk/res/android"></framelayout>
fragment_beat_box.xml
<!--?xml version="1.0"   encoding="utf-8"?--><layout   xmlns:android="https://schemas.android.com/apk/res/android">     </android.support.v7.widget.recyclerview></layout>
list_item_sound.xml
<!--?xml version="1.0"   encoding="utf-8"?--><layout   xmlns:android="https://schemas.android.com/apk/res/android"   xmlns:tools="https://schemas.android.com/tools">    <data>        <variable   name="viewModel"   type="com.example.aster.beatbox.SoundViewModel">    </variable></data><button   android:layout_height="120dp" android:layout_width="match_parent"   android:text="@{viewModel.title}" tools:text="Sound   name"></button></layout>    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved