Skip to content

Commit 68fbfd8

Browse files
Merge pull request #632 from TakayukiHoshi1984/bugfix_host_audio_state
Hostの音声録音の終了イベントのステート調整
2 parents 3adc5c2 + ce8de08 commit 68fbfd8

4 files changed

Lines changed: 54 additions & 14 deletions

File tree

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/mediaplayer/VideoConst.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ private VideoConst() {
5656
public static final String EXTRA_RECORDER_ID = "recorderId";
5757
/** ServiceのID. */
5858
public static final String EXTRA_SERVICE_ID = "serviceId";
59+
/** uri. */
60+
public static final String EXTRA_URI = "uri";
5961

6062
/** Camera ID. */
6163
public static final String EXTRA_CAMERA_ID = "cameraId";

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/profile/HostMediaStreamingRecordingProfile.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,20 @@
77

88
package org.deviceconnect.android.deviceplugin.host.profile;
99

10+
import android.content.BroadcastReceiver;
11+
import android.content.Context;
1012
import android.content.Intent;
13+
import android.content.IntentFilter;
14+
import android.net.Uri;
1115
import android.os.Bundle;
1216
import android.os.Handler;
1317
import android.os.HandlerThread;
1418
import android.support.annotation.NonNull;
19+
import android.support.v4.content.LocalBroadcastManager;
20+
import android.util.Log;
1521

1622
import org.deviceconnect.android.activity.PermissionUtility;
23+
import org.deviceconnect.android.deviceplugin.host.mediaplayer.VideoConst;
1724
import org.deviceconnect.android.deviceplugin.host.recorder.AbstractPreviewServerProvider;
1825
import org.deviceconnect.android.deviceplugin.host.recorder.HostDevicePhotoRecorder;
1926
import org.deviceconnect.android.deviceplugin.host.recorder.HostDeviceRecorder;
@@ -35,12 +42,15 @@
3542
import org.deviceconnect.android.profile.api.PutApi;
3643
import org.deviceconnect.android.provider.FileManager;
3744
import org.deviceconnect.message.DConnectMessage;
45+
import org.deviceconnect.message.intent.message.IntentDConnectMessage;
3846

3947
import java.util.ArrayList;
4048
import java.util.LinkedList;
4149
import java.util.List;
4250
import java.util.concurrent.CountDownLatch;
4351

52+
import static org.deviceconnect.android.deviceplugin.host.mediaplayer.VideoConst.SEND_VIDEO_TO_HOSTDP;
53+
4454
/**
4555
* MediaStream Recording Profile.
4656
*
@@ -63,7 +73,24 @@ public class HostMediaStreamingRecordingProfile extends MediaStreamRecordingProf
6373
* ライト操作結果のリスナーを実行するハンドラー.
6474
*/
6575
private final Handler mLightHandler;
76+
/**
77+
* KeyEventProfileActivityからのKeyEventを中継するBroadcast Receiver.
78+
*/
79+
private BroadcastReceiver mAudioEventBR = new BroadcastReceiver() {
80+
@Override
81+
public void onReceive(final Context context, final Intent intent) {
82+
if (intent.getAction().equals(SEND_VIDEO_TO_HOSTDP)) {
6683

84+
String serviceId = intent.getStringExtra(VideoConst.EXTRA_SERVICE_ID);
85+
HostDeviceRecorder.RecorderState state =
86+
(HostDeviceRecorder.RecorderState) intent.getSerializableExtra(VideoConst.EXTRA_VIDEO_RECORDER_STATE);
87+
Uri uri = intent.getParcelableExtra(VideoConst.EXTRA_URI);
88+
String path = intent.getStringExtra(VideoConst.EXTRA_FILE_NAME);
89+
String u = uri != null ? uri.toString() : null;
90+
mRecorderMgr.sendEventForRecordingChange(serviceId, state, u, path, "audio/3gp", "");
91+
}
92+
}
93+
};
6794
private final DConnectApi mGetMediaRecorderApi = new GetApi() {
6895
@Override
6996
public String getAttribute() {
@@ -297,6 +324,10 @@ public String getAttribute() {
297324
public boolean onRequest(final Intent request, final Intent response) {
298325
EventError error = EventManager.INSTANCE.addEvent(request);
299326
if (error == EventError.NONE) {
327+
Log.d("ABC", "send:" + getServiceID(request));
328+
IntentFilter filter = new IntentFilter(VideoConst.SEND_VIDEO_TO_HOSTDP);
329+
LocalBroadcastManager.getInstance(getContext()).registerReceiver(mAudioEventBR, filter);
330+
300331
setResult(response, DConnectMessage.RESULT_OK);
301332
} else {
302333
setResult(response, DConnectMessage.RESULT_ERROR);
@@ -316,6 +347,7 @@ public String getAttribute() {
316347
public boolean onRequest(final Intent request, final Intent response) {
317348
EventError error = EventManager.INSTANCE.removeEvent(request);
318349
if (error == EventError.NONE) {
350+
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mAudioEventBR);
319351
setResult(response, DConnectMessage.RESULT_OK);
320352
} else {
321353
setResult(response, DConnectMessage.RESULT_ERROR);

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/audio/AudioRecorderActivity.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import android.content.Intent;
1717
import android.content.IntentFilter;
1818
import android.media.MediaRecorder;
19+
import android.net.Uri;
1920
import android.os.Build;
2021
import android.os.Bundle;
2122
import android.os.Handler;
2223
import android.os.ResultReceiver;
2324
import android.provider.MediaStore;
2425
import android.provider.MediaStore.Video;
2526
import android.support.annotation.NonNull;
27+
import android.support.v4.content.LocalBroadcastManager;
2628
import android.view.MotionEvent;
2729
import android.view.Window;
2830

@@ -68,7 +70,6 @@ protected void onCreate(final Bundle savedInstanceState) {
6870

6971
requestWindowFeature(Window.FEATURE_NO_TITLE);
7072
setContentView(R.layout.audio_main);
71-
7273
mIntent = getIntent();
7374
if (mIntent == null) {
7475
finish();
@@ -89,7 +90,7 @@ public void onSuccess() {
8990
try {
9091
initAudioContext();
9192
} catch (Exception e) {
92-
releaseMediaRecorder();
93+
releaseMediaRecorder(null);
9394

9495
Bundle data = new Bundle();
9596
data.putString(AudioConst.EXTRA_CALLBACK_ERROR_MESSAGE,
@@ -114,7 +115,7 @@ public void onFail(@NonNull String deniedPermission) {
114115
try {
115116
initAudioContext();
116117
} catch (Exception e) {
117-
releaseMediaRecorder();
118+
releaseMediaRecorder(null);
118119

119120
Bundle data = new Bundle();
120121
data.putString(AudioConst.EXTRA_CALLBACK_ERROR_MESSAGE,
@@ -138,6 +139,7 @@ private void initAudioContext() throws IOException {
138139
mFileName = mIntent.getStringExtra(AudioConst.EXTRA_FILE_NAME);
139140
mServiceId = mIntent.getStringExtra(AudioConst.EXTRA_SERVICE_ID);
140141
mRecorderId = mIntent.getStringExtra(VideoConst.EXTRA_RECORDER_ID);
142+
141143
if (mFileName != null) {
142144
mFile = new File(fileMgr.getBasePath(), mFileName);
143145
mMediaRecorder.setOutputFile(mFile.toString());
@@ -165,9 +167,10 @@ protected void onResume() {
165167
protected void onPause() {
166168
super.onPause();
167169

170+
168171
// 受信を停止.
169172
unregisterReceiver(mReceiver);
170-
173+
Uri uri = null;
171174
if (checkAudioFile()) {
172175
// Contents Providerに登録.
173176
ContentResolver resolver = this.getApplicationContext().getContentResolver();
@@ -177,9 +180,10 @@ protected void onPause() {
177180
values.put(Video.Media.ARTIST, "DeviceConnect");
178181
values.put(Video.Media.MIME_TYPE, AudioConst.FORMAT_TYPE);
179182
values.put(Video.Media.DATA, mFile.toString());
180-
resolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
183+
uri = resolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
181184
}
182-
releaseMediaRecorder();
185+
releaseMediaRecorder(uri);
186+
finish();
183187
}
184188

185189
/**
@@ -194,46 +198,45 @@ private boolean checkAudioFile() {
194198
/**
195199
* MediaRecorderを解放.
196200
*/
197-
private void releaseMediaRecorder() {
201+
private void releaseMediaRecorder(Uri uri) {
198202
if (mMediaRecorder != null) {
199203
mMediaRecorder.reset();
200204
mMediaRecorder.release();
201205
mMediaRecorder = null;
202206
}
203-
sendRecorderStateEvent(HostDeviceRecorder.RecorderState.INACTTIVE);
207+
sendRecorderStateEvent(uri, HostDeviceRecorder.RecorderState.INACTTIVE);
204208
}
205209

206210
@Override
207211
public boolean onTouchEvent(final MotionEvent event) {
208212
if (event.getAction() == MotionEvent.ACTION_DOWN) {
209213
mMediaRecorder.stop();
210-
releaseMediaRecorder();
211214
finish();
212215
}
213216
return true;
214217
}
215-
private void sendRecorderStateEvent(final HostDeviceRecorder.RecorderState state) {
218+
private void sendRecorderStateEvent(final Uri uri, final HostDeviceRecorder.RecorderState state) {
216219
Intent intent = new Intent(VideoConst.SEND_VIDEO_TO_HOSTDP);
217220
intent.putExtra(VideoConst.EXTRA_RECORDER_ID, mRecorderId);
218221
intent.putExtra(VideoConst.EXTRA_VIDEO_RECORDER_STATE, state);
219-
intent.putExtra(VideoConst.EXTRA_FILE_NAME, mFileName);
222+
intent.putExtra(VideoConst.EXTRA_FILE_NAME, "/" + mFileName);
220223
intent.putExtra(VideoConst.EXTRA_SERVICE_ID, mServiceId);
221-
sendBroadcast(intent);
224+
intent.putExtra(VideoConst.EXTRA_URI, uri);
225+
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
222226
}
223227
/**
224228
* 受信用Receiver.
225229
*/
226230
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
227231
@Override
228232
public void onReceive(final Context context, final Intent intent) {
229-
if (intent.getAction() == null) {
233+
if (intent.getAction() == null || mMediaRecorder == null) {
230234
return;
231235
}
232236
if (intent.getAction().equals((AudioConst.SEND_HOSTDP_TO_AUDIO))) {
233237
String videoAction = intent.getStringExtra(AudioConst.EXTRA_NAME);
234238
if (videoAction.equals(AudioConst.EXTRA_NAME_AUDIO_RECORD_STOP)) {
235239
mMediaRecorder.stop();
236-
releaseMediaRecorder();
237240
finish();
238241
}
239242
}

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/audio/HostDeviceAudioRecorder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public class HostDeviceAudioRecorder implements HostDeviceRecorder, HostDeviceSt
5757
private RecorderState mState;
5858
public HostDeviceAudioRecorder(final Context context) {
5959
mContext = context;
60+
mState = RecorderState.INACTTIVE;
6061
}
6162

6263
@Override
@@ -206,8 +207,10 @@ public synchronized void startRecording(final String serviceId, final RecordingL
206207
@Override
207208
protected void onReceiveResult(int resultCode, Bundle resultData) {
208209
if (resultCode == Activity.RESULT_OK) {
210+
mState = RecorderState.RECORDING;
209211
listener.onRecorded(HostDeviceAudioRecorder.this, mNowRecordingFileName);
210212
} else {
213+
mState = RecorderState.ERROR;
211214
String msg =
212215
resultData.getString(VideoConst.EXTRA_CALLBACK_ERROR_MESSAGE, "Unknown error.");
213216
listener.onFailed(HostDeviceAudioRecorder.this, msg);

0 commit comments

Comments
 (0)