Commit 31ce8e95 authored by sheteng's avatar sheteng

停止播放音频

获取时长
权限修改
parent 53b7c52b
......@@ -4,6 +4,7 @@
<option name="filePathToZoomLevelMap">
<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_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_channel.xml" value="0.26403985507246375" />
<entry key="..\:/project/ccwangluoIm/app/src/main/res/layout/activity_login.xml" value="0.322463768115942" />
......
......@@ -64,7 +64,7 @@ dependencies {
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$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;
import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.MessageContent;
import com.ccwangluo.im.R;
import com.ccwangluo.im.util.ToastUtil;
import java.util.List;
......@@ -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 {
});
}
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
public void onSuccess(Void unused) {
public void onSuccess(MessageContent unused) {
if (unused != null){
loginViewModel.addPrivateMsg(unused);
}
isSuccess = true;
}
......
......@@ -110,9 +110,12 @@ public class ConnectChannelActivity extends AppCompatActivity {
});
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
CCIMClient.getInstance().startRecordAudioMessage(ConnectChannelActivity.this, new ResultEventCallback<Void>() {
CCIMClient.getInstance().startRecordChannelAudioMessage(ConnectChannelActivity.this,channelId, new ResultEventCallback<MessageContent>() {
@Override
public void onSuccess(Void unused) {
public void onSuccess(MessageContent unused) {
if (unused != null){
loginViewModel.addPrivateMsg(unused);
}
isSuccess = true;
}
......
package com.ccwangluo.im.util;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
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) {
CCIMClient.getInstance().handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
}
});
}
}
......@@ -27,7 +27,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:hint="UserId"
android:text="15"
android:text="16"
android:imeActionLabel="@string/action_sign_in_short"
android:imeOptions="actionDone"
android:selectAllOnFocus="true"
......
......@@ -58,6 +58,7 @@ protobuf {
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.protobuf:protobuf-java:3.13.0'
implementation 'com.google.protobuf:protobuf-java-util:3.12.0'
implementation 'com.google.code.gson:gson:2.8.7'
......@@ -66,6 +67,5 @@ dependencies {
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
implementation 'com.karumi:dexter:6.2.3'
}
\ No newline at end of file
package com.ccwangluo.ccim.manage;
import android.content.Context;
import android.media.MediaMetadataRetriever;
import androidx.room.Room;
......@@ -117,11 +118,13 @@ public class MessageManager {
if (chatResponseMessage.hasSendMsgRes()) {
Message.SendMessageResponse sendMsgRes = chatResponseMessage.getSendMsgRes();
long msgId = sendMsgRes.getMsgId();
MessageContent message = new MessageContent();
String text = content;
if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_TEXT) {
text = sendMsgRes.getContent();
} else if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_VOICE){
message.setVoiceContent(sendMsgRes.getContent());
}
MessageContent message = new MessageContent();
message.setSenderUserId(userId);
message.setReciveUserId(reciveUserId);
message.setMsgId(msgId);
......@@ -159,11 +162,13 @@ public class MessageManager {
if (chatResponseMessage.hasSendChannelMsgRes()) {
Message.SendMessageResponse sendMsgRes = chatResponseMessage.getSendMsgRes();
long msgId = sendMsgRes.getMsgId();
MessageContent message = new MessageContent();
String text = content;
if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_TEXT) {
text = sendMsgRes.getContent();
} else if (messageType == MessageSpec.MessageType.MESSAGE_TYPE_VOICE){
message.setVoiceContent(sendMsgRes.getContent());
}
MessageContent message = new MessageContent();
message.setSenderUserId(userId);
message.setChannelId(channelId);
message.setMsgId(msgId);
......@@ -200,19 +205,7 @@ public class MessageManager {
FileUtils.uploadFile(filePath, preSignedUrl, new ResultEventCallback<Void>() {
@Override
public void onSuccess(Void unused) {
File file = new File(CCIMClient.getInstance().cachePath, 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");
}
});
callback.onSuccess(filename);
}
@Override
......@@ -355,5 +348,53 @@ public class MessageManager {
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;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.MessageContent;
import java.io.File;
......@@ -16,6 +15,8 @@ public class MediaHelper {
private static MediaHelper mInstance;
private MediaPlayer mediaPlayer;
private Long start_record_millis = 0L;
/**
......@@ -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 {
if (mMediaRecorder != null) {
cancel();
......@@ -60,6 +61,7 @@ public class MediaHelper {
mMediaRecorder.prepare();
mMediaRecorder.start();
start_record_millis = System.currentTimeMillis();
resultCallback.onSuccess(null);
} catch (Exception e) {
resultCallback.onFailed(ErrorCode.START_VOICE_FAILED);
......@@ -71,6 +73,8 @@ public class MediaHelper {
*/
public Long release() {
if (mMediaRecorder != null) {
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
}
......@@ -103,12 +107,22 @@ public class MediaHelper {
* @param filePath
*/
public void play(String filePath, ResultEventCallback<Void> resultCallback) {
MediaPlayer mediaPlayer = new MediaPlayer();
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
} else {
mediaPlayer.stop();
mediaPlayer.reset();
}
try {
mediaPlayer.setDataSource(filePath);
mediaPlayer.prepare();
mediaPlayer.start();
resultCallback.onSuccess(null);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
resultCallback.onSuccess(null);
}
});
} catch (Exception e) {
resultCallback.onFailed(ErrorCode.ERROR_VOICE_PLAY);
}
......@@ -118,4 +132,11 @@ public class MediaHelper {
public String getFilePath(String filename, String path) {
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