防采集标记:亢少军老师的课程和资料
以下说明了怎么调用平台特定的接口来取得并显示当前的电池电量。通过单独的一个的平台消息,使用 Android BatteryManager
接口,和 iOS device.batteryLevel
接口。
注意:这个示例完整可运行的代码在这儿/examples/platform_channel/
,该版本使用 Java 开发 Android,Objective-C 开发的 iOS。iOS 的 Swift 版本请参阅/examples/platform_channel_swift/
.
步骤 1: 创建新工程
开始创建新工程:
- 在终端运行:
flutter create batterylevel
默认模板支持使用 Java 编写 Android,Objective-C 编写 iOS。想使用Kotlin 或者 Swift,使用 -i
与/或 -a
标记;
- 终端运行:
flutter create -i swift -a kotlin batterylevel
步骤 2: 创建 Flutter 平台客户端
应用的 State
类持有当前应用的状态。我们需要扩展它来持有当前的电池状态。
首先,我们构造通道。我们使用 MethodChannel
编写单独的平台方法并返回电池变量。
通道的客户端和宿主端通过在构造器中传入通道名来连接。所有的通道名在一个应用中必须唯一;我们推荐使用唯一的’域名前缀’给通道名加前缀,如 samples.flutter.io/battery
。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
...
class _MyHomePageState extends State<MyHomePage> {
static const platform = const MethodChannel('samples.flutter.io/battery');
// Get battery level.
}
接下来,我们调用方法通道上的方法,指定具体方法。通过字符串标识符 getBatteryLevel
调用。调用也许会失败 – 例如如果平台不支持平台接口(比如运行在模拟器上),所以我们用语句块来包装invokeMethod
调用。我们拿到返回结果在 setState
里面用 _batteryLevel
更新用户界面状态。
// Get battery level.
String _batteryLevel = 'Unknown battery level.';
Future<Null> _getBatteryLevel() async {
String batteryLevel;
try {
final int result = await platform.invokeMethod('getBatteryLevel');
batteryLevel = 'Battery level at $result % .';
} on PlatformException catch (e) {
batteryLevel = "Failed to get battery level: '${e.message}'.";
}
setState(() {
_batteryLevel = batteryLevel;
});
}
最后,我们把模板中的 build
方法替换为一个小的用户界面用字符串显示电池状态,还有一个按钮来刷新这个值。
@override
Widget build(BuildContext context) {
return new Material(
child: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
new RaisedButton(
child: new Text('Get Battery Level'),
onPressed: _getBatteryLevel,
),
new Text(_batteryLevel),
],
),
),
);
}
步骤 3a: 用 Java 添加 Android 平台特定实现
注意: 以下步骤使用 Java。如果你更喜欢 Kotlin,跳到步骤3b。
在 Android Studio 中打开 Android 宿主端:
-
打开 Android Studio。
-
选择菜单项 ‘文件 > 打开…’。
-
导航到 Flutter 应用程序的目录,选择它里面的
android
文件夹。点击确定。 -
在工程视图下打开位于
java
文件夹的MainActivity.java
文件。
下一步,创建 MethodChannel
并在 onCreate
方法中设置 MethodCallHandler
。确保使用了和 Flutter 客户端同样的通道名。
import io.flutter.app.FlutterActivity;
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 = "samples.flutter.io/battery";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
// TODO
}
});
}
}
下一步,我们添加真正的 Android Java 代码,使用 Android 电池接口取到电池电量。这些代码和你编写原生的 Android 应用一样。
首先,在文件顶部添加必要的应用:
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
在 activity 类中 onCreate
的方法下面紧接着添加一个新的方法:
private int getBatteryLevel() {
int batteryLevel = -1;
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
BatteryManager batt