/* HostDeviceAudioRecorder.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.host.recorder.audio; import android.app.Activity; import android.app.ActivityManager; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.ResultReceiver; import org.deviceconnect.android.deviceplugin.host.mediaplayer.VideoConst; import org.deviceconnect.android.deviceplugin.host.recorder.HostDeviceRecorder; import org.deviceconnect.android.deviceplugin.host.recorder.HostDeviceStreamRecorder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; /** * Host Device Audio Recorder. * * @author NTT DOCOMO, INC. */ public class HostDeviceAudioRecorder implements HostDeviceRecorder, HostDeviceStreamRecorder { private static final String ID = "audio"; private static final String NAME = "AndroidHost Audio Recorder"; private static final String MIME_TYPE = "audio/3gp"; private final SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyyMMdd_kkmmss", Locale.JAPAN); private final Context mContext; /** * マイムタイプ一覧を定義. */ private List<String> mMimeTypes = new ArrayList<String>() { { add("audio/3gp"); } }; public HostDeviceAudioRecorder(final Context context) { mContext = context; } @Override public void initialize() { // Nothing to do. } @Override public void clean() { stopRecording(); } @Override public String getId() { return ID; } @Override public String getName() { return NAME; } @Override public RecorderState getState() { String className = getClassnameOfTopActivity(); if (AudioRecorderActivity.class.getName().equals(className)) { return RecorderState.RECORDING; } else { return RecorderState.INACTTIVE; } } @Override public String getMimeType() { return MIME_TYPE; } @Override public PictureSize getPictureSize() { throw new UnsupportedOperationException(); } @Override public void setPictureSize(final PictureSize size) { throw new UnsupportedOperationException(); } @Override public PictureSize getPreviewSize() { throw new UnsupportedOperationException(); } @Override public void setPreviewSize(PictureSize size) { throw new UnsupportedOperationException(); } @Override public double getMaxFrameRate() { throw new UnsupportedOperationException(); } @Override public void setMaxFrameRate(double frameRate) { throw new UnsupportedOperationException(); } @Override public List<PictureSize> getSupportedPreviewSizes() { throw new UnsupportedOperationException(); } @Override public List<PictureSize> getSupportedPictureSizes() { throw new UnsupportedOperationException(); } @Override public boolean isSupportedPictureSize(int width, int height) { return false; } @Override public boolean isSupportedPreviewSize(int width, int height) { return false; } @Override public List<String> getSupportedMimeTypes() { return mMimeTypes; } @Override public boolean canPauseRecording() { return true; } @Override public synchronized void startRecording(final RecordingListener listener) { if (getState() == RecorderState.RECORDING) { throw new IllegalStateException(); } final String filename = generateAudioFileName(); Intent intent = new Intent(); intent.setClass(mContext, AudioRecorderActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(AudioConst.EXTRA_FINE_NAME, filename); intent.putExtra(AudioConst.EXTRA_CALLBACK, new ResultReceiver(new Handler(Looper.getMainLooper())) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (resultCode == Activity.RESULT_OK) { listener.onRecorded(HostDeviceAudioRecorder.this, filename); } else { String msg = resultData.getString(VideoConst.EXTRA_CALLBACK_ERROR_MESSAGE, "Unknown error."); listener.onFailed(HostDeviceAudioRecorder.this, msg); } } }); mContext.startActivity(intent); } @Override public synchronized void stopRecording() { Intent intent = new Intent(AudioConst.SEND_HOSTDP_TO_AUDIO); intent.putExtra(AudioConst.EXTRA_NAME, AudioConst.EXTRA_NAME_AUDIO_RECORD_STOP); mContext.sendBroadcast(intent); } @Override public void pauseRecording() { Intent intent = new Intent(AudioConst.SEND_HOSTDP_TO_AUDIO); intent.putExtra(AudioConst.EXTRA_NAME, AudioConst.EXTRA_NAME_AUDIO_RECORD_PAUSE); mContext.sendBroadcast(intent); } @Override public void resumeRecording() { Intent intent = new Intent(AudioConst.SEND_HOSTDP_TO_AUDIO); intent.putExtra(AudioConst.EXTRA_NAME, AudioConst.EXTRA_NAME_AUDIO_RECORD_RESUME); mContext.sendBroadcast(intent); } private String getClassnameOfTopActivity() { ActivityManager activityMgr = (ActivityManager) mContext.getSystemService(Service.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> tasks = activityMgr.getRunningTasks(1); if (tasks != null && tasks.size() > 0) { return tasks.get(0).topActivity.getClassName(); } return null; } private String generateAudioFileName() { return "audio" + mSimpleDateFormat.format(new Date()) + AudioConst.FORMAT_TYPE; } }