原生提供功能,Dart module 通过 method channel 异步调用
1,安卓部分
手动注册
Flutter 官方的做法,就是自动注册插件,
很方便
手动注册,体现本文的不同
插件是 AudioRecorderPlugin
class MainActivity: FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
flutterEngine!!.plugins.add(AudioRecorderPlugin())
}
}
安卓和 Dart 的通讯
主要是消息回调
下文依次是,
- 开始录音
- 结束录音
- 正在录音
- 是否有录音权限
注意,这里的录音权限包含两个,麦克风的权限,和存储权限
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
switch (call.method) {
case "start":
Log.d(LOG_TAG, "Start");
Log.d(LOG_TAG, "11111____");
String path = call.argument("path");
mExtension = call.argument("extension");
startTime = Calendar.getInstance().getTime();
if (path != null) {
mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + path;
} else {
Log.d(LOG_TAG, "11111____222");
String fileName = String.valueOf(startTime.getTime());
mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + fileName + mExtension;
}
Log.d(LOG_TAG, mFilePath);
startRecording();
isRecording = true;
result.success(null);
break;
case "stop":
Log.d(LOG_TAG, "Stop");
stopRecording();
long duration = Calendar.getInstance().getTime().getTime() - startTime.getTime();
Log.d(LOG_TAG, "Duration : " + String.valueOf(duration));
isRecording = false;
HashMap<String, Object> recordingResult = new HashMap<>();
recordingResult.put("duration", duration);
recordingResult.put("path", mFilePath);
recordingResult.put("audioOutputFormat", mExtension);
result.success(recordingResult);
break;
case "isRecording":
Log.d(LOG_TAG, "Get isRecording");
result.success(isRecording);
break;
case "hasPermissions":
Log.d(LOG_TAG, "Get hasPermissions");
Context context = _fl