Android 端小视频开发与使用说明
一、常规使用,在会话页面底部扩展面板:
二、自定义发送入口:
如果不想在会话页面底部扩展面板进入小视频录制发送页面,而是想在其他地方进入小视频录制发送页面,实现步骤:注册消息和消息模板。RongIM.registerMessageType(SightMessage.class);
RongIM.registerMessageTemplate(new SightMessageItemProvider());
进入默认的消息录制和发送页面。
权限申请,如果是 6.0 以下,则相应的权限已在 Kit 的AndroidManifest.xml 里声明了,无需处理。如果是 6.0 或以上,需要动态权限申请,所需要的权限如下:/**
* 点击开始录制小视频
* @param view
*/
public void onRecordClick(View view) {
String[] permissions = {
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
if (checkPermission(permissions)) {
startSightRecord(this);
} else {
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
}
}
private boolean checkPermission(String[] permissions) {
for (String permission : permissions)
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED)
return false;
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
boolean isAllGranted = true;
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
}
}
if (isAllGranted) {
startSightRecord(this);
} else {
// TODO: 弹框告知用户需要权限的原因,引导用户在应用权限管理中手动打开权限。
}
}
}
获取权限后,跳转进入小视频录制界面:/**
* 跳转进入小视频录制和发送页面
*
* @param activity 当前页面activity,更具需求,也可以改为fragment或其他
*/
private void startSightRecord(Activity activity) {
File saveDir = null;
// 设置小视频本地存储路径
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
saveDir = new File(Environment.getExternalStorageDirectory(), "RongCloud/Media");
if (!saveDir.exists()) {
saveDir.mkdirs();
}
}
Intent intent = new Intent(activity, SightRecordActivity.class);
intent.putExtra("conversationType", conversationType.getValue()); // 当前要发送给对方的会话类型,在发送小视频消息时会用到
intent.putExtra("targetId", targetId); // 发送给对方的id
intent.putExtra("recordSightDir", saveDir.getAbsolutePath()); // 本地路径
int maxRecordDuration = 10; // 设置最大拍摄时长,单位秒
intent.putExtra("maxRecordDuration", maxRecordDuration);//seconds
activity.startActivity(intent);
}
三、自定义小视频录制和发送页面
可以参考SDK内置 SightRecordActivity,实现自己的录制发送页面CustomRecordActivity,小视频录制的UI和逻辑都在 CameraView 这个类里,这个类无法修改,在自己自定义的 CustomRecordActivity 的布局文件中加入 CameraView,这里如果有其他需求,可以自定义加入其他 UI 元素。
CustomRecordActivity 源码:public class CustomRecordActivity extends AppCompatActivity {
private CameraView mCameraView;
private String targetId;
private Conversation.ConversationType conversationType;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.setContentView(R.layout.activity_custom);
this.mCameraView = (CameraView) this.findViewById(R.id.cameraView);
this.mCameraView.setAutoFocus(false);
this.mCameraView.setSupportCapture(this.getIntent().getBooleanExtra("supportCapture", false));
this.mCameraView.setSaveVideoPath(this.getIntent().getStringExtra("recordSightDir"));
this.mCameraView.setMaxRecordDuration(this.getIntent().getIntExtra("maxRecordDuration", 10));
this.targetId = this.getIntent().getStringExtra("targetId");
this.conversationType = Conversation.ConversationType.setValue(this.getIntent().getIntExtra("conversationType", 1));
this.mCameraView.setCameraViewListener(new CameraView.CameraViewListener() {
public void quit() {
CustomRecordActivity.this.finish();
}
public void captureSuccess(Bitmap bitmap) {
}
public void recordSuccess(String url, int recordTime) {
if (TextUtils.isEmpty(url)) {
CustomRecordActivity.this.finish();
} else {
File file = new File(url);
if (!file.exists()) {
CustomRecordActivity.this.finish();
} else {
SightMessage sightMessage = SightMessage.obtain(Uri.fromFile(file), recordTime);
Message message = Message.obtain(CustomRecordActivity.this.targetId, CustomRecordActivity.this.conversationType, sightMessage);
RongIM.getInstance().sendMediaMessage(message, getString(io.rong.sight.R.string.rc_message_content_sight), null, (IRongCallback.ISendMediaMessageCallback) null);
CustomRecordActivity.this.finish();
}
}
}
});
}
@Override
protected void onResume() {
super.onResume();
this.mCameraView.onResume();
}
@Override
protected void onPause() {
super.onPause();
this.mCameraView.onPause();
}
}
四、小视频上传到自己的媒体服务器(待定)
SDK 默认上传到融云的服务器,有效存储期为 6 个月。目前只有私有云支持上传到指定的媒体服务器,服务器地址需要调用融云 SDK 接口配置,使用如下:/**
* 设置私有部署的导航服务器和媒体服务器地址。
* 此方法要在 {@link #init(Context, String)} 前使用
*
* @param naviServer 私有部署的导航服务器地址。
* @param fileServer 私有部署的媒体服务器地址,即文件和图片的上传地址。使用私有云时必须填写。
*/
public static void setServerInfo(final String naviServer, final String fileServer) {
...
}