Thứ Sáu, 31 tháng 8, 2018

Android - Thu âm

Học lập trình Android có micrô tích hợp sẵn qua đó bạn có thể ghi âm và lưu trữ âm thanh hoặc phát trong điện thoại. Có rất nhiều cách để làm điều đó nhưng cách phổ biến nhất là thông qua lớp MediaRecorder.

Android cung cấp lớp MediaRecorder để ghi lại âm thanh hoặc video. Để sử dụng lớp MediaRecorder, trước tiên bạn sẽ tạo một thể hiện của lớp MediaRecorder. Cú pháp của nó được đưa ra dưới đây.
MediaRecorder myAudioRecorder = new MediaRecorder();
Bây giờ bạn sẽ thiết lập định dạng nguồn, đầu ra và mã hóa và tệp đầu ra. Cú pháp của họ được đưa ra dưới đây.
myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myAudioRecorder.setOutputFile(outputFile);
Sau khi xác định nguồn âm thanh và định dạng và tập tin đầu ra của nó, chúng ta có thể gọi hai phương thức cơ bản chuẩn bị và bắt đầu ghi âm.
myAudioRecorder.prepare();
myAudioRecorder.start();
Ngoài các phương pháp này, còn có các phương pháp khác được liệt kê trong lớp MediaRecorder cho phép bạn kiểm soát nhiều hơn đối với ghi âm và quay video.

Sr.NoPhương pháp & mô tả
1setAudioSource ()

Phương pháp này chỉ định nguồn âm thanh cần ghi
2setVideoSource ()

Phương pháp này chỉ định nguồn của video sẽ được ghi lại
3setOutputFormat ()

Phương pháp này chỉ định định dạng âm thanh trong đó âm thanh được lưu trữ
4setAudioEncoder ()

Phương pháp này chỉ định bộ mã hóa âm thanh sẽ được sử dụng
5setOutputFile ()

Phương pháp này cấu hình đường dẫn đến tệp mà âm thanh đã ghi được lưu trữ
6dừng lại()

Phương pháp này dừng quá trình ghi âm.
7giải phóng()

Phương pháp này nên được gọi khi cần thiết cho máy ghi.
Thí dụ

Ví dụ này cung cấp trình diễn lớp MediaRecorder để ghi lại âm thanh và sau đó là lớp MediaPlayer để phát âm thanh đã ghi.

Để thử nghiệm với ví dụ này, bạn cần chạy trên một thiết bị thực tế.

Các bướcSự miêu tả
1Bạn sẽ sử dụng Android studio IDE để tạo một ứng dụng Android và đặt tên nó là AudioCapture theo một gói com.example.sairamkrishna.myapplication.
2Sửa đổi tệp src / MainActivity.java để thêm mã AudioCapture
3Sửa đổi tệp XML bố trí res / layout / activity_main.xml thêm bất kỳ thành phần GUI nào nếu cần.
4Sửa đổi AndroidManifest.xml để thêm các quyền cần thiết.
5Chạy ứng dụng và chọn một thiết bị Android đang chạy và cài đặt ứng dụng trên đó và xác minh kết quả.
Đây là nội dung của src / MainActivity.java
package com.example.sairamkrishna.myapplication;

import android.media.MediaPlayer;
import android.media.MediaRecorder;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.Random;

import static android.Manifest.permission.RECORD_AUDIO;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

import android.support.v4.app.ActivityCompat;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

   Button buttonStart, buttonStop, buttonPlayLastRecordAudio, 
      buttonStopPlayingRecording ;
   String AudioSavePathInDevice = null;
   MediaRecorder mediaRecorder ;
   Random random ;
   String RandomAudioFileName = "ABCDEFGHIJKLMNOP";
   public static final int RequestPermissionCode = 1;
   MediaPlayer mediaPlayer ;

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

      buttonStart = (Button) findViewById(R.id.button);
      buttonStop = (Button) findViewById(R.id.button2);
      buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);
      buttonStopPlayingRecording = (Button)findViewById(R.id.button4);

      buttonStop.setEnabled(false);
      buttonPlayLastRecordAudio.setEnabled(false);
      buttonStopPlayingRecording.setEnabled(false);

      random = new Random();

      buttonStart.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {

            if(checkPermission()) {

               AudioSavePathInDevice = 
                  Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + 
                     CreateRandomAudioFileName(5) + "AudioRecording.3gp";

               MediaRecorderReady();

               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();
               }

               buttonStart.setEnabled(false);
               buttonStop.setEnabled(true);

               Toast.makeText(MainActivity.this, "Recording started", 
                  Toast.LENGTH_LONG).show();
            } else {
               requestPermission();
            }

         }
      });

      buttonStop.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
            mediaRecorder.stop();
            buttonStop.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);
            buttonStart.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);

            Toast.makeText(MainActivity.this, "Recording Completed", 
               Toast.LENGTH_LONG).show();
         }
      });

      buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) throws IllegalArgumentException, 
            SecurityException, IllegalStateException {
               
            buttonStop.setEnabled(false);
            buttonStart.setEnabled(false);
            buttonStopPlayingRecording.setEnabled(true);

            mediaPlayer = new MediaPlayer();
            try {
               mediaPlayer.setDataSource(AudioSavePathInDevice);
               mediaPlayer.prepare();
            } catch (IOException e) {
               e.printStackTrace();
            }

            mediaPlayer.start();
            Toast.makeText(MainActivity.this, "Recording Playing", 
               Toast.LENGTH_LONG).show();
         }
      });

      buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
            buttonStop.setEnabled(false);
            buttonStart.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);

            if(mediaPlayer != null){
               mediaPlayer.stop();
               mediaPlayer.release();
               MediaRecorderReady();
            }
         }
      });
      
   }

   public void MediaRecorderReady(){
      mediaRecorder=new MediaRecorder();
      mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
      mediaRecorder.setOutputFile(AudioSavePathInDevice);
   }

   public String CreateRandomAudioFileName(int string){
      StringBuilder stringBuilder = new StringBuilder( string );
      int i = 0 ;
      while(i < string ) {   
         stringBuilder.append(RandomAudioFileName.
            charAt(random.nextInt(RandomAudioFileName.length())));

         i++ ;
      }
      return stringBuilder.toString();
   }

   private void requestPermission() {
      ActivityCompat.requestPermissions(MainActivity.this, new 
         String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
   }

   @Override
   public void onRequestPermissionsResult(int requestCode, 
      String permissions[], int[] grantResults) {
      switch (requestCode) {
         case RequestPermissionCode:
            if (grantResults.length> 0) {
            boolean StoragePermission = grantResults[0] == 
               PackageManager.PERMISSION_GRANTED;
            boolean RecordPermission = grantResults[1] == 
               PackageManager.PERMISSION_GRANTED;
                     
            if (StoragePermission && RecordPermission) {
               Toast.makeText(MainActivity.this, "Permission Granted", 
                  Toast.LENGTH_LONG).show();
            } else {
               Toast.makeText(MainActivity.this,"Permission 
                  Denied",Toast.LENGTH_LONG).show();
            }
         }
         break;
      }
   }

   public boolean checkPermission() {
      int result = ContextCompat.checkSelfPermission(getApplicationContext(), 
         WRITE_EXTERNAL_STORAGE);
      int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), 
         RECORD_AUDIO);
      return result == PackageManager.PERMISSION_GRANTED && 
         result1 == PackageManager.PERMISSION_GRANTED;
   }
}
Đây là nội dung của activity_main.xml

Trong đoạn mã dưới đây abc biểu thị logo của hướng dẫn
<?xml version="1.0" encoding="utf-8"?>
<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"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin">

   <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageView"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:src="@drawable/abc"/>

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Record"
      android:id="@+id/button"
      android:layout_below="@+id/imageView"
      android:layout_alignParentLeft="true"
      android:layout_marginTop="37dp"
   />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="STOP"
      android:id="@+id/button2"
      android:layout_alignTop="@+id/button"
      android:layout_centerHorizontal="true"
   />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Play"
      android:id="@+id/button3"
      android:layout_alignTop="@+id/button2"
      android:layout_alignParentRight="true"
      android:layout_alignParentEnd="true"
   />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="STOP PLAYING RECORDING "
      android:id="@+id/button4"
      android:layout_below="@+id/button2"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="10dp" 
   />
</RelativeLayout>
Đây là nội dung của Strings.xml
<resources>
   <string name="app_name">My Application</string>
</resources>
Đây là nội dung của AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.sairamkrishna.myapplication" >
   
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
 <uses-permission android:name="android.permission.STORAGE" /> 

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name="com.example.sairamkrishna.myapplication.MainActivity"
         android:label="@string/app_name" >
      
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      
      </activity>
      
   </application>
</manifest>
Hãy thử chạy ứng dụng của bạn. Tôi cho rằng bạn đã kết nối thiết bị Android Mobile thực tế với máy tính của mình. Để chạy ứng dụng từ Android studio, hãy mở một trong các tệp hoạt động của dự án của bạn và nhấp vào biểu tượng Chạy từ thanh công cụ. Trước khi bắt đầu ứng dụng của bạn, Android studio sẽ hiển thị các hình ảnh sau.

Bây giờ theo mặc định, bạn sẽ thấy nút dừng và phát vô hiệu hóa. Chỉ cần nhấn nút Ghi và ứng dụng của bạn sẽ bắt đầu ghi âm. Nó sẽ hiển thị màn hình sau đây.

học lập trình Android

Bây giờ chỉ cần nhấn nút dừng và nó sẽ lưu âm thanh được ghi vào thẻ sd bên ngoài. Khi bạn nhấp vào nút dừng, màn hình sau sẽ xuất hiện.

Học lập trình Android

Bây giờ chỉ cần nhấn nút phát và âm thanh đã ghi sẽ chỉ bắt đầu phát trên thiết bị. Thông báo sau xuất hiện khi bạn nhấp vào nút phát.
lập trình Android

Không có nhận xét nào:

Đăng nhận xét

Lập trình Android - RenderScript

Trong chương này, chúng ta sẽ tìm hiểu về Android RenderScript. Thông thường các ứng dụng trên Android được thiết kế để tiêu thụ tài nguyên ...