6***@qq.com
6***@qq.com
  • 发布:2019-04-19 11:21
  • 更新:2023-11-10 10:30
  • 阅读:14640

uni-app调用Android文件系统

分类:uni-app

最近用 uni-app做多媒体上传功能, 文件选择,视频,图片官方分别有uni.chooseVideo和uni.chooseImage接口,很方便,但是涉及到其他文件类型选择比如音频,就没有现成的接口。 在网上搜索了一圈,终于找到了通过Native.js调用原生文件系统的方法 。 原博客地址:https://www.cnblogs.com/lizhao123/p/9951581.html
我结合了作者的方法,简单的封装为pickFile.js,调用起来很方便。用法很简单,把该文件放到你的项目JS目录下,通过 import {pickFile} from '@/js/common/pickFile.js' 方式引入,然后

pickFile.PickFile(function(audioSrc){  
     console.log(audioSrc)  
    _this.audioSrc = 'file://' + audioSrc;  
    // _this.audioSrc = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/audio/music.mp3'  
    // 这里就会得到 你选择的文件路径。拿到路径后,你可以用uni.uploadFile  进行上传。  
}, 'audio/*');  
//这里第一个参数是 回调函数,第二个是你要选择的文件类 "image/*","audio/*","video/*;image/*"

以下是我修改后的pickFile.js 源码。

var pickFile = {  
    //调用原生文件系统管理器并选取文件获取文件地址  
    PickFile:function(callback, acceptType) { //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 (acceptType) {  
                intent.setType(acceptType);  
            } 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;  
                            }  

                            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  
}  
10 关注 分享
1***@163.com 1***@qq.com damdmen 4***@qq.com 1***@qq.com 忘记我是谁 l***@qq.com callback_cb [已删除] x***@gmail.com

要回复文章请先登录注册

2***@qq.com

2***@qq.com

回复 9***@qq.com :
{"UUID":"Invocation201999930","TYPE":"JSBObject","className":"android.content.Conte...}要反射调用
2023-11-10 10:30
9***@qq.com

9***@qq.com

15:42:06.533 isKitKat, [Boolean] true , [Boolean] false at utils/pickFile.js:28
15:42:06.538 执行content, [Object] {"__UUID__":"Invocation1820315200","__TYPE__":"JSBObject","className":"android.net.Uri$HierarchicalUri"} at utils/pickFile.js:81
15:42:06.578 执行cursor, [Object] {"__UUID__":"Invocation201999930","__TYPE__":"JSBObject","className":"android.content.Conte...} at utils/pickFile.js:103
15:42:06.582 执行column_index, null at utils/pickFile.js:105
15:42:06.582 执行result, null at utils/pickFile.js:108
15:42:06.586 返回媒体的路径, null at pages/zhiwashe/publish.vue:121
到执行到column_index 就返回null了,拿不到uri了。
2023-10-12 15:43
1***@163.com

1***@163.com

存储分区了拿不到数据怎么处理啊?
2023-09-27 10:12
victor_Leem

victor_Leem

回复 [已删除] :
你的可以读取了吗
2023-06-22 10:38
[已删除]

[已删除]

大佬,提示"版本大于 4.4 ",是不可以读取了么
2023-03-29 00:38
callback_cb

callback_cb

回复 5***@qq.com :
https://blog.csdn.net/dongxianfei/article/details/122086235 看这个文章type不为image,video,audio的时候配置

contentUri = MediaStore.Files.getContentUri("external")就行
2023-02-03 17:30
callback_cb

callback_cb

回复 7***@qq.com :
https://blog.csdn.net/dongxianfei/article/details/122086235 看这个文章type不为image,video,audio的时候配置
contentUri = MediaStore.Files.getContentUri("external")就行
2023-02-03 17:29
callback_cb

callback_cb

回复 Nwhoami :
可以上传uni.uploadFile({
filePath: 'file://' + src,
})
2023-02-03 15:58
Nwhoami

Nwhoami

哪位大佬帮一下我,file:///这种路径怎么上传啊
2022-12-30 18:10
Nwhoami

Nwhoami

作者能不能留一下联系方式,我想问一下一些问题
2022-12-30 16:21