Commit 31ce8e95 authored by sheteng's avatar sheteng

停止播放音频

获取时长
权限修改
parent 53b7c52b
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
<option name="filePathToZoomLevelMap"> <option name="filePathToZoomLevelMap">
<map> <map>
<entry key="..\:/ccwangluo/ccim_sdk_android/app/src/main/res/layout/activity_login.xml" value="0.1612008072653885" /> <entry key="..\:/ccwangluo/ccim_sdk_android/app/src/main/res/layout/activity_login.xml" value="0.1612008072653885" />
<entry key="..\:/ccwangluo/ccim_sdk_android/app/src/main/res/layout/activity_main2.xml" value="0.1612008072653885" />
<entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_connect.xml" value="0.3170289855072464" /> <entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_connect.xml" value="0.3170289855072464" />
<entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_connect_channel.xml" value="0.26403985507246375" /> <entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_connect_channel.xml" value="0.26403985507246375" />
<entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_login.xml" value="0.322463768115942" /> <entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_login.xml" value="0.322463768115942" />
......
...@@ -64,7 +64,7 @@ dependencies { ...@@ -64,7 +64,7 @@ dependencies {
def room_version = "2.3.0" def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version"
implementation 'com.karumi:dexter:6.2.3' implementation 'com.guolindev.permissionx:permissionx:1.6.4'
......
...@@ -15,6 +15,7 @@ import com.ccwangluo.ccim.CCIMClient; ...@@ -15,6 +15,7 @@ import com.ccwangluo.ccim.CCIMClient;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.MessageContent; import com.ccwangluo.ccim.modle.MessageContent;
import com.ccwangluo.im.R; import com.ccwangluo.im.R;
import com.ccwangluo.im.util.ToastUtil;
import java.util.List; import java.util.List;
...@@ -97,6 +98,17 @@ public class PrivateMsgAdapter extends BaseAdapter { ...@@ -97,6 +98,17 @@ public class PrivateMsgAdapter extends BaseAdapter {
} }
}); });
// CCIMClient.getInstance().getAudioDuration(message.getMsgId(), new ResultEventCallback<Long>() {
// @Override
// public void onSuccess(Long aLong) {
// ToastUtil.show(context,aLong.toString());
// }
//
// @Override
// public void onFailed(int errorCode) {
//
// }
// });
} }
} }
}); });
......
...@@ -97,9 +97,12 @@ public class ConnectActivity extends AppCompatActivity { ...@@ -97,9 +97,12 @@ public class ConnectActivity extends AppCompatActivity {
}); });
} }
if (event.getAction() == MotionEvent.ACTION_DOWN) { if (event.getAction() == MotionEvent.ACTION_DOWN) {
CCIMClient.getInstance().startRecordAudioMessage(getApplication(), new ResultEventCallback<Void>() { CCIMClient.getInstance().startRecordAudioMessage(ConnectActivity.this,contact.getContactUserId(), contact.getContactUserName(), new ResultEventCallback<MessageContent>() {
@Override @Override
public void onSuccess(Void unused) { public void onSuccess(MessageContent unused) {
if (unused != null){
loginViewModel.addPrivateMsg(unused);
}
isSuccess = true; isSuccess = true;
} }
......
...@@ -110,9 +110,12 @@ public class ConnectChannelActivity extends AppCompatActivity { ...@@ -110,9 +110,12 @@ public class ConnectChannelActivity extends AppCompatActivity {
}); });
} }
if (event.getAction() == MotionEvent.ACTION_DOWN) { if (event.getAction() == MotionEvent.ACTION_DOWN) {
CCIMClient.getInstance().startRecordAudioMessage(ConnectChannelActivity.this, new ResultEventCallback<Void>() { CCIMClient.getInstance().startRecordChannelAudioMessage(ConnectChannelActivity.this,channelId, new ResultEventCallback<MessageContent>() {
@Override @Override
public void onSuccess(Void unused) { public void onSuccess(MessageContent unused) {
if (unused != null){
loginViewModel.addPrivateMsg(unused);
}
isSuccess = true; isSuccess = true;
} }
......
package com.ccwangluo.im.util; package com.ccwangluo.im.util;
import android.content.Context; import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast; import android.widget.Toast;
public class ToastUtil { import com.ccwangluo.ccim.CCIMClient;
private Handler handler = new Handler(Looper.getMainLooper()); public class ToastUtil {
public static void show(Context context, String msg) { public static void show(Context context, String msg) {
CCIMClient.getInstance().handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
}
});
} }
} }
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:hint="UserId" android:hint="UserId"
android:text="15" android:text="16"
android:imeActionLabel="@string/action_sign_in_short" android:imeActionLabel="@string/action_sign_in_short"
android:imeOptions="actionDone" android:imeOptions="actionDone"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
......
...@@ -58,6 +58,7 @@ protobuf { ...@@ -58,6 +58,7 @@ protobuf {
} }
} }
dependencies { dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.protobuf:protobuf-java:3.13.0' implementation 'com.google.protobuf:protobuf-java:3.13.0'
implementation 'com.google.protobuf:protobuf-java-util:3.12.0' implementation 'com.google.protobuf:protobuf-java-util:3.12.0'
implementation 'com.google.code.gson:gson:2.8.7' implementation 'com.google.code.gson:gson:2.8.7'
...@@ -66,6 +67,5 @@ dependencies { ...@@ -66,6 +67,5 @@ dependencies {
def room_version = "2.3.0" def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version"
implementation 'com.karumi:dexter:6.2.3' implementation 'com.karumi:dexter:6.2.3'
} }
\ No newline at end of file
...@@ -2,11 +2,12 @@ package com.ccwangluo.ccim; ...@@ -2,11 +2,12 @@ package com.ccwangluo.ccim;
import android.Manifest; import android.Manifest;
import android.content.Context; import android.content.Context;
import android.media.MediaPlayer;
import android.os.Environment; import android.os.Environment;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.ccwangluo.ccim.listener.OnClientConnectListener; import com.ccwangluo.ccim.listener.OnClientConnectListener;
import com.ccwangluo.ccim.listener.OnConnectListener; import com.ccwangluo.ccim.listener.OnConnectListener;
import com.ccwangluo.ccim.listener.OnPushMsgListener; import com.ccwangluo.ccim.listener.OnPushMsgListener;
...@@ -25,6 +26,7 @@ import com.ccwangluo.ccim.modle.SearchRes; ...@@ -25,6 +26,7 @@ import com.ccwangluo.ccim.modle.SearchRes;
import com.ccwangluo.ccim.modle.User; import com.ccwangluo.ccim.modle.User;
import com.ccwangluo.ccim.util.ErrorCode; import com.ccwangluo.ccim.util.ErrorCode;
import com.ccwangluo.ccim.util.MediaHelper; import com.ccwangluo.ccim.util.MediaHelper;
import com.ccwangluo.ccim.util.PermissionUtils;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.protobuf.util.JsonFormat; import com.google.protobuf.util.JsonFormat;
import com.karumi.dexter.Dexter; import com.karumi.dexter.Dexter;
...@@ -60,13 +62,13 @@ public class CCIMClient { ...@@ -60,13 +62,13 @@ public class CCIMClient {
private final int minAudioDuration = 500; private final int minAudioDuration = 500;
public String downloadPrefix; public String downloadPrefix;
public String cachePath; public String cachePath;
private Handler handler = new Handler(Looper.getMainLooper()); public Handler handler = new Handler(Looper.getMainLooper());
private ExecutorService executor = Executors.newSingleThreadExecutor(); private ExecutorService executor = Executors.newSingleThreadExecutor();
private CCIMClient() { private CCIMClient() {
callBackManager = new CallBackManager<>(); callBackManager = new CallBackManager<>();
socketManager = new SocketManager(callBackManager,executor); socketManager = new SocketManager(callBackManager, executor);
contactManager = new ContactManager(socketManager, callBackManager); contactManager = new ContactManager(socketManager, callBackManager);
channelManager = new ChannelManager(socketManager, callBackManager); channelManager = new ChannelManager(socketManager, callBackManager);
messageManager = new MessageManager(socketManager, callBackManager, executor); messageManager = new MessageManager(socketManager, callBackManager, executor);
...@@ -89,14 +91,14 @@ public class CCIMClient { ...@@ -89,14 +91,14 @@ public class CCIMClient {
socketManager.initServer(ip, port); socketManager.initServer(ip, port);
} }
public void initSDK(Context context, String appKey, String userName, String extData, Long userId, Long ts, String sign,String server, OnConnectListener resultCallback) { public void initSDK(Context context, String appKey, String userName, String extData, Long userId, Long ts, String sign, String server, OnConnectListener resultCallback) {
this.userId = userId; this.userId = userId;
messageManager.init(context, userId); messageManager.init(context, userId);
socketManager.initChat(context, appKey, userName, extData, userId, ts, sign,server, new OnClientConnectListener() { socketManager.initChat(context, appKey, userName, extData, userId, ts, sign, server, new OnClientConnectListener() {
@Override @Override
public void onSocketConnection(Chat.ConnectResponse.ClientConfig clientConfig) { public void onSocketConnection(Chat.ConnectResponse.ClientConfig clientConfig) {
maxSendMsgInterval = clientConfig.getSendMsgInterval(); maxSendMsgInterval = clientConfig.getSendMsgInterval();
maxAudioDuration = clientConfig.getMaxAudioDuration() * 1000; maxAudioDuration = clientConfig.getMaxAudioDuration();
downloadPrefix = clientConfig.getDownloadPrefix(); downloadPrefix = clientConfig.getDownloadPrefix();
getContactList(true, new ResultEventCallback<PullContactsRes>() { getContactList(true, new ResultEventCallback<PullContactsRes>() {
@Override @Override
...@@ -226,7 +228,7 @@ public class CCIMClient { ...@@ -226,7 +228,7 @@ public class CCIMClient {
pushMsgListener.pushContactNewReq(new User(id, username)); pushMsgListener.pushContactNewReq(new User(id, username));
} }
if (chatResponseMessage.hasPushUserDeletedRes()){ if (chatResponseMessage.hasPushUserDeletedRes()) {
Push.PushUserDeletedResponse pushUserDeletedRes = chatResponseMessage.getPushUserDeletedRes(); Push.PushUserDeletedResponse pushUserDeletedRes = chatResponseMessage.getPushUserDeletedRes();
long userId = pushUserDeletedRes.getUserId(); long userId = pushUserDeletedRes.getUserId();
contactManager.pushDeleteContact(userId); contactManager.pushDeleteContact(userId);
...@@ -362,8 +364,8 @@ public class CCIMClient { ...@@ -362,8 +364,8 @@ public class CCIMClient {
/** /**
* 同步离线消息 * 同步离线消息
*/ */
private void getOfflineMessage(Long contactId,ResultEventCallback<List<MessageContent>> resultEventCallback) { private void getOfflineMessage(Long contactId, ResultEventCallback<List<MessageContent>> resultEventCallback) {
messageManager.getOfflineMessage(contactId,resultEventCallback); messageManager.getOfflineMessage(contactId, resultEventCallback);
} }
/** /**
...@@ -389,7 +391,7 @@ public class CCIMClient { ...@@ -389,7 +391,7 @@ public class CCIMClient {
return; return;
} }
if (! checkTimeInterval()) { if (!checkTimeInterval()) {
callback.onFailed(ErrorCode.SEND_MSG_INTERVAL); callback.onFailed(ErrorCode.SEND_MSG_INTERVAL);
return; return;
} }
...@@ -427,15 +429,15 @@ public class CCIMClient { ...@@ -427,15 +429,15 @@ public class CCIMClient {
/** /**
* 获取私聊消息 * 获取私聊消息
*/ */
public void getPrivateMessage(Long userId,ResultEventCallback<List<MessageContent>> callback){ public void getPrivateMessage(Long userId, ResultEventCallback<List<MessageContent>> callback) {
messageManager.getPrivateMessage(userId,callback); messageManager.getPrivateMessage(userId, callback);
} }
/** /**
* 获取频道消息 * 获取频道消息
*/ */
public void getChannelMessage(Long channelId,ResultEventCallback<List<MessageContent>> callback){ public void getChannelMessage(Long channelId, ResultEventCallback<List<MessageContent>> callback) {
messageManager.getChannelMessage(channelId,callback); messageManager.getChannelMessage(channelId, callback);
} }
/** /**
...@@ -468,25 +470,27 @@ public class CCIMClient { ...@@ -468,25 +470,27 @@ public class CCIMClient {
/** /**
* 开始录音 * 开始录音
*/ */
public void startRecordAudioMessage(Context context, ResultEventCallback<Void> resultCallback) { public void startRecordAudioMessage(Context context,Long receiveUserId, String receiveUserName, ResultEventCallback<MessageContent> resultCallback) {
Dexter.withContext(context) PermissionUtils.check(context, Manifest.permission.RECORD_AUDIO, new ResultEventCallback<Void>() {
.withPermission(Manifest.permission.RECORD_AUDIO) @Override
.withListener(new PermissionListener() { public void onSuccess(Void o) {
@Override MediaHelper.getInstance().prepare(cachePath, maxAudioDuration, resultCallback);
public void onPermissionGranted(PermissionGrantedResponse response) { handler.postDelayed(new Runnable() {
MediaHelper.getInstance().prepare(cachePath, maxAudioDuration, resultCallback);
}
@Override @Override
public void onPermissionDenied(PermissionDeniedResponse response) { public void run() {
resultCallback.onFailed(ErrorCode.START_VOICE_FAILED); Long release = MediaHelper.getInstance().release();
if (release / 1000 >= maxAudioDuration) {
uploadAndSendMessage(receiveUserId, receiveUserName, resultCallback);
}
} }
},maxAudioDuration * 1000L);
}
@Override @Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { public void onFailed(int errorCode) {
resultCallback.onFailed(ErrorCode.START_VOICE_FAILED); resultCallback.onFailed(errorCode);
} }
}).check(); });
} }
...@@ -497,6 +501,10 @@ public class CCIMClient { ...@@ -497,6 +501,10 @@ public class CCIMClient {
if (checkAudio(callback)) { if (checkAudio(callback)) {
return; return;
} }
uploadAndSendMessage(receiveUserId, receiveUserName, callback);
}
private void uploadAndSendMessage(Long receiveUserId, String receiveUserName, ResultEventCallback<MessageContent> callback) {
messageManager.uploadFileMessage(cachePath, new ResultEventCallback<String>() { messageManager.uploadFileMessage(cachePath, new ResultEventCallback<String>() {
@Override @Override
public void onSuccess(String fileName) { public void onSuccess(String fileName) {
...@@ -521,6 +529,33 @@ public class CCIMClient { ...@@ -521,6 +529,33 @@ public class CCIMClient {
}); });
} }
/**
* 开始录音
*/
public void startRecordChannelAudioMessage(Context context,Long channelID, ResultEventCallback<MessageContent> resultCallback) {
PermissionUtils.check(context, Manifest.permission.RECORD_AUDIO, new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void o) {
MediaHelper.getInstance().prepare(cachePath, maxAudioDuration, resultCallback);
handler.postDelayed(new Runnable() {
@Override
public void run() {
Long release = MediaHelper.getInstance().release();
if (release / 1000 >= maxAudioDuration) {
uploadAndSendChannelMessage(channelID, resultCallback);
}
}
},maxAudioDuration * 1000L);
}
@Override
public void onFailed(int errorCode) {
resultCallback.onFailed(errorCode);
}
});
}
/** /**
* 停止录音并上传 频道 * 停止录音并上传 频道
*/ */
...@@ -528,6 +563,10 @@ public class CCIMClient { ...@@ -528,6 +563,10 @@ public class CCIMClient {
if (checkAudio(callback)) { if (checkAudio(callback)) {
return; return;
} }
uploadAndSendChannelMessage(channelID, callback);
}
private void uploadAndSendChannelMessage(Long channelID, ResultEventCallback<MessageContent> callback) {
messageManager.uploadFileMessage(cachePath, new ResultEventCallback<String>() { messageManager.uploadFileMessage(cachePath, new ResultEventCallback<String>() {
@Override @Override
public void onSuccess(String fileName) { public void onSuccess(String fileName) {
...@@ -548,11 +587,6 @@ public class CCIMClient { ...@@ -548,11 +587,6 @@ public class CCIMClient {
MediaHelper.getInstance().cancel(); MediaHelper.getInstance().cancel();
return true; return true;
} }
if (release > maxAudioDuration) {
callback.onFailed(ErrorCode.VOICE_TOO_LONG);
MediaHelper.getInstance().cancel();
return true;
}
return false; return false;
} }
...@@ -570,6 +604,21 @@ public class CCIMClient { ...@@ -570,6 +604,21 @@ public class CCIMClient {
messageManager.playAudio(msgId, downloadPrefix, cachePath, resultCallback); messageManager.playAudio(msgId, downloadPrefix, cachePath, resultCallback);
} }
/**
* 停止播放音乐
*/
public void stopPlayAudio() {
MediaHelper.getInstance().stop();
}
/**
* 获取时长
*/
public void getAudioDuration(Long msgId, ResultEventCallback<Long> resultCallback) {
messageManager.getAudioDuration(msgId, downloadPrefix, cachePath, resultCallback);
}
public void logout() { public void logout() {
isConnected = false; isConnected = false;
socketManager.disConnect(); socketManager.disConnect();
......
package com.ccwangluo.ccim.manage; package com.ccwangluo.ccim.manage;
import android.content.Context; import android.content.Context;
import android.media.MediaMetadataRetriever;
import androidx.room.Room; import androidx.room.Room;
...@@ -117,11 +118,13 @@ public class MessageManager { ...@@ -117,11 +118,13 @@ public class MessageManager {
if (chatResponseMessage.hasSendMsgRes()) { if (chatResponseMessage.hasSendMsgRes()) {
Message.SendMessageResponse sendMsgRes = chatResponseMessage.getSendMsgRes(); Message.SendMessageResponse sendMsgRes = chatResponseMessage.getSendMsgRes();
long msgId = sendMsgRes.getMsgId(); long msgId = sendMsgRes.getMsgId();
MessageContent message = new MessageContent();
String text = content; String text = content;
if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_TEXT) { if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_TEXT) {
text = sendMsgRes.getContent(); text = sendMsgRes.getContent();
} else if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_VOICE){
message.setVoiceContent(sendMsgRes.getContent());
} }
MessageContent message = new MessageContent();
message.setSenderUserId(userId); message.setSenderUserId(userId);
message.setReciveUserId(reciveUserId); message.setReciveUserId(reciveUserId);
message.setMsgId(msgId); message.setMsgId(msgId);
...@@ -159,11 +162,13 @@ public class MessageManager { ...@@ -159,11 +162,13 @@ public class MessageManager {
if (chatResponseMessage.hasSendChannelMsgRes()) { if (chatResponseMessage.hasSendChannelMsgRes()) {
Message.SendMessageResponse sendMsgRes = chatResponseMessage.getSendMsgRes(); Message.SendMessageResponse sendMsgRes = chatResponseMessage.getSendMsgRes();
long msgId = sendMsgRes.getMsgId(); long msgId = sendMsgRes.getMsgId();
MessageContent message = new MessageContent();
String text = content; String text = content;
if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_TEXT) { if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_TEXT) {
text = sendMsgRes.getContent(); text = sendMsgRes.getContent();
} else if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_VOICE){
message.setVoiceContent(sendMsgRes.getContent());
} }
MessageContent message = new MessageContent();
message.setSenderUserId(userId); message.setSenderUserId(userId);
message.setChannelId(channelId); message.setChannelId(channelId);
message.setMsgId(msgId); message.setMsgId(msgId);
...@@ -200,19 +205,7 @@ public class MessageManager { ...@@ -200,19 +205,7 @@ public class MessageManager {
FileUtils.uploadFile(filePath, preSignedUrl, new ResultEventCallback<Void>() { FileUtils.uploadFile(filePath, preSignedUrl, new ResultEventCallback<Void>() {
@Override @Override
public void onSuccess(Void unused) { public void onSuccess(Void unused) {
File file = new File(CCIMClient.getInstance().cachePath, filename); callback.onSuccess(filename);
FileUtils.downLoadFile(CCIMClient.getInstance().downloadPrefix + filename, file, new ResultEventCallback<File>() {
@Override
public void onSuccess(File file) {
logger.info("success");
callback.onSuccess(filename);
}
@Override
public void onFailed(int errorCode) {
logger.info("onFailed");
}
});
} }
@Override @Override
...@@ -355,5 +348,53 @@ public class MessageManager { ...@@ -355,5 +348,53 @@ public class MessageManager {
executor.execute(() -> db.messageDao().insertList(messageContents)); executor.execute(() -> db.messageDao().insertList(messageContents));
} }
public void getAudioDuration(Long msgId, String downloadPrefix, String cachePath, ResultEventCallback<Long> resultCallback) {
executor.execute(() -> {
MessageContent messageContent = db.messageDao().getMsgById(msgId);
if (messageContent == null) {
resultCallback.onFailed(ErrorCode.MSG_NOT_EXISTS);
return;
}
if (messageContent.getMsgType() == MessageContent.MessageType.MESSAGE_TYPE_TEXT) {
resultCallback.onFailed(ErrorCode.MSG_TYPE_ERROR);
return;
}
File file = new File(cachePath, messageContent.getContent());
if (!file.exists()) {
String url = downloadPrefix + messageContent.getContent();
FileUtils.downLoadFile(url, file, new ResultEventCallback<File>() {
@Override
public void onSuccess(File file) {
resultCallback.onSuccess(getDuration(file.getAbsolutePath()));
}
@Override
public void onFailed(int errorCode) {
resultCallback.onFailed(errorCode);
}
});
} else {
resultCallback.onSuccess(getDuration(file.getAbsolutePath()));
}
});
}
public long getDuration(String path){
android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever();
long duration=0;
try {
if (path!= null) {
mmr.setDataSource(path);
}
String time = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
duration= Long.parseLong(time);
} catch (Exception ex) {
} finally {
mmr.release();
}
return duration;
}
} }
...@@ -3,10 +3,9 @@ package com.ccwangluo.ccim.util; ...@@ -3,10 +3,9 @@ package com.ccwangluo.ccim.util;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.os.Build; import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.MessageContent;
import java.io.File; import java.io.File;
...@@ -16,6 +15,8 @@ public class MediaHelper { ...@@ -16,6 +15,8 @@ public class MediaHelper {
private static MediaHelper mInstance; private static MediaHelper mInstance;
private MediaPlayer mediaPlayer;
private Long start_record_millis = 0L; private Long start_record_millis = 0L;
/** /**
...@@ -35,7 +36,7 @@ public class MediaHelper { ...@@ -35,7 +36,7 @@ public class MediaHelper {
/** /**
* 准备录音 * 准备录音
*/ */
public void prepare(String path, int maxAudioDuration, ResultEventCallback<Void> resultCallback) { public void prepare(String path, int maxAudioDuration, ResultEventCallback<MessageContent> resultCallback) {
try { try {
if (mMediaRecorder != null) { if (mMediaRecorder != null) {
cancel(); cancel();
...@@ -60,6 +61,7 @@ public class MediaHelper { ...@@ -60,6 +61,7 @@ public class MediaHelper {
mMediaRecorder.prepare(); mMediaRecorder.prepare();
mMediaRecorder.start(); mMediaRecorder.start();
start_record_millis = System.currentTimeMillis(); start_record_millis = System.currentTimeMillis();
resultCallback.onSuccess(null); resultCallback.onSuccess(null);
} catch (Exception e) { } catch (Exception e) {
resultCallback.onFailed(ErrorCode.START_VOICE_FAILED); resultCallback.onFailed(ErrorCode.START_VOICE_FAILED);
...@@ -71,6 +73,8 @@ public class MediaHelper { ...@@ -71,6 +73,8 @@ public class MediaHelper {
*/ */
public Long release() { public Long release() {
if (mMediaRecorder != null) { if (mMediaRecorder != null) {
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release(); mMediaRecorder.release();
mMediaRecorder = null; mMediaRecorder = null;
} }
...@@ -103,12 +107,22 @@ public class MediaHelper { ...@@ -103,12 +107,22 @@ public class MediaHelper {
* @param filePath * @param filePath
*/ */
public void play(String filePath, ResultEventCallback<Void> resultCallback) { public void play(String filePath, ResultEventCallback<Void> resultCallback) {
MediaPlayer mediaPlayer = new MediaPlayer(); if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
} else {
mediaPlayer.stop();
mediaPlayer.reset();
}
try { try {
mediaPlayer.setDataSource(filePath); mediaPlayer.setDataSource(filePath);
mediaPlayer.prepare(); mediaPlayer.prepare();
mediaPlayer.start(); mediaPlayer.start();
resultCallback.onSuccess(null); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
resultCallback.onSuccess(null);
}
});
} catch (Exception e) { } catch (Exception e) {
resultCallback.onFailed(ErrorCode.ERROR_VOICE_PLAY); resultCallback.onFailed(ErrorCode.ERROR_VOICE_PLAY);
} }
...@@ -118,4 +132,11 @@ public class MediaHelper { ...@@ -118,4 +132,11 @@ public class MediaHelper {
public String getFilePath(String filename, String path) { public String getFilePath(String filename, String path) {
return FileUtils.renameFile(mFilePath, path, filename); return FileUtils.renameFile(mFilePath, path, filename);
} }
public void stop() {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.reset();
}
}
} }
\ No newline at end of file
package com.ccwangluo.ccim.util;
import android.Manifest;
import android.content.Context;
import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
public class PermissionUtils {
public static void check(Context context,String permission, ResultEventCallback<Void> resultCallback){
Dexter.withContext(context)
.withPermission(permission)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
resultCallback.onSuccess(null);
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
resultCallback.onFailed(ErrorCode.START_VOICE_FAILED);
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
resultCallback.onFailed(ErrorCode.START_VOICE_FAILED);
}
}).check();
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment