Android_磊子
Android_磊子
  • 发布:2017-04-01 18:53
  • 更新:2022-12-14 08:40
  • 阅读:9762

如何通过Native.js进行文件选取

分类:Native.js

5+ API中plus.gallery.pick只能选取图片或是视频文件,那问题来了,其他类型文件如何选取。
此时就该发挥Native.js的强大之处了,如果会安卓原生编程,代码so easy。不会的同学你可以选择找到代码copy,会是百度原生代码实现然后转换为Native.js语法。废话不多说,反正你可以找到很多方式配合5+API完成自己的app。
开吃。。。

window.PickFile = function(callback,acceptType){  
    function ip(obj){  
        plus.android.importClass(obj);  
        return obj;  
    }  
    if(plus.os.name == 'Android' && typeof callback == 'function'){  
        var CODE_REQUEST = 1000;  
        var context = plus.android.runtimeMainActivity();  
        ip(context);  
        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("*/*");  
        }  
        context.onActivityResult = function(requestCode,resultCode,intentData){  
            if(requestCode == CODE_REQUEST){  
                if(intentData){  
                    var uriValue = intentData.getData();  
                    plus.android.importClass(uriValue);  
                    var scheme = uriValue.getScheme();  
                    if(scheme == 'content'){//还需要进行数据库查询,一般图片数据  
                        var cursor = ip(context.getContentResolver()).query(uriValue,['_data'], null, null, null);  
                        if(cursor){  
                            ip(cursor).moveToFirst();  
                            var columnIndex = cursor.getColumnIndex('_data');  
                            picturePath = cursor.getString(columnIndex);  
                            cursor.close();  
                            callback(picturePath);//返回文件路径  
                        }  
                    }else if(scheme == 'file'){  
                        callback(uriValue.getPath());//返回文件路径  
                    }  
                }else{  
                    callback(null);  
                }  
            }  
        }  
        context.startActivityForResult(intent,CODE_REQUEST);  
    }  
}
4 关注 分享
Trust x***@qq.com BoredApe brush

要回复文章请先登录注册

xiazhiweizhi

xiazhiweizhi

请问一下怎么用这种方法获取外接U盘里面的文件路径啊,我试了一下获取不到
2019-01-30 11:17
7***@qq.com

7***@qq.com

我想问下,nactive.js调用原生的类,那么这个类的文件应该放在哪里?还是只能调用原生的api,不能调用原生自己写的类?
2018-07-18 12:42
cxian

cxian

mark,谢谢
2018-02-27 17:23
android_yang

android_yang

回复 Android_磊子 :
window.PickFile = function(callback, acceptType) {
var CODE_REQUEST = 1000;
var main = plus.android.runtimeMainActivity();
if(plus.os.name == 'Android' && typeof callback == 'function') {
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("*/*");
}
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(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(getDataColumn(main, contentUri, selection, selectionArgs));
}
}
// MediaStore (and general)
else if("content" == uri.getScheme()) {
callback(getDataColumn(main, uri, null, null));
}
// File
else if("file" == uri.getScheme()) {
callback(uri.getPath());
}
}
}
main.startActivityForResult(intent, CODE_REQUEST);
}
}

function getDataColumn(main, uri, selection, selectionArgs) {
plus.android.importClass(main.getContentResolver());
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;
}
2017-06-19 15:34
Android_磊子

Android_磊子 (作者)

回复 android_yang :
我测试过android4.4没有问题,不过是小米rom。
如果你那有更兼容4.4的代码不妨贴出来,大家共同学习学习。
2017-06-19 14:37
android_yang

android_yang

回复 android_yang :
手机系统版本号:EMUI系统3.0 ,另外 window.PickFile方法定义是在 绑定tap事件之前。
2017-06-18 18:51
android_yang

android_yang

回复 Android_磊子 :
<button id="sys-path">getPath</button>
document.getElementById("sys-path").addEventListener('tap',function(e){
PickFile(function(path){
console.log(path);
});
},false);
window.PickFile直接copy文章中的代码。
在android4.4 的手机上返回path 的值为null
机型:huawei G750-T01 自己刷了一个rom
android版本:4.4.2 手机系统版本3.0

网上查找资料发现是4.4以后的uri格式发生变化,用你代码中的获取方式已经失效。根据网上提供的android4.4通过uri获取路径的原生方法,再结合native.js我就能成功获取到path,而不是null.
2017-06-18 18:48
Android_磊子

Android_磊子 (作者)

回复 android_yang :
亲,告诉我你什么机型懵逼了。
2017-06-15 19:09
android_yang

android_yang

android4.4以上手机,这个方法直接懵逼
2017-06-15 18:03
x***@qq.com

x***@qq.com

很有用,刚头痛这个问题
2017-05-01 12:19