歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android MediaRecorder實現暫停斷點錄音功能

最近研究了下Android  MediaRecorder的錄音功能,發現暫停之後,繼續錄音這個功能,網上參考的資料比較少,現在將自己的學習成果分享大家:

基本原理如下:MediaRecorder通過MIC錄音,系統沒有自帶的pause功能,每次暫停錄音,都會結束本次的錄音。現在本人的設計思路是:MediaRecorder錄音暫停時,保存這段所錄下的音頻A,繼續錄音後,再次暫停,保留錄音音頻B;以此類推直到最終的錄音結束時,依次讀取之前保存的A、B……的錄音文件,並將其合並在一起。涉及的技術:文件的保存讀取、音頻的合並等

音頻的合並:設置MediaRecorder的音頻輸出格式mMediaRecorder01.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);

mMediaRecorder01 .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);輸出的是amr格式。amr的音頻文件的文件頭,相對來說是固定的6個字節的固定字符,A.amr文件和B.amr文件的合並,只需將B以字節流讀取,去掉前6個字節,和A的字節流合並後保存,就實現了音頻合並,不涉及復雜的音頻編碼問題。(MediaRecorder的音頻輸出格式比較多,有jpgg、MP3等之類的格式,合成的原理大同小異,只需要注意他們的音頻文件頭的格式就可以了。)

資源代碼:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2012年資料/7月/4日/Android  MediaRecorder實現暫停斷點錄音功能

有圖有真相:

 

  1. public class EX07 extends Activity {  
  2.     private ImageButton myButton1;  
  3.     private ImageButton myButton2;  
  4.     private ImageButton myButton3;  
  5.     private ImageButton myButton4;  
  6.     private Button myButton;  
  7.     private ListView myListView1;  
  8.     private String strTempFile = "YYT_";  
  9.     private File myRecAudioFile;  
  10.     /**錄音保存路徑**/  
  11.     private File myRecAudioDir;  
  12.     private File myPlayFile;  
  13.     private MediaRecorder mMediaRecorder01;  
  14.     private int mMinute;  
  15.     private boolean xx=true;  
  16.     /**存放音頻文件列表**/  
  17.     private ArrayList<String> recordFiles;  
  18.     private ArrayAdapter<String> adapter;  
  19.     private TextView myTextView1;  
  20.     /**文件存在**/  
  21.     private boolean sdcardExit;  
  22.     /**是否停止錄音**/  
  23.     private boolean isStopRecord;  
  24.     /**按鈕背景圖片的標志位**/  
  25.     private boolean sigle = false;  
  26.     private String length1 = null;  
  27.       
  28.     private  final String SUFFIX=".amr";  
  29.       
  30.       
  31.     /**暫停按鈕**/  
  32.     Button buttonpause;  
  33.       
  34.       
  35.     /**記錄需要合成的幾段amr語音文件**/  
  36.     private ArrayList<String> list;  
  37.       
  38.       
  39.     int second=0;  
  40.       
  41.     int minute=0;  
  42.       
  43.     /**計時器**/  
  44.     Timer timer;  
  45.       
  46.       
  47.     /**是否暫停標志位**/  
  48.     private boolean isPause;  
  49.       
  50.     /**在暫停狀態中**/  
  51.     private boolean inThePause;  
  52.       
  53.   
  54.     /** Called when the activity is first created. */  
  55.     @Override  
  56.     public void onCreate(Bundle savedInstanceState) {  
  57.           
  58.         super.onCreate(savedInstanceState);  
  59.         setContentView(R.layout.main);  
  60.           
  61.         //暫停標志位 為false   
  62.         isPause=false;  
  63.         //暫停狀態標志位   
  64.         inThePause=false;  
  65.           
  66.         //初始化list   
  67.         list=new ArrayList<String>();  
  68.           
  69.         //四個按鈕   
  70.         myButton1 = (ImageButton) findViewById(R.id.ImageButton01);  
  71.         myButton2 = (ImageButton) findViewById(R.id.ImageButton02);  
  72.         myButton3 = (ImageButton) findViewById(R.id.ImageButton03);  
  73.         myButton4 = (ImageButton) findViewById(R.id.ImageButton04);  
  74.         myButton = (Button) findViewById(R.id.myButton);  
  75.         buttonpause=(Button)findViewById(R.id.mypuase);  
  76.         myListView1 = (ListView) findViewById(R.id.ListView01);  
  77.         myTextView1 = (TextView) findViewById(R.id.TextView01);  
  78.         myButton2.setEnabled(false);  
  79.         myButton3.setEnabled(false);  
  80.         myButton4.setEnabled(false);  
  81.           
  82.         myPlayFile=null;  
  83.   
  84.         // 判斷sd Card是否插入   
  85.         sdcardExit = Environment.getExternalStorageState().equals(  
  86.                 android.os.Environment.MEDIA_MOUNTED);  
  87.         // 取得sd card路徑作為錄音文件的位置   
  88.         if (sdcardExit){  
  89.             String pathStr = Environment.getExternalStorageDirectory().getPath()+"/YYT";  
  90.             myRecAudioDir= new File(pathStr);  
  91.             if(!myRecAudioDir.exists()){  
  92.                 myRecAudioDir.mkdirs();  
  93.                 Log.v("錄音""創建錄音文件!" + myRecAudioDir.exists());  
  94.             }  
  95. //          Environment.getExternalStorageDirectory().getPath() + "/" + PREFIX + "/";   
  96.         }  
  97.         // 取得sd card 目錄裡的.arm文件   
  98.         getRecordFiles();  
  99.           
  100.         adapter = new ArrayAdapter<String>(this,  
  101.                 android.R.layout.simple_list_item_1, recordFiles);  
  102.         // 將ArrayAdater添加ListView對象中   
  103.         myListView1.setAdapter(adapter);  
  104.         // 錄音   
  105.       
  106.         myButton1.setOnClickListener(new ImageButton.OnClickListener() {  
  107.        
  108.             @Override  
  109.             public void onClick(View v) {  
  110.             second=0;  
  111.             minute=0;  
  112.                   
  113.             list.clear();  
  114. //          Calendar c=Calendar.getInstance();   
  115. //          int mMinute1=c.get(Calendar.MINUTE);   
  116.               
  117.                 sigle = true;  
  118.                 // TODO Auto-generated method stub   
  119.   
  120.                  start();  
  121.   
  122.                 if (sigle = false) {  
  123.                     myButton1.setBackgroundResource(R.drawable.record_hover1);  
  124.                 } else {  
  125.                     myButton1.setBackgroundResource(R.drawable.record_dis1);  
  126.                     myButton2.setBackgroundResource(R.drawable.stop_hover2);  
  127.                     myButton3.setBackgroundResource(R.drawable.play_hover1);  
  128.                     myButton4.setBackgroundResource(R.drawable.delete_hover);  
  129.                 }  
  130.               
  131.               
  132.             }  
  133.   
  134.         });  
  135.         // 停止   
  136.         myButton2.setOnClickListener(new ImageButton.OnClickListener() {  
  137.   
  138.             @Override  
  139.             public void onClick(View v) {  
  140.                   
  141.                   
  142.                 xx=false;  
  143.                 sigle = true;  
  144.                 timer.cancel();  
  145.                 // TODO Auto-generated method stub   
  146.                   
  147.                   
  148.                 //這裡寫暫停處理的 文件!加上list裡面 語音合成起來   
  149.                 if(isPause){  
  150.                       
  151.                     //在暫停狀態按下結束鍵,處理list就可以了   
  152.                     if(inThePause){  
  153.                         getInputCollection(list, false);  
  154.                     }  
  155.                     //在正在錄音時,處理list裡面的和正在錄音的語音   
  156.                     else{  
  157.                         list.add(myRecAudioFile.getPath());  
  158.                         recodeStop();  
  159.                         getInputCollection(list, true);  
  160.                     }  
  161.                       
  162.                     //還原標志位   
  163.                     isPause=false;  
  164.                     inThePause=false;  
  165.                     buttonpause.setText("暫停錄音");  
  166.                       
  167.                   
  168.                       
  169.                       
  170.                 //  adapter.add(myRecAudioFile.getName());   
  171.                       
  172.                 }  
  173.                   
  174.                   
  175.                   
  176.                 //若錄音沒有經過任何暫停   
  177.                 else{  
  178.                       
  179.                   
  180.                     if (myRecAudioFile != null) {  
  181.                     // 停止錄音   
  182.                     mMediaRecorder01.stop();  
  183.                     mMediaRecorder01.release();  
  184.                     mMediaRecorder01 = null;  
  185.                     // 將錄音頻文件給Adapter   
  186.                     adapter.add(myRecAudioFile.getName());  
  187.                     DecimalFormat df = new DecimalFormat("#.000");  
  188.                     if (myRecAudioFile.length() <= 1024*1024) {  
  189.                         //length1 = (myRecAudioFile.length() / 1024.0)+"";   
  190.                           
  191.                           length1=df.format(myRecAudioFile.length() / 1024.0)+"K";  
  192.                     } else {  
  193.                         //length1 = (myRecAudioFile.length() / 1024.0 / 1024)+"";   
  194.                         //DecimalFormat df = new DecimalFormat("#.000");   
  195.                           length1=df.format(myRecAudioFile.length() / 1024.0 / 1024)+"M";  
  196.                     }  
  197.                         System.out.println(length1);  
  198.                         
  199.                       myTextView1.setText("停  止" + myRecAudioFile.getName()  
  200.                             + "文件大小為:" + length1);  
  201.                     myButton2.setEnabled(false);  
  202.               
  203.                 }  
  204.                   
  205.             }  
  206.   
  207.                 if (sigle = false) {  
  208.                     myButton2.setBackgroundResource(R.drawable.stop_hover2);  
  209.                 } else {  
  210.                     myButton1.setBackgroundResource(R.drawable.record_hover1);  
  211.                     myButton2.setBackgroundResource(R.drawable.stop1);  
  212.                     myButton3.setBackgroundResource(R.drawable.play_hover1);  
  213.                     myButton4.setBackgroundResource(R.drawable.delete_hover);  
  214.                 }  
  215.                   
  216.                 //停止錄音了   
  217.                 isStopRecord = true;  
  218.             }  
  219.   
  220.         });  
  221.   
  222.         // 播放   
  223.         myButton3.setOnClickListener(new ImageButton.OnClickListener() {  
  224.   
  225.             @Override  
  226.             public void onClick(View v) {  
  227.                 sigle = true;  
  228.                 // TODO Auto-generated method stub   
  229.                 if (myPlayFile != null && myPlayFile.exists()) {  
  230.                     // 打開播放程序   
  231.                     openFile(myPlayFile);  
  232.                 } else {  
  233.                     Toast.makeText(EX07.this"你選的是一個空文件", Toast.LENGTH_LONG)  
  234.                             .show();  
  235.                     Log.d("沒有選擇文件","沒有選擇文件");  
  236.                 }  
  237.                 if (sigle = false) {  
  238.                     myButton3.setBackgroundResource(R.drawable.play_hover1);  
  239.                 } else {  
  240.                     myButton1.setBackgroundResource(R.drawable.record_hover1);  
  241.                     myButton2.setBackgroundResource(R.drawable.stop_hover2);  
  242.                     myButton3.setBackgroundResource(R.drawable.play1);  
  243.                     myButton4.setBackgroundResource(R.drawable.delete_hover);  
  244.                 }  
  245.             }  
  246.   
  247.         });  
  248.   
  249.         // 刪除   
  250.         myButton4.setOnClickListener(new OnClickListener() {  
  251.   
  252.             @Override  
  253.             public void onClick(View v) {  
  254.                 sigle = true;  
  255.                 // TODO Auto-generated method stub   
  256.   
  257.                 if (myPlayFile != null) {  
  258.                     // 先將Adapter刪除文件名   
  259.                     adapter.remove(myPlayFile.getName());  
  260.                     // 刪除文件   
  261.                     if (myPlayFile.exists())  
  262.                         myPlayFile.delete();  
  263.                     myTextView1.setText("完成刪除!");  
  264.   
  265.                 }  
  266.                 if (sigle = false) {  
  267.                     myButton4.setBackgroundResource(R.drawable.delete_hover);  
  268.                 } else {  
  269.                     myButton1.setBackgroundResource(R.drawable.record_hover1);  
  270.                     myButton2.setBackgroundResource(R.drawable.stop_hover2);  
  271.                     myButton3.setBackgroundResource(R.drawable.play_hover1);  
  272.                     myButton4.setBackgroundResource(R.drawable.delete_dis);  
  273.                 }  
  274.             }  
  275.         });  
  276.           
  277.         /** 
  278.          * 暫停按鈕,記錄之前保存的語音文件 
  279.          */  
  280.         buttonpause.setOnClickListener(new OnClickListener() {  
  281.               
  282.             @Override  
  283.             public void onClick(View v) {  
  284.                 // TODO Auto-generated method stub   
  285.                   
  286.             isPause=true;  
  287.                   
  288.                 //已經暫停過了,再次點擊按鈕 開始錄音,錄音狀態在錄音中   
  289.             if(inThePause){  
  290.                 buttonpause.setText("暫停錄音");  
  291.                 start();  
  292.                 inThePause=false;  
  293.                   
  294.                   
  295.             }  
  296.             //正在錄音,點擊暫停,現在錄音狀態為暫停   
  297.             else{  
  298.                   
  299.                 //當前正在錄音的文件名,全程   
  300.                 list.add(myRecAudioFile.getPath());  
  301.                 inThePause=true;  
  302.                 recodeStop();  
  303.                 //start();   
  304.                 buttonpause.setText("繼續錄音");  
  305.                   
  306.                 //計時停止   
  307.                 timer.cancel();  
  308.             }  
  309.             }  
  310.         });  
  311.           
  312.           
  313.         myListView1  
  314.                 .setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  315.                     @Override  
  316.                     public void onItemClick(AdapterView<?> arg, View arg1,  
  317.                             int arg2, long arg3) {  
  318.                         // TODO Auto-generated method stub   
  319.                         // 當有單點擊文件名時將刪除按鈕及播放按鈕Enable   
  320.                         myButton3.setEnabled(true);  
  321.                         myButton4.setEnabled(true);  
  322.                         myPlayFile = new File(myRecAudioDir.getAbsolutePath()  
  323.                                 + File.separator  
  324.                                 + ((TextView) arg1).getText().toString());  
  325.                           
  326.                         DecimalFormat df = new DecimalFormat("#.000");  
  327.                         if (myPlayFile.length() <= 1024*1024) {  
  328.                             length1=df.format(myPlayFile.length() / 1024.0)+"K";  
  329.                         } else {  
  330.                             length1=df.format(myPlayFile.length() / 1024.0/1024)+"M";  
  331.                         }  
  332.                         myTextView1.setText("你選的是"  
  333.                                 + ((TextView) arg1).getText().toString()  
  334.                                 + "文件大小為:" + length1);  
  335.                         Toast.makeText(EX07.this,"你選的是" + (((TextView) arg1).getText())+ "文件大小為:" + length1,  
  336.                                         Toast.LENGTH_LONG).show();  
  337.   
  338.                     }  
  339.   
  340.                 });  
  341.   
  342.         myButton.setOnClickListener(new Button.OnClickListener() {  
  343.   
  344.             @Override  
  345.             public void onClick(View v) {  
  346.                 // TODO Auto-generated method stub   
  347.                 showSize show = new showSize();  
  348.                 String text = show.showsize();  
  349.                 Toast.makeText(EX07.this, text, Toast.LENGTH_LONG).show();  
  350.             }  
  351.         });  
  352.     }  
  353.   
  354.       
  355.     protected void recodeStop() {  
  356.         if (mMediaRecorder01 != null && !isStopRecord) {  
  357.             // 停止錄音   
  358.             mMediaRecorder01.stop();  
  359.             mMediaRecorder01.release();  
  360.             mMediaRecorder01 = null;  
  361.         }  
  362.           
  363.         timer.cancel();  
  364.     }  
  365.       
  366.   
  367.     /** 
  368.      * activity的生命周期,stop時關閉錄音資源 
  369.      */  
  370.     @Override  
  371.     protected void onStop() {  
  372.         // TODO Auto-generated method stub   
  373.         if (mMediaRecorder01 != null && !isStopRecord) {  
  374.             // 停止錄音   
  375.             mMediaRecorder01.stop();  
  376.             mMediaRecorder01.release();  
  377.             mMediaRecorder01 = null;  
  378.         }  
  379.         super.onStop();  
  380.     }  
  381.   
  382.   
  383.     /** 
  384.      * 獲取目錄下的所有音頻文件 
  385.      */  
  386.     private void getRecordFiles() {  
  387.         // TODO Auto-generated method stub   
  388.         recordFiles = new ArrayList<String>();  
  389.         if (sdcardExit) {  
  390.             File files[] = myRecAudioDir.listFiles();  
  391.             if (files != null) {  
  392.                 for (int i = 0; i < files.length; i++) {  
  393.                     if (files[i].getName().indexOf(".") >= 0) { // 只取.amr 文件   
  394.                         String fileS = files[i].getName().substring(  
  395.                                 files[i].getName().indexOf("."));  
  396.                         if (fileS.toLowerCase().equals(".mp3")  
  397.                                 || fileS.toLowerCase().equals(".amr")  
  398.                                 || fileS.toLowerCase().equals(".mp4"))  
  399.                             recordFiles.add(files[i].getName());  
  400.   
  401.                     }  
  402.                 }  
  403.             }  
  404.         }  
  405.   
  406.     }  
  407.   
  408.     // 打開錄音播放程序   
  409.     private void openFile(File f) {  
  410.         Intent intent = new Intent();  
  411.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  412.         intent.setAction(android.content.Intent.ACTION_VIEW);  
  413.         String type = getMIMEType(f);  
  414.         intent.setDataAndType(Uri.fromFile(f), type);  
  415.         startActivity(intent);  
  416. //      Uri uri=Uri.fromFile(f);   
  417. //      MediaPlayer mediaPlayer=MediaPlayer.create(this, uri);   
  418. //      try {   
  419. //          mediaPlayer.prepare();   
  420. //      } catch (IllegalStateException e) {   
  421. //          // TODO Auto-generated catch block   
  422. //          e.printStackTrace();   
  423. //      } catch (IOException e) {   
  424. //          // TODO Auto-generated catch block   
  425. //          e.printStackTrace();   
  426. //      }   
  427. //      mediaPlayer.start();   
  428.     }  
  429.   
  430.     private String getMIMEType(File f) {  
  431.   
  432.         String end = f.getName().substring(f.getName().lastIndexOf(".") + 1,  
  433.                 f.getName().length()).toLowerCase();  
  434.         String type = "";  
  435.         if (end.equals("mp3") || end.equals("aac") || end.equals("amr")  
  436.                 || end.equals("mpeg") || end.equals("mp4")) {  
  437.             type = "audio";  
  438.         } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")  
  439.                 || end.equals("jpeg")) {  
  440.             type = "image";  
  441.         } else {  
  442.             type = "*";  
  443.         }  
  444.         type += "/";  
  445.         return type;  
  446.     }  
  447.       
  448.     private void start(){  
  449.           
  450.            
  451.          TimerTask timerTask=new TimerTask() {  
  452.               
  453.             @Override  
  454.             public void run() {  
  455.                 // TODO Auto-generated method stub   
  456.                 second++;  
  457.                 if(second>=60){  
  458.                     second=0;  
  459.                     minute++;  
  460.                 }  
  461.                 handler.sendEmptyMessage(1);  
  462.             }  
  463.         };  
  464.          timer=new Timer();  
  465.          timer.schedule(timerTask, 1000,1000);  
  466.           
  467.         try {  
  468.             if (!sdcardExit) {  
  469.                 Toast.makeText(EX07.this"請插入SD card",  
  470.                         Toast.LENGTH_LONG).show();  
  471.                 return;  
  472.             }  
  473.             String  mMinute1=getTime();  
  474.             Toast.makeText(EX07.this"當前時間是:"+mMinute1,Toast.LENGTH_LONG).show();  
  475.             // 創建音頻文件   
  476. //          myRecAudioFile = File.createTempFile(mMinute1, ".amr",   
  477. //                  myRecAudioDir);   
  478.               
  479.             myRecAudioFile=new File(myRecAudioDir,mMinute1+SUFFIX);  
  480.             mMediaRecorder01 = new MediaRecorder();  
  481.             // 設置錄音為麥克風   
  482.             mMediaRecorder01  
  483.                     .setAudioSource(MediaRecorder.AudioSource.MIC);  
  484.             mMediaRecorder01  
  485.                     .setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);  
  486.             mMediaRecorder01  
  487.                     .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  488.               
  489.             //錄音文件保存這裡   
  490.             mMediaRecorder01.setOutputFile(myRecAudioFile  
  491.                     .getAbsolutePath());  
  492.             mMediaRecorder01.prepare();  
  493.             mMediaRecorder01.start();  
  494.               
  495. //          mMediaRecorder01.getMaxAmplitude();   
  496. //          mMediaRecorder01.getAudioSourceMax();   
  497.             mMediaRecorder01.setOnInfoListener(new OnInfoListener() {  
  498.                   
  499.                 @Override  
  500.                 public void onInfo(MediaRecorder mr, int what, int extra) {  
  501.                     // TODO Auto-generated method stub   
  502.                     int a=mr.getMaxAmplitude();  
  503.                     Toast.makeText(EX07.this, a, 500).show();  
  504.                 }  
  505.             });  
  506.               
  507.             myTextView1.setText("錄音中......");  
  508.             myButton2.setEnabled(true);  
  509.             myButton3.setEnabled(false);  
  510.             myButton4.setEnabled(false);  
  511.             isStopRecord = false;  
  512.         } catch (IOException e) {  
  513.             e.printStackTrace();  
  514.   
  515.         }  
  516.       
  517.     }  
  518.     private String getTime(){  
  519.         SimpleDateFormat   formatter   =   new   SimpleDateFormat   ("yyyy年MM月dd日HH:mm:ss");        
  520.         Date  curDate=new  Date(System.currentTimeMillis());//獲取當前時間         
  521.         String   time   =   formatter.format(curDate);    
  522.         System.out.println("當前時間");  
  523.         return time;  
  524.         }  
  525.       
  526.     Handler handler=new Handler(){  
  527.   
  528.         @Override  
  529.         public void handleMessage(Message msg) {  
  530.             // TODO Auto-generated method stub   
  531.             super.handleMessage(msg);  
  532.               
  533.             myTextView1.setText("錄音時間:"+minute+":"+second);  
  534.         }  
  535.           
  536.     };  
  537.       
  538.     /** 
  539.      *  @param isAddLastRecord 是否需要添加list之外的最新錄音,一起合並 
  540.      *  @return 將合並的流用字符保存 
  541.      */  
  542.     public  void getInputCollection(List list,boolean isAddLastRecord){  
  543.           
  544.           
  545.         String  mMinute1=getTime();  
  546.         Toast.makeText(EX07.this"當前時間是:"+mMinute1,Toast.LENGTH_LONG).show();  
  547.           
  548.         // 創建音頻文件,合並的文件放這裡   
  549.         File file1=new File(myRecAudioDir,mMinute1+SUFFIX);  
  550.         FileOutputStream fileOutputStream = null;  
  551.            
  552.         if(!file1.exists()){  
  553.             try {  
  554.                 file1.createNewFile();  
  555.             } catch (IOException e) {  
  556.                 // TODO Auto-generated catch block   
  557.                 e.printStackTrace();  
  558.             }  
  559.         }  
  560.         try {  
  561.             fileOutputStream=new FileOutputStream(file1);  
  562.   
  563.         } catch (IOException e) {  
  564.             // TODO Auto-generated catch block   
  565.             e.printStackTrace();  
  566.         }  
  567.         //list裡面為暫停錄音 所產生的 幾段錄音文件的名字,中間幾段文件的減去前面的6個字節頭文件   
  568.           
  569.           
  570.           
  571.       
  572.         for(int i=0;i<list.size();i++){  
  573.             File file=new File((String) list.get(i));  
  574.         Log.d("list的長度", list.size()+"");  
  575.             try {  
  576.                 FileInputStream fileInputStream=new FileInputStream(file);  
  577.                 byte  []myByte=new byte[fileInputStream.available()];  
  578.                 //文件長度   
  579.                 int length = myByte.length;  
  580.           
  581.                 //頭文件   
  582.                 if(i==0){  
  583.                         while(fileInputStream.read(myByte)!=-1){  
  584.                                 fileOutputStream.write(myByte, 0,length);  
  585.                             }  
  586.                         }  
  587.                       
  588.                 //之後的文件,去掉頭文件就可以了   
  589.                 else{  
  590.                     while(fileInputStream.read(myByte)!=-1){  
  591.                           
  592.                         fileOutputStream.write(myByte, 6, length-6);  
  593.                     }  
  594.                 }  
  595.                   
  596.                 fileOutputStream.flush();  
  597.                 fileInputStream.close();  
  598.                 System.out.println("合成文件長度:"+file1.length());  
  599.               
  600.             } catch (Exception e) {  
  601.                 // TODO Auto-generated catch block   
  602.                 e.printStackTrace();  
  603.             }  
  604.               
  605.               
  606.               
  607.             }  
  608.         //結束後關閉流   
  609.         try {  
  610.             fileOutputStream.close();  
  611.         } catch (IOException e) {  
  612.             // TODO Auto-generated catch block   
  613.             e.printStackTrace();  
  614.         }  
  615.           
  616.             //加上當前正在錄音的這一段   
  617. //          if(isAddLastRecord){   
  618. //                 
  619. //                 
  620. //              //剛剛錄音的   
  621. //              try {   
  622. //                  FileInputStream fileInputStream=new FileInputStream(myRecAudioFile);   
  623. //                  byte  []myByte=new byte[fileInputStream.available()];   
  624. //                  System.out.println(fileInputStream.available()+"");   
  625. //                  while(fileInputStream.read(myByte)!=-1){   
  626. //                      //outputStream.   
  627. //                      fileOutputStream.write(myByte, 6, (fileInputStream.available()-6));   
  628. //                  }   
  629. //                     
  630. //                  fileOutputStream.flush();   
  631. //                  fileInputStream.close();   
  632. //                  fileOutputStream.close();   
  633. //                  System.out.println("合成文件長度:"+file1.length());   
  634. //              } catch (Exception e) {   
  635. //                  // TODO Auto-generated catch block   
  636. //                  e.printStackTrace();   
  637. //              }   
  638. //                 
  639. //          }   
  640.               
  641.           
  642.             //合成一個文件後,刪除之前暫停錄音所保存的零碎合成文件   
  643.             deleteListRecord(isAddLastRecord);  
  644.             //   
  645.             adapter.add(file1.getName());  
  646.       
  647.     }  
  648.       
  649.     private void deleteListRecord(boolean isAddLastRecord){  
  650.         for(int i=0;i<list.size();i++){  
  651.             File file=new File((String) list.get(i));  
  652.             if(file.exists()){  
  653.                 file.delete();  
  654.             }  
  655.         }  
  656.         //正在暫停後,繼續錄音的這一段音頻文件   
  657.         if(isAddLastRecord){  
  658.             myRecAudioFile.delete();  
  659.         }  
  660.     }  
  661. }  
Copyright © Linux教程網 All Rights Reserved