com.android.tools.build:gradle:4.2.1
compileSdkVersion 30
flutter 2.2.2
Android Studio 4.2.2
第一步,Android端原生代码;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
public class MainActivity extends FlutterActivity {
// 通道名称
private static final String CHANNEL_NAME = "com.example.flutter.io/battery";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
// 1.通道方法的初始化
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL_NAME).setMethodCallHandler(
new MethodCallHandler() {
// 2.通道的回调
@Override
public void onMethodCall(MethodCall call, Result result) {
// 回调获取变量的方法
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}
}
});
}
// 3.获取电量的原生方法
private int getBatteryLevel() {
int batteryLevel = -1;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
} else {
Intent intent = new ContextWrapper(getApplicationContext()).
registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
batteryLevel = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /
intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
}
return batteryLevel;
}
}
第二步,Flutter 框架中的调用;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: '电量获取示例'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// - 应用的Flutter部分通过平台通道(platform channel)将消息发送到其应用程序的所在的宿主(iOS或Android)应用(原生应用)。
// - 宿主监听平台通道,并接收该消息。然后它会调用该平台的API,并将响应发送回客户端,即应用程序的Flutter部分。
// Flutter应用程序实际上包括原生代码和Flutter代码两部分
// 通过通道名称调用原生组件,通道名称和原生组件的通道名称必须保持一致,
// 1.初始化通道
static const platform = const MethodChannel('com.example.flutter.io/battery');
// 默认电量
String _batteryLevel = '还未获取:';
// 获取电池电量的异步方法
Future<Null> _getBatteryLevel() async {
String batteryLevel;
try {
// 2.通过通道调用原生方法
final int result = await platform.invokeMethod('getBatteryLevel');
batteryLevel = ' $result % .';
} on PlatformException catch (e) {
batteryLevel = "获取电池电量失败: '${e.message}'.";
}
setState(() {
_batteryLevel = batteryLevel;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'当前电量为:$_batteryLevel'
),
ElevatedButton(
onPressed: _getBatteryLevel,
child: Text("获取电量"),
),
],
),
),
);
}
}
第三步:测试;
最后总结
这个Demo总体来说,还是非常简单的,没有用到额外的库;在平台原生代码里,flutter已经帮我们封装好了平台通道,我们只需调用即可。从第一张思维导图中可以看出,第三方插件的调用,还是脱离不了原生的对接。写好了这个简易的demo,第三方对接又近了一小步。
网友评论