/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codename1.media;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
import com.codename1.ui.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* This class is used when the media is been requested to run on the background
*
* @author Chen
*/
public class AudioService extends Service implements Media, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener, MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnInfoListener, MediaPlayer.OnBufferingUpdateListener {
private IBinder mBinder = new LocalBinder();
private MediaPlayer mediaPlayer = new MediaPlayer();
private String mediaLink;
private File tempFile;
@Override
public void onCreate() {
Log.d("CN1", "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mediaLink = intent.getExtras().getString("mediaLink");
Log.d("CN1", mediaLink);
Uri uri = null;
InputStream is = null;
if (mediaLink.startsWith("file://")) {
mediaLink = mediaLink.substring(7);
if (mediaLink.indexOf(':') < 0) {
File file = new File(mediaLink);
uri = Uri.fromFile(file);
}
} else if (mediaLink.startsWith("jar://")) {
mediaLink = mediaLink.substring(6);
if (mediaLink.startsWith("/")) {
mediaLink = mediaLink.substring(1);
}
try {
is = getAssets().open(mediaLink);
} catch (IOException ex) {
Log.e("CN1", "error", ex);
}
} else {
uri = Uri.parse(mediaLink);
}
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnSeekCompleteListener(this);
mediaPlayer.setOnInfoListener(this);
try {
if (uri != null) {
mediaPlayer.setDataSource(this, uri);
} else if (is != null) {
tempFile = File.createTempFile("mtmp", "dat");
tempFile.deleteOnExit();
OutputStream out = new FileOutputStream(tempFile);
byte buf[] = new byte[256];
int len = 0;
while ((len = is.read(buf, 0, buf.length)) > -1) {
out.write(buf, 0, len);
}
out.close();
is.close();
mediaPlayer.setDataSource(new FileInputStream(tempFile).getFD());
}
mediaPlayer.prepare();
} catch (Exception ex) {
Log.e("CN1", "error", ex);
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCompletion(MediaPlayer mp) {
pause();
if (tempFile != null) {
tempFile.delete();
}
stopSelf();
}
@Override
public void onPrepared(MediaPlayer mp) {
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
Toast.makeText(this,
"MEDIA ERROR NOT VALID FOR PROGRESSIVE PLAYBACK " + extra,
Toast.LENGTH_SHORT).show();
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Toast.makeText(this, "MEDIA ERROR SERVER DIED " + extra,
Toast.LENGTH_SHORT).show();
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
Toast.makeText(this, "MEDIA ERROR UNKNOWN " + extra,
Toast.LENGTH_SHORT).show();
break;
}
return false;
}
@Override
public void onSeekComplete(MediaPlayer mp) {
}
@Override
public boolean onInfo(MediaPlayer mp, int i, int i1) {
return false;
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int i) {
}
public void play() {
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}
@Override
public void pause() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
@Override
public void prepare() {
mediaPlayer.prepareAsync();
}
@Override
public void cleanup() {
pause();
mediaPlayer.release();
}
@Override
public int getTime() {
return mediaPlayer.getCurrentPosition();
}
@Override
public void setTime(int time) {
mediaPlayer.seekTo(time);
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public void setVolume(int vol) {
float v = ((float) vol) / 100.0F;
if (mediaPlayer != null) {
mediaPlayer.setVolume(v, v);
}
}
@Override
public int getVolume() {
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
return am.getStreamVolume(AudioManager.STREAM_MUSIC);
}
@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
@Override
public Component getVideoComponent() {
return null;
}
@Override
public boolean isVideo() {
return false;
}
@Override
public boolean isFullScreen() {
return false;
}
@Override
public void setFullScreen(boolean fullScreen) {
}
@Override
public void setNativePlayerMode(boolean nativePlayer) {
}
@Override
public boolean isNativePlayerMode() {
return true;
}
@Override
public void setVariable(String key, Object value) {
}
@Override
public Object getVariable(String key) {
return null;
}
public class LocalBinder extends Binder {
public AudioService getService() {
return AudioService.this;
}
}
}