Android 端小视频开发与使用说明

Android 端小视频如何使用及自定义发送?
发布时间: 2018-07-02 13:47

回答:

Android 端小视频开发与使用说明

一、常规使用,在会话页面底部扩展面板:

参考官网文档:http://www.rongcloud.cn/docs/sight.html#android

二、自定义发送入口:

如果不想在会话页面底部扩展面板进入小视频录制发送页面,而是想在其他地方进入小视频录制发送页面,实现步骤:

  1. 注册消息和消息模板。

     RongIM.registerMessageType(SightMessage.class);
     RongIM.registerMessageTemplate(new SightMessageItemProvider());
  2. 进入默认的消息录制和发送页面。

  3. 权限申请,如果是 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: 弹框告知用户需要权限的原因,引导用户在应用权限管理中手动打开权限。
             }
         }
     }
  4. 获取权限后,跳转进入小视频录制界面:

    /**
     * 跳转进入小视频录制和发送页面
     *
     * @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) {
    ...
}
我对此仍有疑问!继续追问