uniapp 安卓端选择其他文件

1,150 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

由于在安卓端的时候选择文件时选择非媒体文件 uni.chooseFile 只适用于H5 无法在APP使用, 所以需要重新写方法 这里重新定义了安卓选择文件的方法

 /**安卓文件选择*/
    selectFile(cb) {
      let that = this;
      let main = plus.android.runtimeMainActivity();
      let Intent = plus.android.importClass("android.content.Intent");
      let intent = new Intent(Intent.ACTION_GET_CONTENT);
      intent.setType("*/*");
      intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); //关键!多选参数
      intent.addCategory(Intent.CATEGORY_OPENABLE);
      main.startActivityForResult(intent, 200);
      uni.hideLoading();
      // 获取回调
      main.onActivityResult = function (requestCode, resultCode, data) {
        let Activity = plus.android.importClass("android.app.Activity");
        let ContentUris = plus.android.importClass(
          "android.content.ContentUris"
        );
        let Cursor = plus.android.importClass("android.database.Cursor");
        let Uri = plus.android.importClass("android.net.Uri");
        let Build = plus.android.importClass("android.os.Build");
        let Environment = plus.android.importClass("android.os.Environment");
        let DocumentsContract = plus.android.importClass(
          "android.provider.DocumentsContract"
        );

        // 给系统导入 contentResolver
        let contentResolver = main.getContentResolver();
        plus.android.importClass(contentResolver);
        // 返回路径
        let path = "";
        if (resultCode == Activity.RESULT_OK) {
          if (data.getData() != null) {
            let uri = data.getData();
            //this 当前mainClass实例
            path = getPath(this, uri);
            that.fileList = [path];
          } else {
            try {
              let ClipData = plus.android.importClass(
                "android.content.ClipData"
              );
              let clipData = new ClipData();
              clipData = data.getClipData();
              if (clipData != null) {
                for (let i = 0; i < clipData.getItemCount(); i++) {
                  let item = clipData.getItemAt(i);
                  let uri = item.getUri();
                  let url = getPath(this, uri);
                  that.fileList.push(url);
                }
              }
            } catch (e) {
              console.log(e);
            }
          }
          console.log(path);
          cb(path);
        } else {
          console.log(path);
          cb(path);
        }

        function getPath(context, uri) {
          try {
            let isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
            if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
              // ExternalStorageProvider
              //一些三方的文件浏览器会进入到这个方法中,例如ES
              //QQ文件管理器不在此列
              if (isExternalStorageDocument(uri)) {
                let docId = DocumentsContract.getDocumentId(uri);
                let split = docId.split(":");
                let type = split[0];
                // 如果是手机内部存储
                if ("primary" == type.toLowerCase()) {
                  return (
                    Environment.getExternalStorageDirectory() + "/" + split[1]
                  );
                } else {
                  return "/storage/" + type + "/" + split[1];
                }
              }
              // DownloadsProvider
              else if (isDownloadsDocument(uri)) {
                console.log(DocumentsContract.getDocumentId(uri));
                let id = DocumentsContract.getDocumentId(uri);
                if (id.indexOf("raw:") > -1) {
                  id = id.replace("raw:", "");
                }
                // 不同系统获取的id开头可能不一样,在这后面便是真实的地址
                if (id.substring(0, 5) == "msf:") {
                  return id.substring(5, id.length);
                }
                let contentUri = ContentUris.withAppendedId(
                  Uri.parse("content://downloads/public_downloads"),
                  ContentUris.parseId(uri)
                );
                return getDataColumn(context, contentUri, null, null);
              }
              // MediaProvider
              else if (isMediaDocument(uri)) {
                let MediaStore = plus.android.importClass(
                  "android.provider.MediaStore"
                );
                let docId = DocumentsContract.getDocumentId(uri);
                let split = docId.split(":");
                let type = split[0];
                let contentUri = null;

                if ("image" == type.toLowerCase()) {
                  contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video" == type.toLowerCase()) {
                  contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio" == type.toLowerCase()) {
                  contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                let selection = "_id=?";
                let selectionArgs = [split[1]];
                return getDataColumn(
                  context,
                  contentUri,
                  selection,
                  selectionArgs
                );
              }
            }
            // MediaStore (and general)
            else if ("content" == uri.getScheme().toLowerCase()) {
              if (isGooglePhotosUri(uri)) {
                return uri.getLastPathSegment();
              } else if (isQQMediaDocument(uri)) {
                let paths = uri.getPath();
                let Environment = plus.android.importClass(
                  "android.os.Environment"
                );
                let fileDir = Environment.getExternalStorageDirectory();
                let files = plus.android.importClass("java.io.File");
                let file = new files(
                  fileDir,
                  paths.substring("/QQBrowser".length, paths.length)
                );
                return file.getPath();
              }

              return getDataColumn(context, uri, null, null);
            }
            // File
            else if ("file" == uri.getScheme().toLowerCase()) {
              return uri.getPath();
            }
            return null;
          } catch (e) {
            console.log(e);
            return null;
          }
        }

        // 通过uri 查找出绝对路径
        function getDataColumn(context, uri, selection, selectionArgs) {
          try {
            let MediaStore = plus.android.importClass(
              "android.provider.MediaStore"
            );
            let cursor = null;
            let column = MediaStore.MediaColumns.DATA;
            let projection = [column];
            cursor = context
              .getContentResolver()
              .query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
              let column_index = cursor.getColumnIndexOrThrow(column);
              return cursor.getString(column_index);
            }
          } catch (e) {
            console.log(e);
            return null;
          }
        }
        function isExternalStorageDocument(uri) {
          return "com.android.externalstorage.documents" == uri.getAuthority()
            ? true
            : false;
        }
        function isDownloadsDocument(uri) {
          return "com.android.providers.downloads.documents" ==
            uri.getAuthority()
            ? true
            : false;
        }
        function isMediaDocument(uri) {
          return "com.android.providers.media.documents" == uri.getAuthority()
            ? true
            : false;
        }
        /**
         * 使用第三方qq文件管理器打开
         *
         * @param uri
         * @return
         */
        function isQQMediaDocument(uri) {
          return "com.tencent.mtt.fileprovider" == uri.getAuthority()
            ? true
            : false;
        }
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is Google Photos.
         */
        function isGooglePhotosUri(uri) {
          return "com.google.android.apps.photos.content" == uri.getAuthority()
            ? true
            : false;
        }
      };
    }

上面的是选择文件的方法,

下面的是使用的方法 在回调中把选中文件的本地文件路径返还回来 , 在做上传的方法就可以了

`this.selectFile((e) => {
    uni.uploadFile({ url: url, //后端的图片上传接口 
    filePath: tempFilePaths[0], 
    name: 'file', 
    header: { //上传需要权限校验时可在这里加上 
    Authorization: "Bearer " + uni.getStorageSync("token"), }, 
    success: (uploadFileRes) => { 
        console.log(uploadFileRes.data); 
    } 
    });
})