Flutter Plugin 交互

本片利用Flutter Plugin 调用原生Android的相册墙的功能。 

现有的和相机有关的库 有 image_picker  和camera

不过image_picker用起来像是普通的调用Android自带的拍照和相册(单选)功能,而camera好像是拍照功能(不太了解)。这些都不够炫酷,不如让我们来自己写插件。

最终效果是让Flutter实现Android的matisse功能,一款强大的相册墙,我自己开发的Android也在用matisse

下面开始正题 ,放图


1.我们从Flutter中调用Android接口

2.Android调用matisse,选好图片之后

3.在ActivityResult回调中得到图片数据

4.再从Android发送数据到Flutter的接口(并不用result.success,因为是异步,只能我们单独再次发给它)

5.在Flutter中设置Stream实现监听



首先你得进AS,开启一个Plugin项目,对比着看下文,粘贴复制什么的,so easy。

implementation'com.zhihu.android:matisse:0.5.2-beta2'

implementation'com.github.bumptech.glide:glide:4.8.0'

implementation'io.reactivex.rxjava2:rxandroid:2.0.1'

implementation'io.reactivex.rxjava2:rxjava:2.0.5'

implementation'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"

Android用到的库和权限

我们从Flutter中调用Android接口:

platformVersion =await FlutterPluginShowImage.showImage;

FlutterPluginShowImage是插件的Flutter类,showImage是其中的方法


这里是 showImage方法

static Futureget showImage async{

await _channel.invokeMethod('showImage');

}

相当于发送 msg.what='showImage' 消息的Hanlder,

@Override

public void onMethodCall(MethodCall call,final Result result) {

if (call.method.equals("getPlatformVersion")) {

result.success("Android " + android.os.Build.VERSION.RELEASE);

}else if(call.method.equals("showImage")){

Util.showImage(mContext);

}else {

result.notImplemented();

}

}

我把方法体封装在Util中了,至于为什么,可能是因为寂寞吧

public static void showImage(final Activity activity){

RxPermissions rxPermissions =new RxPermissions(activity);

rxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE)

.subscribe(new Consumer() {

@Override

public void accept(Permission permission)throws Exception {

if (permission.granted) {

openAlbum(activity);

return;

}

if (permission.shouldShowRequestPermissionRationale) {

Log.d(TAG,"intoPics: 用户不给权限");

return;

}

Log.d(TAG,"intoPics: ");

}

});

}

如果用户给读写的权限 ,用到了RXPermission,rxJava什么的,不会的可以无视,反正就是申请权限,并调用openAlbum(activity);

public static void openAlbum(Activity activity){

Matisse.from(activity)

.choose(MimeType.ofAll())//照片视频全部显示

            .countable(true)//显示选择的数量

            .maxSelectable(3)// 图片选择的最多数量

            .gridExpectedSize(getPicWidth(activity) /3 -5)//图片显示在列表中的大小

            .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)

.thumbnailScale(0.3f)// 缩略图的比例

            .imageEngine(new MyGlideEngine())// 使用的图片加载引擎

            .theme(R.style.Matisse_Zhihu)//主题

            .capture(false)//是否提供拍照功能

            .forResult(23);// 设置作为标记的请求码

}


以上就是调用matisse的打开相册墙的代码。其中的activity或者context的数据都可以从

registrar获取,  eg : mContext=registrar.activity();//registrar是自动生成方法的参数

registrar.addActivityResultListener(new PluginRegistry.ActivityResultListener() {

@Override

  public boolean onActivityResult(int requestCode,int resultCode, Intent data) {

if (requestCode ==23 && resultCode ==RESULT_OK) {//与请求码对应,测试随便取了个值

List <Uri>mSelected = Matisse.obtainResult(data);

List <String>uriList=new ArrayList<>();

for(Uri uri :mSelected){

Log.d(TAG,"onActivityResult: uri="+uri+"getPath"+uri.toString());

uriList.add(uri.toString());

};

channel.invokeMethod("AndroidToPics",uriList);

}

return true;

}

});


回调ActivityResult也是要用到registrar,Uri似乎不在参数传递范围内,所以用List<String>重新包装。

channel.invokeMethod("AndroidToPics",uriList);就是向发送msg.what的“AndroidToPics”的消息,

uriList就相当于msg.obj;

_channel.setMethodCallHandler(_handler);

在Flutter中设置这个回调,

static Future_handler(MethodCall methodCall) {

if (methodCall.method=="AndroidToPics") {

var list=  methodCall.arguments;

_responseController.add(list);//

}

return Future.value(true);

}


如果这个地方不懂的话,就去研究一下Stream,这里可以当做一个简单的监听事件,当add之后,listener就有了响应

static StreamController_responseController = new StreamController.broadcast(); 

static Streamget get response =>_responseController.stream;

Flutter中声明一个StreamController,加一个response 方法让main.dart获取


FlutterPluginShowImage.response.listen((data) {

print(“success”);

print(data);

});

获取到了Stream,调用Stream.listener方法在main.dart中设置监听,当你add之后,这个地方便有了回应。你的数据信息便出来了。


activity是从Android获取的,下面两个是从Flutter获取的。数据有了,剩下的你懂得。

至此,完成任务.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,527评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,687评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,640评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,957评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,682评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,011评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,009评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,183评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,714评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,435评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,665评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,148评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,838评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,251评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,588评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,379评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,627评论 2 380

推荐阅读更多精彩内容