Simple Android audio view with a few controls. Basically it's a MediaPlayer wrapper. You can choose AudioView2 and start a AudioService to start MediaPlayer in service. See below for more info (and demo app).
- Add dependency
dependencies {
implementation 'com.4ert:audioview:0.4'
}
- Add layout
<com.keenfin.audioview.AudioView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
- Set file data source
audioView.setDataSource("/path/to/file");
audioView.setDataSource(Uri);
audioView.setDataSource(FileDescriptor);
audioView.setDataSource(List<String/Uri/FileDescriptor>);
- Control playback if needed
audioView.start();
audioView.pause();
audioView.stop();
Multiple AudioView2 with different tags can attach to service and play through it, but only one at a time. It's useful while placing AudioView2 in list or recycler view.
- Create AudioView2 in xml or by code
<com.keenfin.audioview.AudioView2
android:id="@+id/audioview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
- Start AudioService to handle playback
Intent audioService = new Intent(this, AudioService.class);
audioService.setAction(AudioService.ACTION_START_AUDIO);
startService(audioService);
- Assign tag for view and attach to service
AudioView2 audio = itemView.findViewById(R.id.audioview);
audio.setTag(position);
if (!audio.attached())
audio.setUpControls();
try {
audio.setDataSource(object.getPath());
} catch (IOException ignored) {
}
- Stop service when you do not need it anymore
Intent audioService = new Intent(this, AudioService.class);
stopService(audioService);
You can attach to AudioService to implement your own view or other behaviour.
- Add service connection
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mService = ((AudioService.AudioServiceBinder) iBinder).getService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mService = null;
}
};
- Bind/unbind to service
private void bindAudioService() {
Intent intent = new Intent(getContext(), AudioService.class);
getContext().bindService(intent, mServiceConnection, 0);
}
private void unbindAudioService() {
try {
getContext().unbindService(mServiceConnection);
} catch (Exception ignored) {
}
}
- Add broadcast receiver to handle events
private BroadcastReceiver mAudioReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra("status", -1);
int status = intent.getIntExtra("tag", -1);
switch (status) {
case AUDIO_PREPARED:
case AUDIO_STARTED:
case AUDIO_PAUSED:
case AUDIO_STOPPED:
case AUDIO_PROGRESS_UPDATED:
case AUDIO_COMPLETED:
case AUDIO_TRACK_CHANGED:
break;
}
}
};
- Register/unregister receiver
private void registerAudioReceiver() {
getContext().registerReceiver(mAudioReceiver, filter);
}
private void unregisterAudioReceiver() {
try {
getContext().unregisterReceiver(mAudioReceiver);
} catch (Exception ignored) {
}
}
Set default color for FAB and SeekBar. By default it uses colorAccent from AppTheme.
Use alternative version of layout if true.
Show (true by default) or hide rewind/forward buttons. Not available if minified.
Show song's title if there is one. Default is true.
<com.keenfin.audioview.AudioView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:minified="true"
app:primaryColor="@android:color/holo_blue_ligh"
app:selectControls="false"
app:showTitle="false"/>
Loop playlist (or single file).