Android 媒体播放器和搜索栏同步问题

2023-12-09

我正在开发一个媒体播放器应用程序。我正在尝试将其同步到搜索栏,以便在播放媒体时搜索栏自动前进。这是我的源代码:

public class MusicDroid extends ListActivity implements
        SeekBar.OnSeekBarChangeListener, Runnable {

    private int cur_time = 0;
    private SeekBar seekbar;
    int song_dur = 0;
    GroveService gs;
    public Chronometer timer;
    int timer_time = 0;

    @Override
    public void onCreate(Bundle icicle) {
        try {
            super.onCreate(icicle);
            setContentView(R.layout.songlist);
            gs = new GroveService();
            gs.updateSongList();
        } catch (NullPointerException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
        seekbar = (SeekBar) findViewById(R.id.SeekBar01);
        timer = (Chronometer) findViewById(R.id.Chronometer01);
        seekbar.setOnSeekBarChangeListener(this);
        // this.bindService(new Intent(this, GroveService.class), conn,
        // Context.BIND_AUTO_CREATE);
        ArrayAdapter<String> songList = new ArrayAdapter<String>(this,
                R.layout.song_item, gs.songs);
        setListAdapter(songList);
        timer.setOnChronometerTickListener(new OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer arg0) {
                // TODO Auto-generated method stub
                seekbar.setProgress(cur_time);
            }
        });
    }

    protected void onListItemClick(ListView l, View v, int position, long id) {
        timer.stop();
        timer.start();
        gs.playSong(position, 0);
    }

    /*
     * private ServiceConnection conn= new ServiceConnection(){
     * 
     * @Override public void onServiceConnected(ComponentName arg0, IBinder
     * arg1) { Log.v("Status:","Service Connected to player"); // TODO
     * Auto-generated method stub tprog= new Thread(new Runnable(){
     * 
     * }); tprog.setPriority(Thread.MIN_PRIORITY); tprog.start(); }
     * 
     * @Override public void onServiceDisconnected(ComponentName arg0) { // TODO
     * Auto-generated method stub
     * 
     * } };
     */
    // code for menu based media player controls
    /*
     * public boolean onOptionsItemSelected(MenuItem item) { switch
     * (item.getItemId()) { case R.id.prev: gs.prevSong(); break; case
     * R.id.play: gs.playSong(gs.songindex,cur_time); break; case R.id.pause:
     * gs.mp.getDuration(); gs.mp.pause(); break; case R.id.nxt: gs.nextSong();
     * break; } return true; }
     */

    public void myClickHandler(View view) {
        switch (view.getId()) {
        case R.id.ImageButton01:
            gs.prevSong();
            timer.stop();
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            timer.start();
            break;
        case R.id.ImageButton02:
            Thread t=new Thread();
            t.start();
            gs.playSong(gs.songindex, cur_time);
            timer.start();
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            break;
        case R.id.ImageButton03:
            cur_time = gs.getCurrentDuration(gs.songindex);

              if(gs.mp.isPlaying()){
              timer_time=Integer.parseInt((String)timer.getText());
              timer.stop(); 
              timer.setBase(timer_time);
              Log.v("Timer Time",String.valueOf(timer_time)); }
              gs.mp.pause(); 
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            break;
        case R.id.ImageButton04:
            gs.nextSong();
            timer.stop();
            timer.start();
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            break;
        }
    }

    @Override
    public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
        // TODO Auto-generated method stub
        gs.mp.seekTo(arg1);
    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        int currentPosition = 0;
        int total = gs.mp.getDuration();
        seekbar.setMax(total);
        while (gs.mp != null && currentPosition < total) {
            try {
                Thread.sleep(1000);
                currentPosition = gs.mp.getCurrentPosition();
            } catch (InterruptedException e) {
                return;
            } catch (Exception e) {
                return;
            }
            seekbar.setProgress(currentPosition);
        }
    }
}

执行音乐播放的服务类。代码在这里:

class Mp3Filter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return (name.endsWith(".mp3"));
    }
}

public class GroveService extends Service {
    static final String MEDIA_PATH = new String("/sdcard/");
    List<String> songs = new ArrayList<String>();
    MediaPlayer mp = new MediaPlayer();
    int songindex = 0;
    int duration=0;
    //MusicDroid md;
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    public void onCreate()
    {
        super.onCreate();
        updateSongList();
        //md=new MusicDroid();
    }

    public void updateSongList() {
        File home = new File(MEDIA_PATH);
        if (home.listFiles(new Mp3Filter()).length > 0) {
            for (File file : home.listFiles(new Mp3Filter())) {
                songs.add(file.getName());
            }                                   
        }
    }
    public void playSong(final int position, final int cur_pos) {
        try {                     
            mp.reset();         
            mp.setDataSource(MEDIA_PATH + songs.get(position)); 
            mp.prepare();   
            //song_dur=mp.getDuration();
            mp.seekTo(cur_pos); 
            mp.start(); 
            duration=position;
            mp.setOnCompletionListener(new OnCompletionListener() {
                public void onCompletion(MediaPlayer arg0) {
                    nextSong();
                }
            });         
        } catch (IOException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
    }    

    public void nextSong() {
        if (++songindex >= songs.size())
            songindex = 0;
        else
            playSong(songindex,0);
    }

    public void prevSong() {
        songindex--;
        if (songindex > 0)
            playSong(songindex,0);
        else {
            songindex = 0;
            playSong(songindex,0);
        }
    }
    public int getSongDuration(int index)
    {   
        duration=mp.getDuration();
        Log.v("Song Duration", String.valueOf(duration));
        return duration;
    }
    public int getCurrentDuration(int index){
        int current_position;
        current_position=mp.getCurrentPosition();
        Log.v("Current Dur:",String.valueOf(current_position));
        return current_position;
    }
}

在 MediaPlayer 中,您可以设置 onPreparedListener,您可以在其中同步您的搜索,如下所示

mMediaPlayer.setOnPreparedListener(new OnPreparedListener() 
          {
            @Override
            public void onPrepared(final MediaPlayer mp) 
            {
                seekBar.setMax(mp.getDuration());
                   new Thread(new Runnable() {

                           @Override
                           public void run() {
                                   while(mp!=null && mp.getCurrentPosition()<mp.getDuration())
                                   {
                                       seekBar.setProgress(mp.getCurrentPosition());
                                       Message msg=new Message();
                                       int millis = mp.getCurrentPosition();

                                       msg.obj=millis/1000;
                                       mHandler.sendMessage(msg);
                                        try {
                                            Thread.sleep(100);
                                        } 
                                        catch (InterruptedException e) {
                                           e.printStackTrace();
                                        }
                                   }
                           }
                   }).start();

            }
        });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 媒体播放器和搜索栏同步问题 的相关文章

随机推荐

  • Hibernate 复合密钥 ID 生成器

    我的实体如下 我的数据模型强制执行以下操作 并且我无法更改引用完整性 所以我被复合键困住了 我想自动生成 使用一些生成器来生成 orderId 是的 我已阅读以下内容 http docs jboss org hibernate annota
  • PHP 中判断 URL 是否存在的最快方法是什么?

    我需要创建一个函数 该函数返回 URL 是否可访问或有效 我目前正在使用类似以下内容来确定有效的网址 static public function urlExists url fp fopen url r if fp return true
  • Mysql 5.7.20:无法从字符集“二进制”的字符串创建 JSON 值

    当我导入带有 JSON 列的表的 SQL 文件时 我遇到了这个问题 数据库有 编码 utf8mb4 整理 utf8mb4 unicode ci 这是带有 json 列的表 CREATE TABLE tracking data id int
  • 如何使用 strtotime 和 date 获取相对于今天的上个月和上一年?

    我需要获取相对于当前日期的上个月和上一年 但是 请参阅以下示例 Today is 2011 03 30 echo date Y m d strtotime last month Output 2011 03 02 这种行为是可以理解的 在某
  • Python/PyQt4:如何找到显示器的尺寸(以英寸为单位)?

    我试图找到显示器的水平宽度 以英寸或厘米为单位 不是像素 来制作一个小型 标尺 程序 DPI 也可以工作 我正在使用 PyQt4 尝试使用 QDesktopWidget 的 width 和 height 分别获取宽度和高度 类参考位于QDe
  • jQuery 冒号选择器

    在 jQuery 中有一些冒号选择器 例如 上一个 下一个 最后一个 我的问题是 它们真的是 jQuery 的一部分吗 因为它们实际上用在 DOM 元素上 我们似乎在 jQuery 中也有等效的方法prev next last 有两种不同方
  • JavaFX - 通过 GridPane 上的 OnClick 获取索引行和索引列 [重复]

    这个问题在这里已经有答案了 我需要获取名为 myGrid 的 GridPane 上指定点击的索引 如果我从我的坐标中放置一块 如下所示 它就会起作用 例如 myGrid add new ImageView othello images wh
  • 如何动态传递if语句的条件

    我遇到的情况是 我将在变量中获取比较字符串 并且我想在 IF 中使用该变量 xyz abc lt 200 Dummy Dynamic Text if xyz It should execute like if abc lt 200 echo
  • 谷歌应用程序中的rmi错误

    当我使用以下行时 我没有收到错误 FileItemIterator it servletFileUpload getItemIterator request 当我使用以下行时我得到它 List fileItemsList servletFi
  • IIS 中的应用程序池标识和 SQL Server 的集成安全性

    如果我有一个使用模拟的 ASP NET Web 应用程序和一个集成安全性 true 的 SQL Server 连接字符串 那么该应用程序的 IIS 应用程序池的标识是否起作用 是否需要将身份设置为某个特定用户 本地系统 网络服务或域用户 这
  • 禁用 ASP.net 树视图复选框

    你们如何有条件地禁用 ASP 树视图中的复选框 例如 如果应用程序用户没有特定权限 请禁用权限树视图中的该权限条目复选框 这就是我正在寻找的内容 这是 winform 应用程序中的等效项 文本灰显的复选框被禁用 我看到了其他解决方案 其中复
  • 当达到最大并发 HTTP 请求限制时,浏览器级别会发生什么?

    我知道不同的浏览器可以处理相同主机名的并发连接数不同 但是当达到该限制时 新请求到底会发生什么 它会自动等待并稍后重试 还是我需要做一些事情来帮助完成此过程 具体来说 如果这是一个XMLHttpRequest通过 JavaScript 执行
  • 熊猫数据框来字典,同时保留重复的行

    我有一个如下所示的数据框 kenteken status code 0 XYZ A 123 1 XYZ B 456 2 ABC C 789 我想将它转换为字典中的字典 如下所示 XYZ code 123 status A code 456
  • JavaScript 最终方法

    javascript中的方法可以是final的吗 如何避免它被子类覆盖 从传统意义上讲 不 您不能拥有私有 受保护的方法或阻止它们被覆盖 然而 您可以做的是将方法封装在一个范围内 然后简单地不公开它们 function foo functi
  • 没有布局模板或 JSON 视图的 Meteor Iron-Router

    使用 Meteor Iron Router 我怎样才能either将数据呈现为 JSON 或只是将其显示为 原始 没有布局模板 本质上我希望能够做类似的事情 this route rawdata path raw collection la
  • Microsoft Face API 中“解码错误,图像格式不受支持”

    我正在尝试使用 Microsoft Face API 为此 我有 Microsoft 提供的以下代码作为示例 在本页末尾 https dev projectoxford ai docs services 563879b61984550e40
  • 如何使用preg_match提取数据?

    我对 preg match 的使用还很陌生 在发布这个问题之前搜索了很多答案 找到了很多帖子来根据 youtube ID 等获取数据 但没有任何符合我的需要 如果这是一个愚蠢的问题 请原谅我 我需要使用 preg match 从字符串中获取
  • 如何从 QLineEdit() 获取 int?

    所以这是我的代码 我尝试了很多方法来更改 QLineEdit 的输入 但没有任何效果 我唯一得到的是 类型错误 QLineEdit 和 QLineEdit 实例之间不支持 gt from matplotlib import pyplot i
  • 对 MYSQL 标签表进行排序

    只是想知道是否可以获得前 10 COUNT 个结果并按 COUNT 和字母顺序排序 我有以下表格 tags id title tagged tag id post id 以及以下 SQL 查询 SELECT tag COUNT td tag
  • Android 媒体播放器和搜索栏同步问题

    我正在开发一个媒体播放器应用程序 我正在尝试将其同步到搜索栏 以便在播放媒体时搜索栏自动前进 这是我的源代码 public class MusicDroid extends ListActivity implements SeekBar O