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
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