/* AudioRecorder.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.Manifest; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.MediaRecorder; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.ResultReceiver; import android.provider.MediaStore; import android.provider.MediaStore.Video; import android.support.annotation.NonNull; import android.view.MotionEvent; import android.view.Window; import org.deviceconnect.android.activity.PermissionUtility; import org.deviceconnect.android.deviceplugin.host.R; import org.deviceconnect.android.deviceplugin.host.file.HostFileProvider; import org.deviceconnect.android.provider.FileManager; import java.io.File; import java.io.IOException; /** * AudioRecorder. * * @author NTT DOCOMO, INC. */ public class AudioRecorderActivity extends Activity { /** MediaRecoder. */ private MediaRecorder mMediaRecorder; /** ファイル名. */ private String mFileName; /** フォルダURI. */ private File mFile; /** コールバック。 */ private ResultReceiver mCallback; /** 開始インテント */ private Intent mIntent; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.audio_main); mIntent = getIntent(); if (mIntent == null) { finish(); return; } mCallback = mIntent.getParcelableExtra(AudioConst.EXTRA_CALLBACK); if (mCallback == null) { finish(); return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PermissionUtility.requestPermissions(this, new Handler(), new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionUtility.PermissionRequestCallback() { @Override public void onSuccess() { try { initAudioContext(); } catch (Exception e) { releaseMediaRecorder(); Bundle data = new Bundle(); data.putString(AudioConst.EXTRA_CALLBACK_ERROR_MESSAGE, e.getClass().getSimpleName() + ": " + e.getLocalizedMessage()); mCallback.send(Activity.RESULT_CANCELED, data); finish(); return; } mCallback.send(Activity.RESULT_OK, null); } @Override public void onFail(@NonNull String deniedPermission) { Bundle data = new Bundle(); data.putString(AudioConst.EXTRA_CALLBACK_ERROR_MESSAGE, "Permission " + deniedPermission + " not granted."); mCallback.send(Activity.RESULT_CANCELED, data); finish(); } }); } else { try { initAudioContext(); } catch (Exception e) { releaseMediaRecorder(); Bundle data = new Bundle(); data.putString(AudioConst.EXTRA_CALLBACK_ERROR_MESSAGE, e.getClass().getSimpleName() + ": " + e.getLocalizedMessage()); mCallback.send(Activity.RESULT_CANCELED, data); finish(); return; } mCallback.send(Activity.RESULT_OK, null); } } private void initAudioContext() throws IOException { FileManager fileMgr = new FileManager(this, HostFileProvider.class.getName()); mMediaRecorder = new MediaRecorder(); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mFileName = mIntent.getStringExtra(AudioConst.EXTRA_FINE_NAME); if (mFileName != null) { mFile = new File(fileMgr.getBasePath(), mFileName); mMediaRecorder.setOutputFile(mFile.toString()); mMediaRecorder.prepare(); mMediaRecorder.start(); } else { Bundle data = new Bundle(); data.putString(AudioConst.EXTRA_CALLBACK_ERROR_MESSAGE, "File name must be specified."); mCallback.send(Activity.RESULT_CANCELED, data); finish(); } } @Override protected void onResume() { super.onResume(); // 受信を開始 IntentFilter filter = new IntentFilter(); filter.addAction(AudioConst.SEND_HOSTDP_TO_AUDIO); registerReceiver(mReceiver, filter); } @Override protected void onPause() { super.onPause(); // 受信を停止. unregisterReceiver(mReceiver); if (checkAudioFile()) { // Contents Providerに登録. ContentResolver resolver = this.getApplicationContext().getContentResolver(); ContentValues values = new ContentValues(); values.put(Video.Media.TITLE, mFileName); values.put(Video.Media.DISPLAY_NAME, mFileName); values.put(Video.Media.ARTIST, "DeviceConnect"); values.put(Video.Media.MIME_TYPE, AudioConst.FORMAT_TYPE); values.put(Video.Media.DATA, mFile.toString()); resolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values); } releaseMediaRecorder(); } /** * Check the existence of file. * * @return true is exist */ private boolean checkAudioFile() { return mFile != null && mFile.exists() && mFile.length() > 0; } /** * MediaRecorderを解放. */ private void releaseMediaRecorder() { if (mMediaRecorder != null) { mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } } @Override public boolean onTouchEvent(final MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { mMediaRecorder.stop(); releaseMediaRecorder(); finish(); } return true; } /** * 受信用Receiver. */ private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { if (intent.getAction().equals((AudioConst.SEND_HOSTDP_TO_AUDIO))) { String videoAction = intent.getStringExtra(AudioConst.EXTRA_NAME); if (videoAction.equals(AudioConst.EXTRA_NAME_AUDIO_RECORD_STOP)) { mMediaRecorder.stop(); releaseMediaRecorder(); finish(); } } } }; }