uniapp android 调用原生 文件管理

项目背景:uniapp 项目三端部署,项目中有一个 上传文件的功能,需要调用原生的 文件管理器,本来是用原生插件 但是最终拿不到,原生文件管理acticity 的  返回:

onActivityResult(int requestCode, int resultCode, Intent intent)

就是 上面这句话  不会调用:最后看到论坛上面写道:可以在  js 中访问文件管理器,并且接收到 返回:

在 js 中设置:main.onActivityResult

var main = plus.android.runtimeMainActivity();  

main.onActivityResult = function(requestCode, resultCode, data) {

具体的使用:

pickFile.PickFile((path) => {
    //返回的路径  
    this.$emit('result', 'file:///' + path)
}, '*/*')

核心工具脚本: pickFile.js

/* eslint-disable */
var pickFile = {
  //调用原生文件系统管理器并选取文件获取文件地址
  PickFile:function(callback, mimeTypes) { //acceptType为你要查的文件类型"image/*","audio/*","video/*;image/*"  // intent.setType("image/*");//intent.setType("audio/*"); //选择音频//intent.setType("video/*;image/*"); //选择视频 (mp4 3gp 是android支持的视频格式)
    var CODE_REQUEST = 1000;
    var main = plus.android.runtimeMainActivity();
    if (plus.os.name == 'Android') {
      var Intent = plus.android.importClass('android.content.Intent');
      var intent = new Intent(Intent.ACTION_GET_CONTENT);
      intent.addCategory(Intent.CATEGORY_OPENABLE);
      if (mimeTypes) {
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
      } else {
        intent.setType("*/*");
      }
      let _this = pickFile;
      main.onActivityResult = function(requestCode, resultCode, data) {
        if (requestCode == CODE_REQUEST) {
          var uri = data.getData();
          plus.android.importClass(uri);
          var Build = plus.android.importClass('android.os.Build');
          var isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

          var DocumentsContract = plus.android.importClass('android.provider.DocumentsContract');
          // DocumentProvider
          if (isKitKat && DocumentsContract.isDocumentUri(main, uri)) {
            console.log("版本大于 4.4 ");
            // ExternalStorageProvider
            if ("com.android.externalstorage.documents" == uri.getAuthority()) {
              var docId = DocumentsContract.getDocumentId(uri);
              var split = docId.split(":");
              var type = split[0];

              if ("primary" == type) {
                var Environment = plus.android.importClass('android.os.Environment');
                callback(Environment.getExternalStorageDirectory() + "/" + split[1]);
              } else {
                var System = plus.android.importClass('java.lang.System');
                var sdPath = System.getenv("SECONDARY_STORAGE");
                if (sdPath) {
                  callback(sdPath + "/" + split[1]);
                }
              }
            }
            // DownloadsProvider
            else if ("com.android.providers.downloads.documents" == uri.getAuthority()) {
              var id = DocumentsContract.getDocumentId(uri);
              var ContentUris = plus.android.importClass('android.content.ContentUris');
              var contentUri = ContentUris.withAppendedId(
                //    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                Uri.parse("content://downloads/public_downloads"), id);
              callback(_this.getDataColumn(main, contentUri, null, null));
            }
            // MediaProvider
            else if ("com.android.providers.media.documents" == uri.getAuthority()) {
              var docId = DocumentsContract.getDocumentId(uri);
              var split = docId.split(":");
              var type = split[0];

              var MediaStore = plus.android.importClass('android.provider.MediaStore');
              if ("image" == type) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
              } else if ("video" == type) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
              } else if ("audio" == type) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
              }else {
                contentUri = MediaStore.Files.getContentUri("external");
              }
              console.log("版本大于 4.4 ",type);

              var selection = "_id=?";
              var selectionArgs = new Array();
              selectionArgs[0] = split[1];

              callback(_this.getDataColumn(main, contentUri, selection, selectionArgs));
            }
          }
          // MediaStore (and general)
          else if ("content" == uri.getScheme()) {
            callback(_this.getDataColumn(main, uri, null, null));
          }
          // File
          else if ("file" == uri.getScheme()) {
            callback(uri.getPath());
          }
        }
      }
      main.startActivityForResult(intent, CODE_REQUEST);
    }
  },

  getDataColumn:function(main, uri, selection, selectionArgs) {
    plus.android.importClass(main.getContentResolver());
    let cursor = main.getContentResolver().query(uri, ['_data'], selection, selectionArgs, null);
    plus.android.importClass(cursor);
    if (cursor != null && cursor.moveToFirst()) {
      var column_index = cursor.getColumnIndexOrThrow('_data');
      var result = cursor.getString(column_index)
      cursor.close();
      return result;
    }
    return null;
  }
}

module.exports = {
  pickFile: pickFile
}
/* eslint-disable no-new */

猜你喜欢

转载自blog.csdn.net/nicepainkiller/article/details/122533601