最近工作中遇到个需求,要求在用cordova进行混合开发的APP中打开文件选择器,选择文件并将路径回传给JS页面。上网找了一通开源的解决方案,有那么几个插件,但有好几个都不能用了。经过试错最后选择了com.ourcodeworld.plugins.filebrowser
这个插件,但是即使如此,这个插件仍然需要进行改造才可以用。
这个插件在我使用的SDK 26,Cordova7.0.0的环境下,会出现DialogShowPicker
这个Activity无法将数据回传到父级CordovaPlugin,导致父级CordovaPlugin的onActivityResult
方法不执行。
改造后直接在DialogShowPicker
的onActivityResult
方法中调用JS回调,这样就可以绕过这个问题。
首先创建一个新Cordova工具类,用于保存JS回调context
import org.apache.cordova.CallbackContext;
public class CordovaUtil {
private CallbackContext callbackContext;
private static class CordovaUtilHolder{
public final static CordovaUtil INSTANCE=new CordovaUtil();
}
private CordovaUtil() {
}
public static final CordovaUtil getInstance() {
return CordovaUtilHolder.INSTANCE;
}
public CallbackContext getCallbackContext() {
return callbackContext;
}
public void setCallbackContext(CallbackContext callbackContext) {
this.callbackContext = callbackContext;
}
}
随后在Filebrowser
类(Cordova插件)中的execute
方法中,添加
CordovaUtil.getInstance().setCallbackContext(callbackContext);
保存callbackContext
最后,在DialogShowPicker
类中的onActivityResult
方法的最后,执行setResult
方法的位置,添加
CordovaUtil.getInstance().getCallbackContext().success(jsonArray.toString());
测试相关功能,可以发现可以在js回调中取到文件名了
感谢http://www.jufanshare.com/的@大BUG,本文使用了他的部分代码