Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions Android/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,3 @@ build/
.cxx
*.codecc/
/build.yml
tuicore
tuiofflinepush
3 changes: 2 additions & 1 deletion Android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ task clean(type: Delete) {

ext {
liteavSdk = "com.tencent.liteav:LiteAVSDK_TRTC:latest.release"
imSdk = "com.tencent.imsdk:imsdk-plus:latest.release"
roomEngineSdk = "com.tencent.tuikit.engine.room.sdk:sdk-release@aar"
imSdk = "com.tencent.imsdk:imsdk-customer:6.8.3374"
}
7 changes: 4 additions & 3 deletions Android/tuivoiceroom/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@ dependencies {
api "de.hdodenhof:circleimageview:3.1.0"
api "com.google.code.gson:gson:2.3.1"
api "com.blankj:utilcode:1.30.7"
api rootProject.ext.liteavSdk
api rootProject.ext.imSdk
api 'com.tencent.liteav.tuikit:tuicore:latest.release'
api project(':debug')

def projects = this.rootProject.getAllprojects().stream().map { project -> project.name }.collect()
api projects.contains("tuicore") ? project(':tuicore') : "com.tencent.liteav.tuikit:tuicore:latest.release"
api rootProject.getProperties().containsKey("liteavSdk") ? rootProject.ext.liteavSdk : "com.tencent.liteav:LiteAVSDK_TRTC:latest.release"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.tencent.liteav.basic;

import android.view.View;

/**
* 作用:防止快速点击按钮引起的错误
* 使用:Button.setOnClickListener 时,使用此类作的实现类作为Listener
*/
public abstract class OnSingleClickListener implements View.OnClickListener {
private static final long MIN_CLICK_DELAY_TIME = 500;
private long mLastClickTime = 0;

@Override
public void onClick(View v) {
long curClickTime = System.currentTimeMillis();
if ((curClickTime - mLastClickTime) >= MIN_CLICK_DELAY_TIME) {
mLastClickTime = curClickTime;
onSingleClick(v);
}
}

public abstract void onSingleClick(View v);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.tencent.liteav.basic;

import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

public class PictureUtils {
private static final String TAG = "PictureUtils";

/**
* 保存 Bitmap 到图库
* @param context
* @param bitmap
* @return
*/
public static boolean saveBitmap2Gallery(Context context, Bitmap bitmap) {
if (context == null || bitmap == null) {
return false;
}
if (Build.VERSION.SDK_INT >= 29) {
//返回出一个URI
Uri insert = context.getContentResolver()
.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
if (insert == null) {
return false;
}

//这个打开了输出流 直接保存图片就好了
OutputStream outputStream = null;
try {
outputStream = context.getContentResolver().openOutputStream(insert);
if (outputStream == null) {
return false;
} else {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "snapshot", "desc");
}
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.tencent.liteav.basic;

import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;

import java.lang.reflect.InvocationTargetException;

public class RTCubeUtils {
private static final String RTCUBE_PACKAGE_NAME = "com.tencent.trtc";
Expand All @@ -25,4 +28,29 @@ public static String getApplicationName(Context context) {
public static boolean isRTCubeApp(Context context) {
return RTCUBE_PACKAGE_NAME.equals(context.getPackageName());
}

public static String getPackageName() {
return getApplicationByReflect().getPackageName();
}

public static Application getApplicationByReflect() {
try {
@SuppressLint("PrivateApi") Class<?> activityThread = Class.forName("android.app.ActivityThread");
Object thread = activityThread.getMethod("currentActivityThread").invoke(null);
Object app = activityThread.getMethod("getApplication").invoke(thread);
if (app == null) {
throw new NullPointerException("You should init first.");
}
return (Application) app;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
throw new NullPointerException("You should init first.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.tencent.liteav.basic;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.util.TypedValue;

import androidx.annotation.StringRes;

public class ResourceUtils {

private static final String TYPE_QUOTE_PREFIX = "@";
private static final String TYPE_COLOR_PREFIX = "#";

private static final String TYPE_STRING = "string";
private static final String TYPE_COLOR = "color";
private static final String TYPE_DRAWABLE = "drawable";

public static int getDrawableId(String resName) {
if (resName.startsWith(TYPE_QUOTE_PREFIX)) {
return getResources().getIdentifier(resName, TYPE_DRAWABLE, RTCubeUtils.getPackageName());
}
throw new IllegalArgumentException("\"" + resName + "\" is illegal, must start with \"@\".");
}

public static int getStringId(String resName) {
return getResources().getIdentifier(resName, TYPE_STRING, RTCubeUtils.getPackageName());
}

public static String getString(String resName) {
if (resName.startsWith(TYPE_QUOTE_PREFIX)) {
return getResources().getString(getStringId(resName.substring(1)));
}
return resName;
}

public static String getString(@StringRes int resId) {
return getResources().getString(resId);
}

public static int getColor(String resName) {
if (resName.startsWith(TYPE_COLOR_PREFIX)) {
return Color.parseColor(resName);
}
if (resName.startsWith(TYPE_QUOTE_PREFIX)) {
return getResources().getColor(getColorId(resName));
}
throw new IllegalArgumentException("\"" + resName + "\" is unknown color.");
}

public static int getColorId(String resName) {
return getResources().getIdentifier(resName, TYPE_COLOR, RTCubeUtils.getPackageName());
}

public static Resources getResources() {
return RTCubeUtils.getApplicationByReflect().getResources();
}

public static int dip2px(float dpValue) {
final float scale = getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

public static Bitmap decodeResource(int id) {
TypedValue value = new TypedValue();
getResources().openRawResource(id, value);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inTargetDensity = value.density;
return BitmapFactory.decodeResource(getResources(), id, opts);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.tencent.liteav.trtcvoiceroom.ui.room;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
Expand All @@ -14,13 +15,15 @@
import com.tencent.liteav.trtcvoiceroom.ui.base.EarMonitorInstance;
import com.tencent.liteav.trtcvoiceroom.ui.base.MemberEntity;
import com.tencent.liteav.trtcvoiceroom.ui.base.VoiceRoomSeatEntity;
import com.tencent.liteav.trtcvoiceroom.ui.utils.PermissionHelper;
import com.tencent.liteav.trtcvoiceroom.ui.utils.Utils;
import com.tencent.liteav.trtcvoiceroom.ui.widget.CommonBottomDialog;
import com.tencent.liteav.trtcvoiceroom.ui.widget.ConfirmDialogFragment;
import com.tencent.liteav.trtcvoiceroom.ui.widget.SelectMemberView;
import com.tencent.liteav.trtcvoiceroom.ui.widget.msg.MsgEntity;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUILoginListener;
import com.tencent.qcloud.tuicore.permission.PermissionCallback;
import com.tencent.qcloud.tuicore.permission.PermissionRequester;
import com.tencent.trtc.TRTCCloudDef;

import java.lang.reflect.Method;
Expand Down Expand Up @@ -132,28 +135,26 @@ private void initAnchor() {
mRoomId = getRoomId();
mCurrentRole = TRTCCloudDef.TRTCRoleAnchor;
mTRTCVoiceRoom.setSelfProfile(mUserName, mUserAvatar, null);
PermissionHelper.requestPermission(this, PermissionHelper.PERMISSION_MICROPHONE,
new PermissionHelper.PermissionCallback() {
@Override
public void onGranted() {
internalCreateRoom();
}

@Override
public void onDenied() {

}

@Override
public void onDialogApproved() {

}
PermissionCallback callback = new PermissionCallback() {
@Override
public void onGranted() {
internalCreateRoom();
}

@Override
public void onDialogRefused() {
finish();
}
});
@Override
public void onDenied() {
finish();
}
};
String title = getString(R.string.trtcvoiceroom_permission_mic_reason_title,
Utils.getAppName(mContext));
PermissionRequester.newInstance(Manifest.permission.RECORD_AUDIO)
.title(title)
.description(getString(R.string.trtcvoiceroom_permission_mic_reason))
.settingsTip(getString(R.string.trtcvoiceroom_tips_start_audio))
.callback(callback)
.request();

TUILogin.addLoginListener(mTUILoginListener);
showAlertUserLiveTips();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.tencent.liteav.trtcvoiceroom.ui.room;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
Expand All @@ -15,11 +16,13 @@
import com.tencent.liteav.trtcvoiceroom.model.TRTCVoiceRoomDef;
import com.tencent.liteav.trtcvoiceroom.ui.base.EarMonitorInstance;
import com.tencent.liteav.trtcvoiceroom.ui.base.VoiceRoomSeatEntity;
import com.tencent.liteav.trtcvoiceroom.ui.utils.PermissionHelper;
import com.tencent.liteav.trtcvoiceroom.ui.utils.Utils;
import com.tencent.liteav.trtcvoiceroom.ui.widget.CommonBottomDialog;
import com.tencent.liteav.trtcvoiceroom.ui.widget.ConfirmDialogFragment;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUILoginListener;
import com.tencent.qcloud.tuicore.permission.PermissionCallback;
import com.tencent.qcloud.tuicore.permission.PermissionRequester;
import com.tencent.trtc.TRTCCloudDef;

import java.lang.reflect.Method;
Expand Down Expand Up @@ -194,32 +197,29 @@ public void onClick(int position, String text) {
ToastUtils.showShort(getString(R.string.trtcvoiceroom_seat_closed));
return;
}
PermissionHelper.requestPermission(mContext, PermissionHelper.PERMISSION_MICROPHONE,
new PermissionHelper.PermissionCallback() {
@Override
public void onGranted() {
if (mCurrentRole == TRTCCloudDef.TRTCRoleAnchor) {
startMoveSeat(itemPos);
} else {
startTakeSeat(itemPos);
}
}

@Override
public void onDenied() {

}

@Override
public void onDialogApproved() {

}
PermissionCallback callback = new PermissionCallback() {
@Override
public void onGranted() {
if (mCurrentRole == TRTCCloudDef.TRTCRoleAnchor) {
startMoveSeat(itemPos);
} else {
startTakeSeat(itemPos);
}
}

@Override
public void onDialogRefused() {
finish();
}
});
@Override
public void onDenied() {
finish();
}
};
String title = getString(R.string.trtcvoiceroom_permission_mic_reason_title,
Utils.getAppName(mContext));
PermissionRequester.newInstance(Manifest.permission.RECORD_AUDIO)
.title(title)
.description(getString(R.string.trtcvoiceroom_permission_mic_reason))
.settingsTip(getString(R.string.trtcvoiceroom_tips_start_audio))
.callback(callback)
.request();
}
dialog.dismiss();
}
Expand Down
Loading