最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android編程實現(xiàn)錄音及保存播放功能的方法【附demo源碼下載】

 更新時間:2018年01月29日 13:57:58   作者:總有刁民想愛朕  
這篇文章主要介紹了Android編程實現(xiàn)錄音及保存播放功能的方法,結(jié)合實例形式分析了Android基于MediaRecorder類進行錄音機保存播放功能的相關(guān)操作技巧,并附帶demo源碼供讀者下載,需要的朋友可以參考下

本文實例講述了Android編程實現(xiàn)錄音及保存播放功能的方法。分享給大家供大家參考,具體如下:

在android中進行錄音相對來說是比較簡單的,使用系統(tǒng)提供的MediaRecorder類進行錄音并保存,然后調(diào)用MediaPlayer進行播放。以下為xml配置文件代碼:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.example.kk.soundrecording.MainActivity" >
  <Button
    android:id="@+id/start"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/start" />
  <Button
    android:id="@+id/stop"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/start"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/stop" />
  <Button
    android:id="@+id/paly"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/stop"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/paly" />
  <Button
    android:id="@+id/pause_paly"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/paly"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/pause_paly" />
  <Button
    android:id="@+id/stop_paly"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/pause_paly"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:text="@string/stop_paly" />
</RelativeLayout>

在MainActivity中進行錄音,代碼如下:

package com.example.kk.soundrecording;
import java.io.File;
import java.io.IOException;
import com.example.kk.util.RecordPlayer;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
 *
 * @author kk
 *
 */
public class MainActivity extends Activity implements OnClickListener {
  // 開始錄音
  private Button start;
  // 停止按鈕
  private Button stop;
  // 播放按鈕
  private Button paly;
  // 暫停播放
  private Button pause_paly;
  // 停止播放
  private Button stop_paly;
  // 錄音類
  private MediaRecorder mediaRecorder;
  // 以文件的形式保存
  private File recordFile;
  private RecordPlayer player;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recordFile = new File("/mnt/sdcard", "kk.amr");
    initView();
    Listener();
  }
  private void initView() {
    start = (Button) findViewById(R.id.start);
    stop = (Button) findViewById(R.id.stop);
    paly = (Button) findViewById(R.id.paly);
    pause_paly = (Button) findViewById(R.id.pause_paly);
    stop_paly = (Button) findViewById(R.id.stop_paly);
  }
  private void Listener() {
    start.setOnClickListener(this);
    stop.setOnClickListener(this);
    paly.setOnClickListener(this);
    pause_paly.setOnClickListener(this);
    stop_paly.setOnClickListener(this);
  }
  @Override
  public void onClick(View v) {
    player = new RecordPlayer(MainActivity.this);
    int Id = v.getId();
    switch (Id) {
    case R.id.start:
      startRecording();
      break;
    case R.id.stop:
      stopRecording();
      break;
    case R.id.paly:
      playRecording();
      break;
    case R.id.pause_paly:
      pauseplayer();
      break;
    case R.id.stop_paly:
      stopplayer();
      break;
    }
  }
  private void startRecording() {
    mediaRecorder = new MediaRecorder();
    // 判斷,若當前文件已存在,則刪除
    if (recordFile.exists()) {
      recordFile.delete();
    }
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    mediaRecorder.setOutputFile(recordFile.getAbsolutePath());
    try {
      // 準備好開始錄音
      mediaRecorder.prepare();
      mediaRecorder.start();
    } catch (IllegalStateException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  private void stopRecording() {
    if (recordFile != null) {
      mediaRecorder.stop();
      mediaRecorder.release();
    }
  }
  private void playRecording() {
    player.playRecordFile(recordFile);
  }
  private void pauseplayer() {
    player.pausePalyer();
  }
  private void stopplayer() {
    // TODO Auto-generated method stub
    player.stopPalyer();
  }
}

同時,新建一個RecordPlayer類,用來播放保存好的錄音,如下:

package com.example.kk.util;
import java.io.File;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;
import com.example.kk.soundrecording.R;
/**
 *
 *
 * @author kk  錄音播放類
 *
 */
public class RecordPlayer {
  private static MediaPlayer mediaPlayer;
  private Context mcontext;
  public RecordPlayer(Context context) {
    this.mcontext = context;
  }
  // 播放錄音文件
  public void playRecordFile(File file) {
    if (file.exists() && file != null) {
      if (mediaPlayer == null) {
        Uri uri = Uri.fromFile(file);
        mediaPlayer = MediaPlayer.create(mcontext, uri);
      }
      mediaPlayer.start();
      //監(jiān)聽MediaPlayer播放完成
      mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer paramMediaPlayer) {
          // TODO Auto-generated method stub
          //彈窗提示
          Toast.makeText(mcontext,
              mcontext.getResources().getString(R.string.ok),
              Toast.LENGTH_SHORT).show();
        }
      });
    }
  }
  // 暫停播放錄音
  public void pausePalyer() {
    if (mediaPlayer.isPlaying()) {
      mediaPlayer.pause();
      Log.e("TAG", "暫停播放");
    }
  }
  // 停止播放錄音
  public void stopPalyer() {
    // 這里不調(diào)用stop(),調(diào)用seekto(0),把播放進度還原到最開始
    if (mediaPlayer.isPlaying()) {
      mediaPlayer.pause();
      mediaPlayer.seekTo(0);
      Log.e("TAG", "停止播放");
    }
  }
}

此時,功能代碼都已實現(xiàn),但是運行時會報錯!為什么呢,這個是被很多初學者會忘記的,那就是android開發(fā)中調(diào)用相應(yīng)的功能時,必須在主配置文件中授予相應(yīng)的權(quán)限,在配置文件中添加如下代碼:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

另外,Android權(quán)限控制的詳細說明可以參考Android Manifest功能與權(quán)限描述大全

附:Demo源碼點擊此處本站下載。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Android自定義LocationMarker的實現(xiàn)詳解

    Android自定義LocationMarker的實現(xiàn)詳解

    這篇文章主要為大家詳細介紹一個比較簡單的東西:自定義繪制Marker 其實就是自定義view, 跟軌跡沒太多關(guān)聯(lián),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-02-02
  • Android的支付密碼輸入框?qū)崿F(xiàn)淺析

    Android的支付密碼輸入框?qū)崿F(xiàn)淺析

    現(xiàn)在有很多的應(yīng)用都有支付密碼功能,而支付密碼的密碼輸入框確實一個很好玩的控件。雖然網(wǎng)上有很多例子,但是抽時間自己設(shè)計一個未嘗不可啊,下面來一起看看吧,有需要的朋友們可以參考學習。
    2016-09-09
  • Android 6.0 藍牙搜索不到設(shè)備原因,MIUI權(quán)限申請機制方法

    Android 6.0 藍牙搜索不到設(shè)備原因,MIUI權(quán)限申請機制方法

    今天小編就為大家分享一篇Android6.0 藍牙搜索不到設(shè)備原因,MIUI權(quán)限申請機制方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Android開發(fā)之滑動圖片輪播標題焦點

    Android開發(fā)之滑動圖片輪播標題焦點

    這篇文章主要介紹了Android開發(fā)之滑動圖片輪播標題焦點的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Android自定義attr的各種坑

    Android自定義attr的各種坑

    開發(fā)過程中經(jīng)常會自定義View來實現(xiàn)各種各樣炫酷的效果,在實現(xiàn)這些效果的同時,我們往往會定義很多attr屬性這篇文章主要介紹了Android自定義attr的各種坑,需要的朋友可以參考下
    2016-04-04
  • Android 動畫實現(xiàn)幾種方案

    Android 動畫實現(xiàn)幾種方案

    這篇文章主要介紹了Android 動畫實現(xiàn)幾種方案的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 利用MVC編寫廣告條輪播效果

    利用MVC編寫廣告條輪播效果

    這篇文章主要為大家詳細介紹了利用MVC編寫廣告條輪播效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 用MOB實例開發(fā)實現(xiàn)短信驗證功能

    用MOB實例開發(fā)實現(xiàn)短信驗證功能

    本篇文章通學習通過MOB平臺開發(fā)APP實現(xiàn)簡單的短信驗證功能,對此有需求的朋友跟著好好學習下吧。
    2018-01-01
  • Kotlin協(xié)程flowOn與線程切換超詳細示例介紹

    Kotlin協(xié)程flowOn與線程切換超詳細示例介紹

    這篇文章主要介紹了Kotlin協(xié)程flowOn與線程切換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • Android適配底部虛擬按鍵的方法詳解

    Android適配底部虛擬按鍵的方法詳解

    今天小編就為大家分享一篇Android適配底部虛擬按鍵的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評論

石狮市| 裕民县| 洮南市| 丹东市| 墨玉县| 保康县| 涿州市| 获嘉县| 东平县| 洛南县| 芜湖县| 荣昌县| 江山市| 黑水县| 柞水县| 镇远县| 黔东| 集安市| 龙井市| 浙江省| 张家港市| 宁乡县| 姚安县| 抚宁县| 晋中市| 宁强县| 黄陵县| 阿克陶县| 东港市| 天津市| 抚顺市| 贞丰县| 金溪县| 黑龙江省| 永年县| 深圳市| 中山市| 乐陵市| 佳木斯市| 乌拉特后旗| 洛川县|