android 调用原相机拍摄的简单方法上传视频到后端Asp.netcore

这个和上篇不同的是,拍摄视频不用自己创建文件直接存储到uri格式,再通过uri路径获取文件路径创建自己路径的文件再进行上传

上篇的顺序是先创建文件将拍摄的视频直接保存起来,文件后续直接用,自己决定文件路径的写法

事件 

  Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        takeVideoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT,60);
        startActivityForResult(takeVideoIntent, videoId);

拍摄好之后可以直接data获取url不用存储到File

  @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
        if (resultCode == RESULT_OK)
            if (requestCode == videoId){
                assert data != null;
                Uri videoUri = data.getData();
                Intent intent = new Intent(getActivity(), VideoActivity.class);
                intent.setData(videoUri);
                intent.putExtra("rt_no",elcQtBarRtNo.getRtNo());
                intent.putExtra("quote_item_no",elcQtBarRtNo.getQuoteItemNo());
                startActivity(intent);
            }
    }

也是到下一个界面

下一个界面VideoAtivity

    uri = getIntent().getData();

这么获取上一个界面的data uri就行

然后一样的文件存储

path = getFilePath(uri);
 public String getFilePath(Uri uri) {

        String path = "";
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        if (DocumentsContract.isDocumentUri(this, uri)) {
            // 如果是document类型的 uri, 则通过document id来进行处理
            String documentId = DocumentsContract.getDocumentId(uri);
            if (isMediaDocument(uri)) {
                // MediaProvider
                // 使用':'分割
                String id = documentId.split(":")[1];
                String selection = MediaStore.Images.Media._ID + "=?";
                String[] selectionArgs = {id};
                path = getDataColumn(this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
            } else if (isDownloadsDocument(uri)) {
                // DownloadsProvider
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.parseLong(documentId));
                path = getDataColumn(this, contentUri, null, null);
            }
            return path;
        }

        if (isKitKat && DocumentsContract.isDocumentUri(this, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.parseLong(id));

                return getDataColumn(this, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[] {
                        split[1]
                };

                return getDataColumn(this, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(this, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return path;
    }

然后上传视频到后端

 private void startUpload(boolean largeThan29){
        File files;
        if (largeThan29) {
            files = uriToFileApiQ(uri);
        } else {
            files = new File(path);
        }
        String url = baseUrl + "/elcqrbarrtno/upload?quote_item_no=" + quote_item_no
                + "&rt_no=" + rt_no;
        SharedPreferences userInfo = getSharedPreferences("userInfo",MODE_PRIVATE);
        String token = userInfo.getString("token","");
//这里的进度条是不动的,能上传,但是是不能动,后面那篇文章才是能动的进度条
        MaterialDialog.Builder builder = new MaterialDialog.Builder(this)
                .title("上传视频")
                .content("上传中···")
                .contentGravity(GravityEnum.CENTER)
                .progress(false,100)
                .cancelable(false);
        builder.show();
        RxHttp.postForm(url) //发送Form表单形式的Post请求
                .addFile("li", files)
                .addHeader("Authorization","Bearer "+token)
                .upload(AndroidSchedulers.mainThread(), progress -> {
                    //上传进度回调,0-100,仅在进度有更新时才会回调
                    builder.showListener(dialog -> updateProgress((MaterialDialog)dialog));
                })   //指定回调(进度/成功/失败)线程,不指定,默认在请求所在线程回调
                .asString()
                .timeout(720, TimeUnit.SECONDS)
                .to(RxLife.to(this))
                .subscribe(System.out::println, throwable -> System.out.println(throwable.getMessage()));
    }

这里有文件存储了就要判断是否andorid11及以上

   public File uriToFileApiQ(Uri uri) {
        File file = null;
        //android10以上转换
        if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
            file = new File(uri.getPath());
        } else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
            //把文件复制到沙盒目录
            ContentResolver contentResolver = this.getContentResolver();
            Cursor cursor = contentResolver.query(uri, null, null, null, null);
            if (cursor.moveToFirst()) {
                String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                try {
                    InputStream is = contentResolver.openInputStream(uri);
                    File cache = new File(this.getExternalCacheDir().getAbsolutePath(), Math.round((Math.random() + 1) * 1000) + displayName);
                    FileOutputStream fos = new FileOutputStream(cache);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        FileUtils.copy(is, fos);
                    }
                    file = cache;
                    fos.close();
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值