استریمینگ صدا در اپلیکیشن اندروید

گام به گام تا پیاده سازی Audio Streaming در اپلیکیشن اندروید


برای استریمینگ صدا نیاز است تا به صورت مداوم از یک منبع ریموت داده دریافت کرده و آن را در اختیار کاربر نهایی قرار دهید. این روزها کاربران بیشماری به طور روزانه از پلتفرم های استریمینگ می کنند، برای مثال یوتیوب یک پلتفرم استریمینگ ویدیو محسوب می شود و در این مطلب آموزشی قصد داریم به نحوه پیاده سازی استریمینگ صدا در اپلیکیشن اندروید بپردازیم.

جهت پیاده سازی استریمینگ صدا در اپلیکیشن اندروید از MediaPlayer API از Android SDK استفاده می کنیم. همانطور که در مستندات رسمی اندروید نیز اشاره شده، کلاس MediaPlayer را می توان برای کنترل پلی بک فایل ها و استریم های صدا/ویدیو مورد استفاده قرار داد.

ساخت رابط کاربری

اول از همه لازم است یک رابط کاربری ساده با یک دکمه بسازیم که برای اجرا یا متوقف کردن استریم صدا مورد استفاده قرار خواهد گرفت:

<?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:id="@+id/activity_main"

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"

tools:context="com.ssaurel.audiostreaming.MainActivity">

<ImageView

android:id="@+id/logo"

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_marginTop="40dp"

android:src="@drawable/logo_ssaurel_round"

android:layout_centerHorizontal="true"/>

<Button

android:id="@+id/audioStreamBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/logo"

android:layout_marginTop="70dp"

android:textSize="18sp"

android:text="Launch Streaming"

android:layout_centerHorizontal="true"/>

</RelativeLayout>

نوشتن کد جاوا

در این مرحله می توانیم کد جاوای Main Activity را بنویسیم. در متد onCreate یک آبجکت MediaPlayer می سازیم و نوع استریم صدای مورد استفاده را تعیین می کنیم، در اینجا از مقدار ثابت AudioManger.STREAM_MUSIC استفاده خواهد شد. پس از آن یک ProgressDialog می سازیم که برای نمایش پیام انتظار به کاربر نهایی، هنگام بافر شدن استریم صدا مورد استفاده قرار خواهد گرفت.

یک OnClickListener بر روی دکمه اپلیکیشن قرار می دهیم و وقتی که کاربر بر روی این دکمه کلیک می کند، وضعیت استریم صدا چک می شود. اگر در حالت توقف قرار داشت، باید استریمینگ صدا را آغاز کنیم. در این شرایط دو احتمال وجود دارد، اول اینکه ارتباط بین اپلیکیشن و منبع ریموت صدا برای استریم برقرار نشده باشد که در این شرایط باید باید ارتباط را در یک Thread مجزا و با استفاده از Player AsyncTask برقرار کنیم.

در شرایطی که استرمینگ صدا متوقف شده باشد، باید با فراخوانی متد start از MediaPlayer که در قبل نمونه اولیه آن ساخته شده، آن را ری استارت نماییم. اگر در حالت پلی قرار داشته باشیم، باید MediaPlayer را با فراخوانی متد pause متوقف کنیم.

Player AsyncTask

همانطور که قبلا نیز گفته شد، برای وصل کردن MediaPlayer به منبع ریموت صدا، به یک AsyncTask نیاز داریم. در متد doInBackgroud که در یک Thread مجزا از UI Thread به اجرا درآمده، منبع داده برای استریم در MediaPlayer را مشخص می کنیم.

پس از آن یک OnCompletionListener بر روی MediaPlayer ست می کنیم. وقتی که MediaPlayer صدای استریم را متقوف می کند، باید متد stop از MediaPlayer و سپس متد reset برای استریم های بعدی بر روی این آبجکت را فراخوانی کنیم.

در آخر متد prepare از MediaPlayer را که برای وصل کردن MediaPlayer به منبع ریموت صدا استفاده می شود، فراخوانی می کنیم.

توجه داشته باشید که در متد onPreExecute از Player AsyncTask، یک ProgressDialog را به کاربر نهایی نمایش می دهیم و در متد onPostExecute، همان ProgressDialog را مخفی می کنیم و استریمینگ صدا را با فراخوانی متد start از MediaPlayer شروع می کنیم.

کل کدهای Main Activity و Player AsyncTask به صورت زیر می باشد:

package com.ssaurel.audiostreaming;

import android.app.ProgressDialog;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.os.AsyncTask;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private Button btn;

private boolean playPause;

private MediaPlayer mediaPlayer;

private ProgressDialog progressDialog;

private boolean initialStage = true;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn = (Button) findViewById(R.id.audioStreamBtn);

mediaPlayer = new MediaPlayer();

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

progressDialog = new ProgressDialog(this);

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

if (!playPause) {

btn.setText("Pause Streaming");

if (initialStage) {

new Player().execute("https://www.ssaurel.com/tmp/mymusic.mp3");

} else {

if (!mediaPlayer.isPlaying())

mediaPlayer.start();

}

playPause = true;

} else {

btn.setText("Launch Streaming");

if (mediaPlayer.isPlaying()) {

mediaPlayer.pause();

}

playPause = false;

}

}

});

}

@Override

protected void onPause() {

super.onPause();

if (mediaPlayer != null) {

mediaPlayer.reset();

mediaPlayer.release();

mediaPlayer = null;

}

}

class Player extends AsyncTask<String, Void, Boolean> {

@Override

protected Boolean doInBackground(String... strings) {

Boolean prepared = false;

try {

mediaPlayer.setDataSource(strings[0]);

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mediaPlayer) {

initialStage = true;

playPause = false;

btn.setText("Launch Streaming");

mediaPlayer.stop();

mediaPlayer.reset();

}

});

mediaPlayer.prepare();

prepared = true;

} catch (Exception e) {

Log.e("MyAudioStreamingApp", e.getMessage());

prepared = false;

}

return prepared;

}

@Override

protected void onPostExecute(Boolean aBoolean) {

super.onPostExecute(aBoolean);

if (progressDialog.isShowing()) {

progressDialog.cancel();

}

mediaPlayer.start();

initialStage = false;

}

@Override

protected void onPreExecute() {

super.onPreExecute();

progressDialog.setMessage("Buffering...");

progressDialog.show();

}

}

}

آخرین مرحله تست کردن اپلیکیشن اندروید و لذت بردن از نتیجه نهایی با استریم شدن Audio Music File می باشد:

استریمینگ صدا در اپلیکیشن اندروید

 

https://android.jlelse.eu برگرفته از

اینها را هم بخوانید