-
down下来的工程运行正常,放到自己的工程里就不不正常了,比如
qrscan
和pick_image
flutter工程所添加在pubspec.yaml
的依赖,要么是dart语言所编写的插件,要么就是和原生交互的插件;像qrscan和pick_image就是和原生交互的插件;碰到一个问题就是,添加依赖成功后,执行功能时,从logcat中,发现日志明显是有结果或者走到一半就没有下文了,也不报错…
进入对应插件库里,你会发现,像前面两者的Plugin类中都调用了activity.startActivityForResult(intent, REQUEST_IMAGE);
方法,那么就意味着会有onActivityResult(int requestCode, int resultCode, Intent data)
方法。添加的插件都是通过GeneratedPluginRegistrant.registerWith(this);
依附到MainActivity,意思是说,如果MainActivity覆写了onActivityResult方法,那么他们在Plugin类中添加的onActivityResult将不会被触发。
解决方法:1.不要在MainActivity覆写了onActivityResult方法;2.把插件直接copy下来放到工程里,把Plugin类中的onActivityResult方法里的内容迁移到MainActivity中的onActivityResult方法中,即可呈现。 -
获取图片ID,得到的是Uri
content://media/...
,那么怎么获取绝对路径,进行取图片上传呢?
首先呢,flutter本身不能够直接从Uri获取图片路径,起码,目前没有。所以呢,我选择和Android原生交互。
Android原生:
private static final String URI_PATH_CHANNEL = "acesmart.flutter.io/uritopath";
//方法
new MethodChannel(getFlutterView(), URI_PATH_CHANNEL).setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
MainActivity.this.result = result;
String count = methodCall.arguments();
System.out.println("uri:"+count);
if (count !=null){
Uri uri=Uri.parse(count);
if (methodCall.method.equals("getUriPath")) {
getFilePath(uri);
} else {
result.notImplemented();
}
}
}
}
);
private void getFilePath(Uri uri) {
String filePathByUri = FileUtils.getFilePathByUri(MainActivity.this, uri);
System.out.println("getFilePath:"+filePathByUri);
result.success(filePathByUri);
}
//其中,FileUtils.getFilePathByUri(MainActivity.this, uri);方法是
// 以 content:// 开头的,比如 content://media/extenral/images/media/17766
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && uri.toString().startsWith("content://media")) {
Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (columnIndex > -1) {
path = cursor.getString(columnIndex);
}
}
cursor.close();
}
return path;
}
flutter端:
static const MethodChannel _methodChannel = MethodChannel('acesmart.flutter.io/uritopath');
//方法
final String uriPath = await _methodChannel.invokeMethod("getUriPath", “你的uri”);
如果,这块不懂的话,可以参考Flutter与原生交互
- the request was rejected because no multipart boundary was found
在做dio头像上传时,根据后台contextType
类型,写了"Content-Type: multipart/form-data"
,上面报的错算是springMVC的坑,意思是说,这个接口不用填写这个类型,去掉即可。