博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在Flutter工程中添加Android AAR文件
阅读量:6235 次
发布时间:2019-06-22

本文共 5136 字,大约阅读时间需要 17 分钟。

hot3.png

为了方便Android和iOS移动开发,Google推出了Flutter。Flutter和Xamarin,Cordova的概念相似 - 使用一种编程语言为多个平台开发。Flutter使用Dart。不过当使用第三方SDK的时候,Flutter依然需要用到Java或者Objective-C来写后台代码。

添加Android AAR

下载。

选择一个aar文件,我这里用。

把目录flutter/examples/hello_services/android/导入到Android Studio中。

点击File > New > New Module,选择Import .JAR/.AAR Package,添加AAR文件。打开工程属性,添加依赖模块就可以了。

flutter android aar

Flutter UI与Java后台

打开AndroidManifest.xml 添加权限。

使用Java代码调用aar中的接口,然后把结果通过消息的形式发送到Flutter UI。

private String onGetBarcode(String json) {        String filename;        try {            JSONObject message = new JSONObject(json);            filename = message.getString("filename");        } catch (JSONException e) {            Log.e(TAG, "JSON exception", e);            return null;        }         String locationProvider;        String barcodeResult = "No barcode detected";        File file = new File(filename);        if (!file.exists()) {            barcodeResult = "No file exists: " + file.toString();            Toast.makeText(BarcodeReaderActivity.this, barcodeResult, Toast.LENGTH_LONG).show();             return null;        }        else {            Bitmap bitmap = BitmapFactory.decodeFile(file.toString());            BarcodeReader reader = new BarcodeReader("license");            ReadResult result = reader.readSingle(bitmap, Barcode.QR_CODE);            Barcode[] all = result.barcodes;            if (all != null && all.length == 1) {                barcodeResult = all[0].displayValue;            }            else {                barcodeResult = "no barcode found: " + file.toString();            }             bitmap.recycle();         }         JSONObject reply = new JSONObject();        try {            if (barcodeResult != null) {              reply.put("result", barcodeResult);            } else {              reply.put("result", "No barcode detected");            }        } catch (JSONException e) {            Log.e(TAG, "JSON exception", e);            return null;        }         return reply.toString();    }

创建Flutter Input, Button以及Text widgets:

@override  Widget build(BuildContext context) {    if (_isExisted) {      return new Material(          child: new Center(              child: new Column(                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,                  children: 
[ new Text('Barcode Reader'), new Input( labelText: 'Please input the image path', value: new InputValue(text: _filename), onChanged: onTextChanged, autofocus: true, ), new Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children:
[ new RaisedButton( child: new Text('Read'), onPressed: _getBarcode ), new RaisedButton( child: new Text('Reset'), onPressed: _resetResult ), ] ), new Image.file(new File(_filename)), new Text('$_result'), ] ) ) ); } else { return new Material( child: new Center( child: new Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children:
[ new Text('Barcode Reader'), new Input( labelText: 'Please input the image path', onChanged: onTextChanged, autofocus: true, ), new Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children:
[ new RaisedButton( child: new Text('Read'), onPressed: _getBarcode ), new RaisedButton( child: new Text('Reset'), onPressed: _resetResult ), ] ), new Text('$_result'), ] ) ) ); } } Future
_readBarcode() async { final Map
message =
{'filename':_filename}; final Map
reply = await HostMessages.sendJSON('getBarcode', message); // If the widget was removed from the tree while the message was in flight, // we want to discard the reply rather than calling setState to update our // non-existent appearance. if (!mounted) return; setState(() { _result = reply['result'].toString(); }); }

运行程序:

flutter barcode reader

参考资料

  • .

安装包问题

Flutter工程编译之后,会把libsky_shell.so打包到APK的armeabi-v7a目录中。我使用的aar文件还包含了arm64-v8a,编译之后会发现arm64-v8a目录中没有libsky_shell.so。这个时候如果APK安装到64位CPU的安卓设备上,会因为找不到libsky_shell.so导致程序崩溃无法启动。

flutter armeabi-v7a

flutter arm64-v8a

解决的方法就是只保留armeabi-v7a的动态连接库,其余都删掉。

源码

 

转载于:https://my.oschina.net/yushulx/blog/830022

你可能感兴趣的文章
Code First 中 Fluent API 的作用
查看>>
【BZOJ3700】发展城市 [LCA][RMQ]
查看>>
online_judge_1049
查看>>
iOS程序main函数之前发生了什么
查看>>
SharePoint各个版本的Service Application
查看>>
win7配置flutter报错 运行flutter doctor报错及解决方法
查看>>
React-Native 之 GD (一)目录结构与第三方框架使用与主题框架搭建
查看>>
h5+ 管理设备信息
查看>>
Python安装及配置
查看>>
SpringBoot的日志
查看>>
HTTP请求
查看>>
【POJ2001】Shortest Prefixes
查看>>
设置ubuntu的root密码
查看>>
ucontext实现的用户级多线程框架
查看>>
微信公开课2019-张小龙
查看>>
socket网络编程
查看>>
jq 操作radio,设置选中、获取选中值
查看>>
[POI2007]堆积木Klo
查看>>
查找基本方法小结
查看>>
软件开发:对于产品经理需要哪些日常工作吗
查看>>