无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3002|回复: 12
打印 上一主题 下一主题

[已解决] 求大神重写MediaPlayer类 播放代码!!【非整套代码】

[复制链接]
跳转到指定楼层
1#
发表于 2023-8-3 21:11:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
200无忧币
本帖最后由 879792799 于 2023-8-8 07:37 编辑

谢谢  2#  2011阿星大神指点!!太谢谢了!

无忧首发 -- 全球第一款可以播放文件夹每个音频随机部分的手机播放器

今天搞出一个半成品源码基本能用 供诸位大大修改【编译器有的会带病毒所以不建议新手使用
其实可以新建一个app[注意包名要一样] 然后把下面三个源码文件直接替换 就可以编译成apk!

=========================整套源码===========================

1.AndroidManifest.xml
  1. <?xml version='1.0' encoding='utf-8'?>
  2. <manifest
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     package="com.mycompany.myapp">
  5.         
  6.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  7.    

  8.         
  9.                
  10.                
  11.     <application
  12.         android:allowBackup="true"
  13.         android:icon="@drawable/ic_launcher"
  14.         android:label="@string/app_name"
  15.         android:theme="@style/AppTheme"
  16.         android:resizeableActivity="false">

  17.         <activity
  18.             android:name=".MainActivity"
  19.             android:label="@string/app_name">
  20.             <intent-filter>
  21.                 <action android:name="android.intent.action.MAIN"/>

  22.                 <category android:name="android.intent.category.LAUNCHER"/>
  23.             </intent-filter>
  24.         </activity>

  25.         <meta-data
  26.           android:name="android.max_aspect"
  27.           android:value="4.0"/>

  28.     </application>

  29. </manifest>
复制代码


2.activity_main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.         xmlns:android="http://schemas.android.com/apk/res/android"
  4.         android:layout_width="match_parent"
  5.         android:layout_height="match_parent">

  6.         <TextView
  7.                 android:layout_width="wrap_content"
  8.                 android:layout_height="match_parent"
  9.                 android:textAppearance="?android:attr/textAppearanceMedium"
  10.                 android:text="先在存储器根目录新建好NX文件夹后,把多个mp3文件放进去,再次打开本APP就可以快速预览这些音频了。目前是个半成品当然你可以自己随意修改代码让自己满意!"
  11.                 android:layout_marginTop="100dp"/>

  12. </LinearLayout>
复制代码



3.MainActivity.java    --- \src\main\java\com\mycompany\myapp\MainActivity.java


  1. package com.mycompany.myapp;


  2. /*2023-8-6首发于无忧论坛   作者无忧2011阿星       无忧879792799整理修改*/

  3. /*此源码无恶意代码且简单需要编译才能成apk  仅十几k 只需读存储权限  编译器有的会带病毒不建议新手使用*/


  4.     import android.app.Activity;
  5.     import android.os.Bundle;

  6.         import android.app.Activity;
  7.         import android.app.ProgressDialog;
  8.         import android.content.Intent;
  9.         import android.media.MediaPlayer;
  10.         import android.media.MediaPlayer.OnCompletionListener;
  11.         import android.media.MediaPlayer.OnErrorListener;
  12.         import android.media.MediaPlayer.OnPreparedListener;
  13.         import android.os.Bundle;
  14.         import android.os.Environment;
  15.         import android.os.Handler;
  16.         import android.os.Build;
  17.         import android.os.Handler;
  18.         import android.os.Message;
  19.         import android.view.Gravity;
  20.         import android.view.LayoutInflater;
  21.         import android.view.View;
  22.         import android.widget.Toast;
  23.         import android.app.*;
  24.         import android.os.*;
  25.         import android.widget.*;
  26.         import java.util.*;
  27.         import android.content.*;
  28.         import java.text.*;
  29.         import java.io.*;
  30.     import android.view.View.OnClickListener;
  31.     import android.widget.AdapterView.OnItemClickListener;
  32.         
  33.         

  34. public class MainActivity extends Activity    {                //每个APP都有一个默认界面



  35.     private MediaPlayer mediaPlayer;
  36.     private List<String> audioFiles;                     //把文件夹的音频排成一个数组
  37.     private int currentIndex = 0;                       //数组的下标
  38.    
  39.     private Handler handler;          //多线程  貌似没起作用

  40.     @Override
  41.     protected void onCreate(Bundle savedInstanceState) {
  42.         super.onCreate(savedInstanceState);                      //APP程序入口 从此往下执行
  43.         setContentView(R.layout.activity_main);                  //绑定主界面的布局文件

  44.         // 初始化MediaPlayer
  45.         mediaPlayer = new MediaPlayer();


  46.         // 获取音频文件列表
  47.       audioFiles = getAudioFiles("/sdcard/NX/");          //在根目录自己新建NX文件夹
  48.         
  49.         // 开始播放
  50.         playNextAudio();
  51.                 }
  52.    

  53.     private List<String> getAudioFiles(String folderPath) {      //定义音频文件集合而成数组
  54.         List<String> files = new ArrayList<>();
  55.         File folder = new File(folderPath);
  56.         File[] audioFiles = folder.listFiles(new FilenameFilter() {
  57.                                 @Override
  58.                                 public boolean accept(File dir, String name) {
  59.      return name.toLowerCase().endsWith(".mp3"); // 可根据需要修改文件类型  筛选文件后缀名
  60.                                 }
  61.                         });

  62.         if (audioFiles != null) {
  63.             for (File file : audioFiles) {
  64.                 files.add(file.getAbsolutePath());          //加入数组中
  65.             }
  66.         }
  67.         return files;
  68.     }

  69.     private void playNextAudio() {
  70.         if (currentIndex >= audioFiles.size()) {        //数组下标大于音频总数就返回
  71.             // 播放列表已结束
  72.             return;
  73.         }

  74.         String audioFile = audioFiles.get(currentIndex);       //逐个提取音频文件

  75.       
  76.             mediaPlayer.reset();
  77.                 try {
  78.             mediaPlayer.setDataSource(audioFile);     //把数组中逐个提取音频给播放器
  79.                 } catch (IOException e) {} catch (IllegalStateException e) {} catch (IllegalArgumentException e) {} catch (SecurityException e) {}
  80.                 try {
  81.                         mediaPlayer.prepare();      //播放器准备
  82.                 } catch (IOException e) {} catch (IllegalStateException e) {}
  83.             mediaPlayer.start();         //播放器开始播放

  84.       
  85.             int duration = mediaPlayer.getDuration();     //获取当前音频的总时长
  86.                
  87.             if(duration>60000){         //假如音频时长大于1分钟就往下执行 否则就跳到下一音频
  88.                         
  89.             Random random = new Random();            //准备随机方法
  90.             int startPos= random.nextInt(duration - 60000);                   // 播放开始点A 随机时间点不能是最后1分钟 防止播放时间太短就结束了

  91.                         
  92.    int endPos = startPos+30000;        //播放结束时间点B  结束时间是开始时间往后30秒


  93.    
复制代码
  1. try {
  2.        repeatAToB(startPos, endPos, 1);    //从开始时间到结束时间播放  且播放重复一遍
  3.                         } catch (Exception e) {}            
  4.                 }
  5.                
  6.                
  7.                 else{
  8.                         
  9.              currentIndex++;        //再把音频数组下标加一位,就是下一个音频文件
  10.              playNextAudio();      //再次从playNextAudio处执行
  11.                 }  
  12.     }


  13. private void repeatAToB(final int startPos, final int endPos, final int repeatTimes)throws Exception {          //这个方法就是从随机起始点A播放A播放到结束时间点B
  14.   
  15.         mediaPlayer.seekTo(startPos);  
  16.        mediaPlayer.start();  
  17.         CountDownTimer cntr_aCounter = new CountDownTimer(/* millisInFuture= */endPos - startPos, /* countDownInterval= */1000) {     //倒计时方法
  18.             public void onTick(long millisUntilFinished) {  
  19.                 // DO SOMETHING  
  20.             }  
  21.   
  22.             public void onFinish() {  
  23.                 // Code fire after finish  
  24.                 if((repeatTimes - 1) > 0){  
  25.                     try {  
  26.                         repeatAToB(startPos, endPos, repeatTimes - 1);  
  27.                     } catch (Exception e) {  
  28.                         e.printStackTrace();  
  29.                     }  
  30.                 }else{  
  31.             mediaPlayer.stop();  
  32.                                 currentIndex++;
  33.                                 playNextAudio();
  34.           }  
  35.             }  
  36.         };  
  37.         cntr_aCounter.start();  
  38.     }  

  39. //从内存中销毁 并退出
  40.     @Override
  41.     protected void onDestroy() {
  42.         super.onDestroy();
  43.         mediaPlayer.release();
  44.         handler.removeCallbacksAndMessages(null);
  45.     }}
复制代码

=========================整套源码=============================


我想要这样这样的效果【只需要重写这一段 不是整套app代码】:
写一小段MediaPlayer播放代码【其他方法也行】  就只播放音频中一部分-------随机位置往后2分钟时间段       然后就播放下一音频



【目的】就是快速了解或者说预览大数量音频的内容  
           【比如喜马拉雅专辑或者网盘分享一下载就上百集 逐个听太难了】


















2#
发表于 2023-8-3 21:11:29 | 只看该作者
  1.     private MediaPlayer mediaPlayer;
  2.     private List<String> audioFiles;
  3.     private int currentIndex = 0;
  4.     private boolean isPlaying = false;
  5.     private Handler handler;

  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.activity_main);

  10.         // 初始化MediaPlayer
  11.         mediaPlayer = new MediaPlayer();
  12.         mediaPlayer.setOnCompletionListener(this);

  13.         // 获取音频文件列表
  14.         audioFiles = getAudioFiles("/path");

  15.         // 创建Handler用于处理定时任务
  16.         handler = new Handler(new Handler.Callback() {
  17.             @Override
  18.             public boolean handleMessage(Message msg) {
  19.                 if (isPlaying) {
  20.                     mediaPlayer.pause();
  21.                     mediaPlayer.seekTo(msg.arg1);
  22.                     mediaPlayer.start();
  23.                 }
  24.                 return true;
  25.             }
  26.         });

  27.         // 开始播放
  28.         playNextAudio();
  29.     }

  30.     private List<String> getAudioFiles(String folderPath) {
  31.         List<String> files = new ArrayList<>();
  32.         File folder = new File(folderPath);
  33.         File[] audioFiles = folder.listFiles(new FilenameFilter() {
  34.             @Override
  35.             public boolean accept(File dir, String name) {
  36.                 return name.toLowerCase().endsWith(".mp3"); // 可根据需要修改文件类型
  37.             }
  38.         });

  39.         if (audioFiles != null) {
  40.             for (File file : audioFiles) {
  41.                 files.add(file.getAbsolutePath());
  42.             }
  43.         }
  44.         return files;
  45.     }

  46.     private void playNextAudio() {
  47.         if (currentIndex >= audioFiles.size()) {
  48.             // 播放列表已结束
  49.             return;
  50.         }

  51.         String audioFile = audioFiles.get(currentIndex);

  52.         try {
  53.             mediaPlayer.reset();
  54.             mediaPlayer.setDataSource(audioFile);
  55.             mediaPlayer.prepare();
  56.             mediaPlayer.start();

  57.             // 随机选择播放时间点
  58.             int duration = mediaPlayer.getDuration();
  59.             Random random = new Random();
  60.             int randomTime = random.nextInt(duration - 120000); // 随机时间点不能是最后2分钟
  61.             int delay = randomTime - mediaPlayer.getCurrentPosition();

  62.             // 发送定时任务消息
  63.             Message message = handler.obtainMessage();
  64.             message.arg1 = randomTime;
  65.             handler.sendMessageDelayed(message, delay);

  66.             isPlaying = true;
  67.         } catch (IOException e) {
  68.             e.printStackTrace();
  69.         }
  70.     }

  71.     @Override
  72.     public void onCompletion(MediaPlayer mp) {
  73.         // 音频播放完成
  74.         currentIndex++;
  75.         if (currentIndex < audioFiles.size()) {
  76.             // 继续播放下一首音频
  77.             playNextAudio();
  78.         } else {
  79.             // 播放列表已结束
  80.             isPlaying = false;
  81.         }
  82.     }

  83.     @Override
  84.     protected void onDestroy() {
  85.         super.onDestroy();
  86.         mediaPlayer.release();
  87.         handler.removeCallbacksAndMessages(null);
  88.     }
复制代码

点评

有点小问题 请教下大大 14. mediaPlayer.setOnCompletionListener(this); 编译时提示this错误  详情 回复 发表于 2023-8-4 21:43
大神有整套代码吗?!有的话发一个附件吧让大家学习一下! 呵呵  发表于 2023-8-4 17:53
谢谢大神!估计能行 不懂再来请教哈!  详情 回复 发表于 2023-8-4 17:50

评分

参与人数 1无忧币 +5 收起 理由
879792799 + 5 谢谢大大 赶紧试试 呵呵

查看全部评分

回复

使用道具 举报

3#
 楼主| 发表于 2023-8-3 21:12:39 | 只看该作者
本帖最后由 879792799 于 2023-8-19 13:23 编辑

坐等大神出手 占楼备用!

  ======================================================

求大神写一小段MediaPlayer类 播放代码!!

https://blog.csdn.net/nanoage/article/details/127363147


【非整套代码】音频播放器代码框架已经搭好了     

自带MediaPlayer代码是从头播放到尾然后播放下一个音频【下面是常见调用代码】
MediaPlayer的工作流程是这样的:

1、首先创建MediaPlaer对象;

2、然后调用setDataSource()方法来设置音频文件的路径;

3 、再调用prepare()方法使MediaPlayer进入到准备状态;

4 、调用start方法就可以播放音频。

      mPlayer = new MediaPlayer();               实例化   

      mPlayer.setDataSource(mAudioFileName);      设置需要播放mp3的路径

      mPlayer.prepare();            准备

      mPlayer.start();         开始播放

      mPlayer.setLooping(true);   设置循环模式

MediaPlayer其相关方法有

       void seekTo(int msec):从指定位置播放,参数为用毫秒定义的位置

       int getDuration():得到音频长度,即总的毫秒数

       void setVolume(float leftVolume, float rightVolume):设置音量


==================以下搜索得来 仅供参考==================

MediaPlayer其主要方法有:


void setDataSource(String path):设置要播放的音频文件位置,参数path为文件路径或Uri
void prepare():setDataSource并不载入资源,需要调用此方法准备资源
void start():开始/恢复播放
void stop():停止播放,调用后无法再播放
void pause():暂停播放,可以再用start恢复播放
void reset():重置到刚刚创建后的状态
void release():释放掉相关的资源
void seekTo(int msec):从指定位置播放,参数为用毫秒定义的位置
int getCurrentPosition():得到当前播放位置,即播放的毫秒数
int getDuration():得到音频长度,即总的毫秒数
boolean isPlaying():得到当前音频是否正在播放
void setLooping(boolean looping) / boolean isLooping():循环播放
void setVolume(float leftVolume, float rightVolume):设置音量


https://www.iteye.com/blog/deyum-1459255
https://blog.csdn.net/speedpower/article/details/84172071


近日在做一个的小应用,被MP3AB段复读的功能困扰了很久,最后终于在网上找到一个解决方法,

就是使用CountDownTimer让MediaPlayer只播放MP3的某个区段,轻松解决了AB段复读的功能。详细代码如下:

      // 复读第10秒到第20秒这个区间的音频  
        int startPos = 10000;  
        int endPos = 20000;  
   
        mMediaPlayer.seekTo(startPos);  
        mMediaPlayer.start();  
        CountDownTimer cntr_aCounter = new CountDownTimer(/* millisInFuture= */endPos - startPos, /* countDownInterval= */1000) {  
            public void onTick(long millisUntilFinished) {  
         
            }  


  1. public void play(final String filePath) throws Exception {  
  2.     try {  
  3.         if (mMediaPlayer == null) {  
  4.             // 创建MediaPlayer对象并设置Listener  
  5.             mMediaPlayer = new MediaPlayer();  
  6.         } else {  
  7.             // 复用MediaPlayer对象  
  8.             mMediaPlayer.reset();  
  9.         }  
  10.         mMediaPlayer.setDataSource(filePath);  
  11.         mMediaPlayer.prepare();  
  12.         mMediaPlayer.setVolume(10.f, 1.0f);  
  13.   
  14.         // 复读第10秒到第20秒这个区间的音频  
  15.         int startPos = 10000;  
  16.         int endPos = 20000;  
  17.         // Try to play three times  
  18.         repeatAToB(startPos, endPos, 3);  
  19.   
  20.     } catch (Exception e) {  
  21.         e.printStackTrace();  
  22.     }  
  23. }  
  24.   
  25. private void repeatAToB(final int startPos, final int endPos, final int repeatTimes)throws Exception {  
  26.   
  27.         mMediaPlayer.seekTo(startPos);  
  28.         mMediaPlayer.start();  
  29.         CountDownTimer cntr_aCounter = new CountDownTimer(/* millisInFuture= */endPos - startPos, /* countDownInterval= */1000) {  
  30.             public void onTick(long millisUntilFinished) {  
  31.                 // DO SOMETHING  
  32.             }  
  33.   
  34.             public void onFinish() {  
  35.                 // Code fire after finish  
  36.                 if((repeatTimes - 1) > 0){  
  37.                     try {  
  38.                         repeatAToB(startPos, endPos, repeatTimes - 1);  
  39.                     } catch (Exception e) {  
  40.                         e.printStackTrace();  
  41.                     }  
  42.                 }else{  
  43.                     mMediaPlayer.stop();  
  44.                 }  
  45.             }  
  46.         };  
  47.         cntr_aCounter.start();  
  48.     }
复制代码

==================以上搜索得来 仅供参考==================



一下备份一下阿星大神的原帖 防止修改后看不懂
  1.    作者 无忧阿星2011

  2. private MediaPlayer mediaPlayer;
  3.     private List<String> audioFiles;
  4.     private int currentIndex = 0;
  5.     private boolean isPlaying = false;
  6.     private Handler handler;

  7.     @Override
  8.     protected void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         setContentView(R.layout.activity_main);

  11.         // 初始化MediaPlayer
  12.         mediaPlayer = new MediaPlayer();
  13.         mediaPlayer.setOnCompletionListener(this);

  14.         // 获取音频文件列表
  15.         audioFiles = getAudioFiles("/path");

  16.         // 创建Handler用于处理定时任务
  17.         handler = new Handler(new Handler.Callback() {
  18.             @Override
  19.             public boolean handleMessage(Message msg) {
  20.                 if (isPlaying) {
  21.                     mediaPlayer.pause();
  22.                     mediaPlayer.seekTo(msg.arg1);
  23.                     mediaPlayer.start();
  24.                 }
  25.                 return true;
  26.             }
  27.         });

  28.         // 开始播放
  29.         playNextAudio();
  30.     }

  31.     private List<String> getAudioFiles(String folderPath) {
  32.         List<String> files = new ArrayList<>();
  33.         File folder = new File(folderPath);
  34.         File[] audioFiles = folder.listFiles(new FilenameFilter() {
  35.             @Override
  36.             public boolean accept(File dir, String name) {
  37.                 return name.toLowerCase().endsWith(".mp3"); // 可根据需要修改文件类型
  38.             }
  39.         });

  40.         if (audioFiles != null) {
  41.             for (File file : audioFiles) {
  42.                 files.add(file.getAbsolutePath());
  43.             }
  44.         }
  45.         return files;
  46.     }

  47.     private void playNextAudio() {
  48.         if (currentIndex >= audioFiles.size()) {
  49.             // 播放列表已结束
  50.             return;
  51.         }

  52.         String audioFile = audioFiles.get(currentIndex);

  53.         try {
  54.             mediaPlayer.reset();
  55.             mediaPlayer.setDataSource(audioFile);
  56.             mediaPlayer.prepare();
  57.             mediaPlayer.start();

  58.             // 随机选择播放时间点
  59.             int duration = mediaPlayer.getDuration();
  60.             Random random = new Random();
  61.             int randomTime = random.nextInt(duration - 120000); // 随机时间点不能是最后2分钟
  62.             int delay = randomTime - mediaPlayer.getCurrentPosition();

  63.             // 发送定时任务消息
  64.             Message message = handler.obtainMessage();
  65.             message.arg1 = randomTime;
  66.             handler.sendMessageDelayed(message, delay);

  67.             isPlaying = true;
  68.         } catch (IOException e) {
  69.             e.printStackTrace();
  70.         }
  71.     }

  72.     @Override
  73.     public void onCompletion(MediaPlayer mp) {
  74.         // 音频播放完成
  75.         currentIndex++;
  76.         if (currentIndex < audioFiles.size()) {
  77.             // 继续播放下一首音频
  78.             playNextAudio();
  79.         } else {
  80.             // 播放列表已结束
  81.             isPlaying = false;
  82.         }
  83.     }

  84.     @Override
  85.     protected void onDestroy() {
  86.         super.onDestroy();
  87.         mediaPlayer.release();
  88.         handler.removeCallbacksAndMessages(null);
  89.     }
复制代码


回复

使用道具 举报

4#
发表于 2023-8-3 23:12:41 | 只看该作者
GitHub开源,估计会有不少思路...

点评

谢谢大大指点!  发表于 2023-8-3 23:35
回复

使用道具 举报

5#
发表于 2023-8-3 23:48:09 | 只看该作者
强得我看不懂

点评

一起坐等大神!  发表于 2023-8-4 09:27
回复

使用道具 举报

6#
 楼主| 发表于 2023-8-4 17:50:33 | 只看该作者

谢谢大神!估计能行     不懂再来请教哈!
回复

使用道具 举报

7#
 楼主| 发表于 2023-8-4 21:43:55 | 只看该作者
本帖最后由 879792799 于 2023-8-6 08:47 编辑

呵呵 自己解决了【就这一句菜鸟搞了两天】

有点小问题 ,编译时提示 this  错误   

14.  mediaPlayer.setOnCompletionListener(this);



================解决办法加入 implements OnCompletionListener================


第一句改成这样就不报错了  public class MainActivity extends Activity implements OnCompletionListener   



Screenshot_20230804_215749.jpg (302.71 KB, 下载次数: 99)

Screenshot_20230804_215749.jpg
回复

使用道具 举报

8#
发表于 2023-8-5 08:47:13 | 只看该作者
这是要横空出世大杀器么

点评

谈不上吧 个人感觉比较实用这个功能 这是手机apk就是每个音频只听其中2分钟就跳到下一首 【目的】就是快速了解或者说预览大数量音频的内容 【比如喜马拉雅专辑或者网盘分享一下载就上百  详情 回复 发表于 2023-8-5 09:28
回复

使用道具 举报

9#
 楼主| 发表于 2023-8-5 09:28:27 | 只看该作者
本帖最后由 879792799 于 2023-8-5 09:33 编辑
cduser 发表于 2023-8-5 08:47
这是要横空出世大杀器么

谈不上吧  个人感觉比较实用这个功能

这是手机apk就是面对数量庞大的音频 每个音频只听其中任意2分钟就跳到下一首
【目的】就是快速了解或者说预览大数量音频的内容  
           【比如喜马拉雅专辑或者网盘分享一下载就上百集 逐个听太难了】

回复

使用道具 举报

10#
 楼主| 发表于 2023-8-6 19:41:10 | 只看该作者
今天终于搞成啦 一楼提供整套源码  算是半成品吧



mark一下

  1. package com.mycompany.myapp;


  2. /*2023-8-6首发于无忧论坛   作者无忧2011阿星      无忧879792799整理修改*/

  3. /*此源码无恶意代码且简单需要编译才能成apk  仅十几k 只需读存储权限  编译器有的会带病毒不建议新手使用*/


  4.     import android.app.Activity;
  5.     import android.os.Bundle;

  6.         import android.app.Activity;
  7.         import android.app.ProgressDialog;
  8.         import android.content.Intent;
  9.         import android.media.MediaPlayer;
  10.         import android.media.MediaPlayer.OnCompletionListener;
  11.         import android.media.MediaPlayer.OnErrorListener;
  12.         import android.media.MediaPlayer.OnPreparedListener;
  13.         import android.os.Bundle;
  14.         import android.os.Environment;
  15.         import android.os.Handler;
  16.         import android.os.Build;
  17.         import android.os.Handler;
  18.         import android.os.Message;
  19.         import android.view.Gravity;
  20.         import android.view.LayoutInflater;
  21.         import android.view.View;
  22.         import android.widget.Toast;
  23.         import android.app.*;
  24.         import android.os.*;
  25.         import android.widget.*;
  26.         import java.util.*;
  27.         import android.content.*;
  28.         import java.text.*;
  29.         import java.io.*;
  30.     import android.view.View.OnClickListener;
  31.     import android.widget.AdapterView.OnItemClickListener;
  32.         
  33.         

  34. public class MainActivity extends Activity    {                //每个APP都有一个默认界面



  35.     private MediaPlayer mediaPlayer;
  36.     private List<String> audioFiles;                     //把文件夹的音频排成一个数组
  37.     private int currentIndex = 0;                       //数组的下标
  38.    
  39.     private Handler handler;          //多线程  貌似没起作用

  40.     @Override
  41.     protected void onCreate(Bundle savedInstanceState) {
  42.         super.onCreate(savedInstanceState);                      //APP程序入口 从此往下执行
  43.         setContentView(R.layout.activity_main);                  //绑定主界面的布局文件

  44.         // 初始化MediaPlayer
  45.         mediaPlayer = new MediaPlayer();


  46.             // 获取音频文件列表
  47.                 audioFiles = getAudioFiles("/sdcard/NX/");          //在根目录自己新建NX文件夹
  48.         
  49.         // 开始播放
  50.         playNextAudio();
  51.                 }
  52.    

  53.     private List<String> getAudioFiles(String folderPath) {            //定义音频文件集合而成数组
  54.         List<String> files = new ArrayList<>();
  55.         File folder = new File(folderPath);
  56.         File[] audioFiles = folder.listFiles(new FilenameFilter() {
  57.                                 @Override
  58.                                 public boolean accept(File dir, String name) {
  59.                                         return name.toLowerCase().endsWith(".mp3"); // 可根据需要修改文件类型  筛选文件后缀名
  60.                                 }
  61.                         });

  62.         if (audioFiles != null) {
  63.             for (File file : audioFiles) {
  64.                 files.add(file.getAbsolutePath());          //加入数组中
  65.             }
  66.         }
  67.         return files;
  68.     }

  69.     private void playNextAudio() {
  70.         if (currentIndex >= audioFiles.size()) {        //数组下标大于音频总数就返回
  71.             // 播放列表已结束
  72.             return;
  73.         }

  74.         String audioFile = audioFiles.get(currentIndex);       //逐个提取音频文件

  75.       
  76.             mediaPlayer.reset();
  77.                 try {
  78.                         mediaPlayer.setDataSource(audioFile);     //把数组中逐个提取音频给播放器
  79.                 } catch (IOException e) {} catch (IllegalStateException e) {} catch (IllegalArgumentException e) {} catch (SecurityException e) {}
  80.                 try {
  81.                         mediaPlayer.prepare();      //播放器准备
  82.                 } catch (IOException e) {} catch (IllegalStateException e) {}

  83.                 //        mediaPlayer.seekTo(10000);
  84.             mediaPlayer.start();         //播放器开始播放


  85.   // 复读第10秒到第20秒这个区间的音频  

  86.                 // 随机选择播放时间点
  87.                 int duration = mediaPlayer.getDuration();     //获取当前音频的总时长
  88.                
  89.                 if(duration>60000){          //假如音频时长大于1分钟就往下执行 否则就跳到下一音频
  90.                         
  91.                         Random random = new Random();         //准备随机
  92.                         int startPos= random.nextInt(duration - 60000); // 播放开始点A 随机时间点不能是最后1分钟 防止播放时间太短就结束了

  93.                         //     int startPos = 160000;  
  94.                         int endPos = startPos+10000;        //播放结束时间点B  结束时间是开始时间往后10秒

  95. // Try to play three times  
  96.                         try {
  97.                                 repeatAToB(startPos, endPos, 1);    //从开始时间到结束时间播放  且播放重复一遍
  98.                         } catch (Exception e) {}  
  99.         
  100.                         
  101.                 }
  102.                
  103.                
  104.                 else{
  105.                         
  106.                         currentIndex++;        //再把音频数组下标加一位,就是下一个音频文件
  107.                         playNextAudio();      //再次从playNextAudio处执行
  108.                 }
  109.         
  110.         

  111.            
  112.                         
  113. //                currentIndex++;
  114. //        if (currentIndex < audioFiles.size()) {
  115. //            // 继续播放下一首音频
  116. //            playNextAudio();
  117. //        } else {
  118. //            // 播放列表已结束
  119. //         
  120. //        }
  121. //                        
  122.         
  123.     }




  124. private void repeatAToB(final int startPos, final int endPos, final int repeatTimes)throws Exception {          //这个方法就是从随机起始点A播放A播放到结束时间点B
  125.   
  126.         mediaPlayer.seekTo(startPos);  
  127.        mediaPlayer.start();  
  128.         CountDownTimer cntr_aCounter = new CountDownTimer(/* millisInFuture= */endPos - startPos, /* countDownInterval= */1000) {     //倒计时方法
  129.             public void onTick(long millisUntilFinished) {  
  130.                 // DO SOMETHING  
  131.             }  
  132.   
  133.             public void onFinish() {  
  134.                 // Code fire after finish  
  135.                 if((repeatTimes - 1) > 0){  
  136.                     try {  
  137.                         repeatAToB(startPos, endPos, repeatTimes - 1);  
  138.                     } catch (Exception e) {  
  139.                         e.printStackTrace();  
  140.                     }  
  141.                 }else{  
  142.             mediaPlayer.stop();  
  143.                                 currentIndex++;
  144.                                 playNextAudio();
  145.          
  146.          
  147.           }  
  148.             }  
  149.         };  
  150.         cntr_aCounter.start();  
  151.     }  








  152.     @Override
  153.     protected void onDestroy() {
  154.         super.onDestroy();
  155.         mediaPlayer.release();
  156.         handler.removeCallbacksAndMessages(null);
  157.     }}
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-29 17:52

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表